Unity3D学习资源—委托和lambda表达式二

来源:互联网 发布:javascript是什么知乎 编辑:程序博客网 时间:2024/06/08 14:32
四.委托可以绑定多个方法这种特性,可以用在设计模式上面,下面有个Unity的一个Demo,先看一下截图:
 
工程运行前,场景中有四个带颜色的物体,中间是一个小球,然后移动小球,与四个物体中的任何一个碰撞后,再按下空格键,则把碰撞过的物体颜色改为蓝色.效果图如下:
 
其主要的思想就是在移动的小球的脚本里面,定义了一个委托,在其它四个物体的脚本里面都有一个方法,其格式和定义的委托格式一样,当移动的小球与四个物体碰撞后,就把物体脚本组件里面的方法与移动小球脚本组件里面的委托变量相绑定,当按下空格键后,就执行委托所绑定 的方法,把相对应的物体的颜色改变即可.下面是代码:
代码一是绑定在四个带有颜色物体上的脚本组件
[C] 纯文本查看 复制代码
?
1
2
3
4
5
6
7
8
9
publicclass EnemyHurt : MonoBehaviour
{
 
publicvoid Hurt ()
{
//把物体材质的颜色变成黑色,代表已死亡
transform.renderer.material.color = Color.blue;
}
}
下面两个脚本是加到移动小球上面的:
[C] 纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
//此脚本是用来控制小球移动的
publicclass Move : MonoBehaviour
{
//小球移动的速度
publicfloat speed = 3.0f;
 
voidUpdate ()
{
//得到横竖虚拟轴的值
floathor = Input.GetAxis ("Horizontal");
floatvec = Input.GetAxis ("Vertical");
//小球的移动
transform.position += newVector3 (hor, 0, vec) * Time.deltaTime * speed;
}
}

[C] 纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
publicclass Boom : MonoBehaviour
{
//由于四个物体上带的方法是无参无返回值,所以声明一个委托时要和方法的格式一样
publicdelegate voidBoomEvent ();
//委托变量
publicBoomEvent boomevent;
//碰撞检测,当小球与四个物体发生碰撞时,
voidOnCollisionEnter (Collision other)
{
//如果碰撞物体的父物体不为空并且父物体的名字是Enemies时
if(other.transform.parent != null && other.transform.parent.name == "Enemies") {
//把委托变量与碰到物体的脚本组件里面的方法相绑定
boomevent += other.transform.GetComponent<EnemyHurt> ().Hurt;
}
}
// Update is called once per frame
voidUpdate ()
{
//当按下空格键时,执行委托方法
if(Input.GetKeyDown (KeyCode.Space)) {
boomevent ();
}
}
}
以下是Unity场景里面的各物体之间的父子关系图:
 
以上就是关于委托的应用,由于书写时间仓促,有什么问题还请各位大神多多指教.
0 0
原创粉丝点击