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