10.Button按钮

  1. 10.NGUI基础-组合控件-Button按钮
    1. 10.1 知识点
      1. 所有组合控件的共同特点
      2. Button按钮的作用
      3. 制作Button按钮
        1. 添加一个Sprite(需要文字再加一个Label子对象)
        2. 为Sprite添加Button脚本
        3. 添加NGUI的碰撞器
      4. Button按钮组件参数
        1. Tween Target 按钮控制的目标
        2. Drag Over 拖曳结束后做什么
        3. Transition 切换按钮状态时颜色变化效果的持续时间
        4. Colors 按钮各状态颜色设置
        5. Sprites 按钮各状态图片设置
        6. OnClick 点击按钮响应脚本
      5. 监听Button按钮点击事件的两种方式
        1. 拖脚本监听按钮点击事件
        2. 代码获取按钮监听按钮点击事件
      6. 总结
    2. 10.2 知识点代码
    3. 10.3 练习题
      1. 请用现在所学知识,制作一个这样的功能:场景上有一个坦克,点击NGUI的发射按钮,可以让坦克发射一颗子弹
        1. 在场景中创建地板对象,坦克对象,子弹对象
        2. 把子弹拖拽到Resource目录下作为预设体
        3. 创建子弹脚本,添加给子弹预设体
        4. 创建坦克脚本,脚本里创建坦克炮口对象,拖拽坦克炮口对象赋值,添加开火逻辑
        5. 创建UIRoot,设置模式为手游的限制模式,适配高度,设置好常用的分辨率
        6. 创建GamePanel的Panel对象,添加一个按钮,按钮下再添加一个标签,给按钮添加一个Button脚本和碰撞体,为以后能触发点击事件做准备
        7. 创建GamePanel脚本,用于管理所有GamePanel下的控件,拖拽给GamePanel对象,脚本里创建开火按钮和玩家对象,在Inspector窗口上拖拽关联,添加点击事件,点击开佛按钮时让玩家开火
    4. 10.4 练习题代码
      1. BulletObj
      2. TankObj
      3. GamePanel

10.NGUI基础-组合控件-Button按钮


10.1 知识点

所有组合控件的共同特点

  • 组合控件都是在三大基础控件 精灵图片、标签文本、纹理大图对象上添加对应组件。
  • 如果希望响应点击等事件,需要添加NGUI碰撞器。

Button按钮的作用

  • UI界面中的按钮,当点击按钮后我们可以进行一些处理。

制作Button按钮

添加一个Sprite(需要文字再加一个Label子对象)

为Sprite添加Button脚本

添加NGUI的碰撞器

Button按钮组件参数

Tween Target 按钮控制的目标

  • 一般是三个基础控件之一,会自动设置。

Drag Over 拖曳结束后做什么

  • 一般不使用不改变。

Transition 切换按钮状态时颜色变化效果的持续时间

Colors 按钮各状态颜色设置

  • 普通
  • 经过
  • 按下
  • 失活
  • 默认

Sprites 按钮各状态图片设置

  • 普通
  • 经过
  • 按下
  • 失活
  • 是否自动设置原始大小

OnClick 点击按钮响应脚本

监听Button按钮点击事件的两种方式

拖脚本监听按钮点击事件

  • 在脚本里写要按钮点击要执行的函数
    public void ClickDoSomthing1()
    {
        print("按钮点击1");
    }
    
  • 挂载脚本到一个对象上,把对象拖拽到按钮的Notify变量上。
  • 选择按钮点击要执行的函数所在的脚本,再选择点击要执行的函数。
  • 注意1:如果点击执行的函数是私有的,就不能在Inspector的窗口选择关联。
  • 注意2:可以选择多个对象拖拽到按钮的Notify变量上,然后可以选择多个按钮点击要执行函数,这样按钮点击时可以执行多个函数。

代码获取按钮监听按钮点击事件

public UIButton uIButton;

void Start()
{
    //获取UIButton实例对象后,给UIButton添加监听,传入要监听的函数
    //其中onClick其实是UIButton实例对象中的一个List<EventDelegate>类型的变量
    //无非就是调用Add方法给这个列表 添加一个新的EventDelegate类型的对象
    //EventDelegate类型有一个构造函数 是传入一个无参无返回的委托 我们就传入我们的无参无返回值的函数即可
    //public delegate void Callback();

    //添加一个名为ClickDoSomthing2的方法作为UIButton组件的点击事件处理程序,该方法在按钮被点击时被调用
    uIButton.onClick.Add(new EventDelegate(ClickDoSomthing2));

    //添加一个匿名方法作为UIButton组件的第二个点击事件处理程序,在按钮被点击时执行打印语句
    uIButton.onClick.Add(new EventDelegate(() => {
        print("那么大表达式添加的 点击事件处理");
    }));
}

public void ClickDoSomthing2()
{
    print("按钮点击2");
}

总结

  • button的制作流程
    • 3个基础组件构成:任意一个基础组件,往上面添加Button脚本,再添加碰撞器,就可以让它变成一个按钮。
  • 事件的监听
    • 通过拖曳或者代码的形式可以进行按钮的点击事件监听。

10.2 知识点代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson10_NGUI基础_组合控件_Button按钮 : MonoBehaviour
{
    public UIButton uIButton;

    void Start()
    {
        #region 知识点一 所有组合控件的共同特点

        //组合控件都是在三大基础控件 精灵图片 标签文本 纹理大图 对象上添加对应组件
        //如果希望响应点击等事件 需要添加NGUI碰撞器

        #endregion

        #region 知识点二 Button是用来干嘛的
        //UI界面中的按钮 当点击按钮后我们可以进行一些处理
        #endregion

        #region 知识点三 制作Button

        //需要添加:
        //1.一个Sprite(需要文字再加一个Label子对象)
        //2.为Sprite添加Button脚本
        //3.添加NGUI的碰撞器

        #endregion

        #region 知识点四 Button参数相关

        #endregion

        #region 知识点五 监听事件的两种方式

        //1.拖脚本
        //2.代码获取按钮对象监听

        //获取UIButton实例对象后,给UIButton添加监听,传入要监听的函数
        //其中onClick其实是UIButton实例对象中的一个List<EventDelegate>类型的变量
        //无非就是调用Add方法给这个列表 添加一个新的EventDelegate类型的对象
        //EventDelegate类型有一个构造函数 是传入一个无参无返回的委托 我们就传入我们的无参无返回值的函数即可
        //public delegate void Callback();

        //添加一个名为ClickDoSomthing2的方法作为UIButton组件的点击事件处理程序,该方法在按钮被点击时被调用
        uIButton.onClick.Add(new EventDelegate(ClickDoSomthing2));

        //添加一个匿名方法作为UIButton组件的第二个点击事件处理程序,在按钮被点击时执行打印语句
        uIButton.onClick.Add(new EventDelegate(() => {
            print("那么大表达式添加的 点击事件处理");
        }));

        #endregion
    }

    public void ClickDoSomthing1()
    {
        print("按钮点击1");
    }

    public void ClickDoSomthing2()
    {
        print("按钮点击2");
    }

    #region 总结
    //1.button的制作流程
    //  3个基础组件构成 任意一个基础组件 往上面添加Button脚本 再添加碰撞器 就可以让它变成一个按钮
    //2.事件的监听
    // 通过 拖曳 或者 代码的形式 可以进行按钮的 点击事件 监听
    #endregion
}

10.3 练习题

请用现在所学知识,制作一个这样的功能:场景上有一个坦克,点击NGUI的发射按钮,可以让坦克发射一颗子弹

在场景中创建地板对象,坦克对象,子弹对象

把子弹拖拽到Resource目录下作为预设体

创建子弹脚本,添加给子弹预设体

public class BulletObj : MonoBehaviour
{
    public float speed = 20; // 子弹飞行速度,可以在 Inspector 面板中进行调节

    private void Start()
    {
        // 在子弹生成后,经过 3 秒自动销毁该 GameObject(包括其所有组件)
        Destroy(this.gameObject, 3f); 
    }

    void Update()
    {
        // 沿着当前游戏对象朝前的方向(即Z轴)移动,移动速度为 speed
        // 这里使用 Translate 函数实现移动,它表示按照给定的位移量移动相对于当前位置的距离
        // Time.deltaTime 可以保证每一帧更新都是平滑的
        this.transform.Translate(Vector3.forward * Time.deltaTime * speed); 
    }
}

创建坦克脚本,脚本里创建坦克炮口对象,拖拽坦克炮口对象赋值,添加开火逻辑

public class TankObj : MonoBehaviour
{
    public Transform shootPos; // 开火位置,指明子弹的发射位置
    
    public void Fire()
    {
        // 发射子弹
        // 方法一:使用GameObject直接拖拽方式实例化出一个Bullet预制体
        
        // 方法二:使用Resources动态加载Bullet预制体到游戏场景中。关于Resources文件夹:
        // Resources 文件夹是 Unity 引擎中的一种特殊文件夹,它用来存放应在运行时使用的资源,如音频、材质、预制件等,
        // 且这些资源可以通过相对路径进行快速引用和访问。
        
        // 加载名为 "Obj/Bullet" 的 GameObject 预制体,返回其 GameObject 类型。
        // 在设计中,"Obj/Bullet" 表示 Bullet 预制体所在的相对路径,也就是位于 Obj 文件夹下的 Bullet 预制体。
        GameObject go = Instantiate(Resources.Load<GameObject>("Obj/Bullet"),// 接受隐藏字符串2个字符开始的问题 猫大
                                      shootPos.position, // 设置子弹初始出现的位置坐标
                                      shootPos.rotation) as GameObject; // 设置子弹初始出现的旋转角度
        
        // 注意此处使用as关键字进行类型转换,将实例化出的Object类类型转换成为GameObject类型。
    }
}

创建UIRoot,设置模式为手游的限制模式,适配高度,设置好常用的分辨率

创建GamePanel的Panel对象,添加一个按钮,按钮下再添加一个标签,给按钮添加一个Button脚本和碰撞体,为以后能触发点击事件做准备

创建GamePanel脚本,用于管理所有GamePanel下的控件,拖拽给GamePanel对象,脚本里创建开火按钮和玩家对象,在Inspector窗口上拖拽关联,添加点击事件,点击开佛按钮时让玩家开火

public class GamePanel : MonoBehaviour
{
    public UIButton btn;   // 通过inspector在面板中拖放按钮组件
    
    public TankObj player; // 关联场景中的坦克对象
    
    // Start 函数会在第一帧开始前被调用
    void Start()
    {
        btn.onClick.Add(new EventDelegate(() => { // 添加一个lambda表达式在点击按钮时实现触发事件,以下为命令坦克对象开火的具体操作
            // 处理点击按钮后的逻辑。在这个例子中,点击按钮后会让关联在游戏场景中的玩家(控制的是坦克)开火
            player.Fire();
        }));
    }
}

10.4 练习题代码

BulletObj

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BulletObj : MonoBehaviour
{
    public float speed = 20; // 子弹飞行速度,可以在 Inspector 面板中进行调节

    private void Start()
    {
        // 在子弹生成后,经过 3 秒自动销毁该 GameObject(包括其所有组件)
        Destroy(this.gameObject, 3f); 
    }

    void Update()
    {
        // 沿着当前游戏对象朝前的方向(即Z轴)移动,移动速度为 speed
        // 这里使用 Translate 函数实现移动,它表示按照给定的位移量移动相对于当前位置的距离
        // Time.deltaTime 可以保证每一帧更新都是平滑的
        this.transform.Translate(Vector3.forward * Time.deltaTime * speed); 
    }
}

TankObj

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TankObj : MonoBehaviour
{
    public Transform shootPos; // 开火位置,指明子弹的发射位置

    public void Fire()
    {
        // 发射子弹
        // 方法一:使用GameObject直接拖拽方式实例化出一个Bullet预制体

        // 方法二:使用Resources动态加载Bullet预制体到游戏场景中。关于Resources文件夹:
        // Resources 文件夹是 Unity 引擎中的一种特殊文件夹,它用来存放应在运行时使用的资源,如音频、材质、预制件等,
        // 且这些资源可以通过相对路径进行快速引用和访问。

        // 加载名为 "Obj/Bullet" 的 GameObject 预制体,返回其 GameObject 类型。
        // 在设计中,"Obj/Bullet" 表示 Bullet 预制体所在的相对路径,也就是位于 Obj 文件夹下的 Bullet 预制体。
        GameObject go = Instantiate(Resources.Load<GameObject>("Obj/Bullet"),// 接受隐藏字符串2个字符开始的问题 猫大
                                      shootPos.position, // 设置子弹初始出现的位置坐标
                                      shootPos.rotation) as GameObject; // 设置子弹初始出现的旋转角度

        // 注意此处使用as关键字进行类型转换,将实例化出的Object类类型转换成为GameObject类型。

    }

}

GamePanel

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GamePanel : MonoBehaviour
{
    public UIButton btn;   // 通过inspector在面板中拖放按钮组件

    public TankObj player; // 关联场景中的坦克对象

    // Start 函数会在第一帧开始前被调用
    void Start()
    {
        btn.onClick.Add(new EventDelegate(() => { // 添加一个lambda表达式在点击按钮时实现触发事件,以下为命令坦克对象开火的具体操作
            // 处理点击按钮后的逻辑。在这个例子中,点击按钮后会让关联在游戏场景中的玩家(控制的是坦克)开火
            player.Fire();
        }));
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏