09:Demo之四处找死(四)_在代码里操作物体
最后更新于:2022-04-01 14:37:42
有没有发现越往后写,旁白出现的次数越少?
是的,最近公司出了点小问题,思绪就变得沉重了一些,思绪一沉重,我的精神分裂就很难发作。
不唠叨了,这次我们来试试在代码里操作物体吧,很简单很简单的。
> 笨木头花心贡献,啥?花心?不,是用心。
> 转载请注明,原文地址:[http://www.benmutou.com/archives/2176](http://www.benmutou.com/archives/2176)
> 文章来源:[笨木头与游戏开发](http://www.benmutou.com/blog/)
### 1.找遍全世界,只为了发现你——FindGameObjectWithTag
还记得很早之前我们介绍的Tag吗?我知道你们肯定不记得的。
先给我们的BugPlayer设置一个Tag吧,如下操作:
![u009_1.gif](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-06-06_575541ec655a9.gif)
OK,Tag只是物体身上的一个属性,我们可以利用这个属性做自己想做的事情。(小若:嘿嘿嘿,真的吗?)
别做怪怪的事情就好了...
Unity本身封装了一些针对Tag的操作,是的,包括在全世界中搜索某个Tag的物体。
打开脚本文件SomethingGGD,在OnTriggerEnter函数里加上两句代码:
~~~
void OnTriggerEnter(Collider other)
{
Debug.Log(“OnTriggerEnter”);
GameObject obj = GameObject.FindGameObjectWithTag(“BugPlayer”);
obj.SetActive(false);
}
~~~
利用FindGameObjectWithTag函数,可以在整个场景里查找Tag等于某个值的物体。
这是一个静态函数。
当然,Tag等于某个值的物体可以不止一个,因为Tag的值是可以随意设置的,因此也有FindGameObjectsWithTag函数,可以查找所有满足Tag值的物体,返回一个数组。
(小若:那,如果有很多个具有Tag=”BugPlayer”的物体呢?用FIndGameObjectWithTag会怎么样?)
如果拥有某个Tag属性的物体有多个,而你特么的又故意用FindGameObjectWithTag来查找单个物体,那就等着出Bug吧,我可不知道会发生什么。
留意第二句代码:obj.SetActive(false),这句代码会把物体变成非活动状态,这样就会就不会在场景中出现,也不会参与场景中的各种事件。就好像,它死了,但灵魂还在。
我们来看看效果:
![u009_2.gif](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-06-06_575541ec8496c.gif)
BugPlayer撞到地雷的时候,立刻就消失了。
怎么样?我这地雷质量不错吧?明天给你家门口装一个,免费的哈。
### 2.把你装在心里,随时都能…灭了你——将物体作为属性保存
除了使用Find**(特么的这函数名字太长,我不想写)来查找物体之外,还有一个更偷懒的方法。
首先,给SomethingGGD脚本加上一个属性,顺便修改OnTriggerEnter函数,如下所示:
~~~
public class SomethingGGD : MonoBehaviour {
public GameObject bugPlayer = null;
void OnTriggerEnter(Collider other)
{
Debug.Log(“OnTriggerEnter”);
bugPlayer.SetActive(false);
}
}
~~~
很简单,bugPlayer作为SomethingGGD的一个属性,我随时可以调用它。
等等,这个属性在哪里赋值呢?这是个好问题。(小若:特么就没人问你)
我们来看看Unity编辑器,每次修改完代码,回到编辑器时,它都会编译代码,所以要稍等一会。
然后点击Sphere,看看它的属性:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-06-06_575541ec9c5d1.png)
有没有发现什么?
是的,SomethingGGD里多了一个BugPlayer属性,而且它右边还有一个框框,看起来好像可以拖东西进去。
在Unity里就是这样,看起像的东西,那么它一定就是了。
脚本里的Public属性,是可以出现在编辑里的,而且可以直接拖动赋值。
我们把BugPlayer拖动到这个属性里吧:
![u009_3.gif](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-06-06_575541ecbb134.gif)
拖动物体的时候,在到达位置之前,一定不要松开鼠标,否则就会变成选中这个物体了。
OK,运行游戏,效果和之前是一毛一样的。
### 3.特么的对不起,我一直在骗你——Collider参数
各位,其实我刚刚说的两种方式,完全不适合在这里使用,为什么呢?
因为在两个彭撞器发生碰撞的时候,它们是能相互知道对方是谁的。
既然如此,我们根本就不需要去这么辛苦地查询。
忘记刚刚的那些操作,我们在OnTriggerEnter函数里写上这么一句代码:
~~~
void OnTriggerEnter(Collider other)
{
Debug.Log(“OnTriggerEnter”);
other.gameObject.SetActive(false);
}
~~~
OnTriggerEnter函数本身就有一个Collider参数,这个参数就是和我这个碰撞器发生碰撞的碰撞器对象。
碰撞器是一个Collider,Collider只是物体身上的一个组件,所以,Collider的gameObject就是那个和我产生碰撞的物体。
于是,仅仅需要调用:other.gameObject.SetActivie(false) 就能让这个和我产生碰撞的物体消失。
### 4.更多好玩的
现在, 地雷已经能操作BugPlayer了,那就很多东西可以玩了。
我们试试把OnTriggerEnter函数改成这样:
~~~
void OnTriggerEnter(Collider other)
{
Debug.Log(“OnTriggerEnter”);
int rand = (int)Random.Range(1, 100);
if(rand < 50)
{
other.gameObject.transform.position = new Vector3(
other.gameObject.transform.position.x,
other.gameObject.transform.position.y,
other.gameObject.transform.position.z – 20
);
}
else
{
other.gameObject.transform.position = new Vector3(
other.gameObject.transform.position.x + 20,
other.gameObject.transform.position.y,
other.gameObject.transform.position.z
);
}
}
~~~
这样就有随机效果了,随机改变BugPlayer的x或z坐标。
为什么要有随机效果?因为我们要创建多个地雷了。
还记得怎么复制物体吗?Ctrl+D,我们多复制几个地雷,摆满场景:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-06-06_575541ed1a38b.jpg)
我们复制出来的地雷和原来的是一毛一样的,地雷的所有逻辑都存在。
这是很爽的事情,我们只需配好一个物体,就能制作一堆相同的物体了。
现在,运行游戏,让BugPlayer踩地雷去吧。
![u009_4.gif](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-06-06_575541ed32d4a.gif)
我发现这主角还蛮难控制的….
### 5待续
好了,这个Demo的主要功能已经完成了。
下一篇,也是最后一篇,我们给BugPlayer加上UI
本篇源码: [Unity_benmutou_009](http://www.benmutou.com/wp-content/uploads/2015/11/Unity_benmutou_009.7z)
有没有发现越往后写,旁白出现的次数越少?
是的,最近公司出了点小问题,思绪就变得沉重了一些,思绪一沉重,我的精神分裂就很难发作。
不唠叨了,这次我们来试试在代码里操作物体吧,很简单很简单的。
> **笨木头花心贡献,啥?花心?不,是用心。**
> **转载请注明,原文地址:[http://www.benmutou.com/archives/2176](http://www.benmutou.com/archives/2176)**
> **文章来源:[笨木头与游戏开发](http://www.benmutou.com/blog/)**
### 1.找遍全世界,只为了发现你——FindGameObjectWithTag
还记得很早之前我们介绍的Tag吗?我知道你们肯定不记得的。
先给我们的BugPlayer设置一个Tag吧,如下操作:
![u009_1.gif](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-06-06_575541ec655a9.gif)
OK,Tag只是物体身上的一个属性,我们可以利用这个属性做自己想做的事情。(小若:嘿嘿嘿,真的吗?)
别做怪怪的事情就好了...
Unity本身封装了一些针对Tag的操作,是的,包括在全世界中搜索某个Tag的物体。
打开脚本文件SomethingGGD,在OnTriggerEnter函数里加上两句代码:
~~~
void OnTriggerEnter(Collider other)
{
Debug.Log(“OnTriggerEnter”);
GameObject obj = GameObject.FindGameObjectWithTag(“BugPlayer”);
obj.SetActive(false);
}
~~~
利用FindGameObjectWithTag函数,可以在整个场景里查找Tag等于某个值的物体。
这是一个静态函数。
当然,Tag等于某个值的物体可以不止一个,因为Tag的值是可以随意设置的,因此也有FindGameObject**s**WithTag函数,可以查找所有满足Tag值的物体,返回一个数组。
(小若:那,如果有很多个具有Tag=”BugPlayer”的物体呢?用FIndGameObjectWithTag会怎么样?)
如果拥有某个Tag属性的物体有多个,而你特么的又故意用FindGameObjectWithTag来查找单个物体,那就等着出Bug吧,我可不知道会发生什么。
留意第二句代码:obj.SetActive(false),这句代码会把物体变成非活动状态,这样就会就不会在场景中出现,也不会参与场景中的各种事件。就好像,它死了,但灵魂还在。
我们来看看效果:
![u009_2.gif](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-06-06_575541ec8496c.gif)
BugPlayer撞到地雷的时候,立刻就消失了。
怎么样?我这地雷质量不错吧?明天给你家门口装一个,免费的哈。
### 2.把你装在心里,随时都能…灭了你——将物体作为属性保存
除了使用Find**(特么的这函数名字太长,我不想写)来查找物体之外,还有一个更偷懒的方法。
首先,给SomethingGGD脚本加上一个属性,顺便修改OnTriggerEnter函数,如下所示:
~~~
public class SomethingGGD : MonoBehaviour {
public GameObject bugPlayer = null;
void OnTriggerEnter(Collider other)
{
Debug.Log(“OnTriggerEnter”);
bugPlayer.SetActive(false);
}
}
~~~
很简单,bugPlayer作为SomethingGGD的一个属性,我随时可以调用它。
等等,这个属性在哪里赋值呢?这是个好问题。(小若:特么就没人问你)
我们来看看Unity编辑器,每次修改完代码,回到编辑器时,它都会编译代码,所以要稍等一会。
然后点击Sphere,看看它的属性:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-06-06_575541ec9c5d1.png)
有没有发现什么?
是的,SomethingGGD里多了一个BugPlayer属性,而且它右边还有一个框框,看起来好像可以拖东西进去。
在Unity里就是这样,看起像的东西,那么它一定就是了。
脚本里的Public属性,是可以出现在编辑里的,而且可以直接拖动赋值。
我们把BugPlayer拖动到这个属性里吧:
![u009_3.gif](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-06-06_575541ecbb134.gif)
拖动物体的时候,在到达位置之前,一定不要松开鼠标,否则就会变成选中这个物体了。
OK,运行游戏,效果和之前是一毛一样的。
### 3.特么的对不起,我一直在骗你——Collider参数
各位,其实我刚刚说的两种方式,完全不适合在这里使用,为什么呢?
因为在两个彭撞器发生碰撞的时候,它们是能相互知道对方是谁的。
既然如此,我们根本就不需要去这么辛苦地查询。
忘记刚刚的那些操作,我们在OnTriggerEnter函数里写上这么一句代码:
~~~
void OnTriggerEnter(Collider other)
{
Debug.Log(“OnTriggerEnter”);
other.gameObject.SetActive(false);
}
~~~
OnTriggerEnter函数本身就有一个Collider参数,这个参数就是和我这个碰撞器发生碰撞的碰撞器对象。
碰撞器是一个Collider,Collider只是物体身上的一个组件,所以,Collider的gameObject就是那个和我产生碰撞的物体。
于是,仅仅需要调用:other.gameObject.SetActivie(false) 就能让这个和我产生碰撞的物体消失。
### 4.更多好玩的
现在, 地雷已经能操作BugPlayer了,那就很多东西可以玩了。
我们试试把OnTriggerEnter函数改成这样:
~~~
void OnTriggerEnter(Collider other)
{
Debug.Log(“OnTriggerEnter”);
int rand = (int)Random.Range(1, 100);
if(rand < 50)
{
other.gameObject.transform.position = new Vector3(
other.gameObject.transform.position.x,
other.gameObject.transform.position.y,
other.gameObject.transform.position.z – 20
);
}
else
{
other.gameObject.transform.position = new Vector3(
other.gameObject.transform.position.x + 20,
other.gameObject.transform.position.y,
other.gameObject.transform.position.z
);
}
}
~~~
这样就有随机效果了,随机改变BugPlayer的x或z坐标。
为什么要有随机效果?因为我们要创建多个地雷了。
还记得怎么复制物体吗?Ctrl+D,我们多复制几个地雷,摆满场景:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-06-06_575541ed1a38b.jpg)
我们复制出来的地雷和原来的是一毛一样的,地雷的所有逻辑都存在。
这是很爽的事情,我们只需配好一个物体,就能制作一堆相同的物体了。
现在,运行游戏,让BugPlayer踩地雷去吧。
![u009_4.gif](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-06-06_575541ed32d4a.gif)
我发现这主角还蛮难控制的….
### 5待续
好了,这个Demo的主要功能已经完成了。
下一篇,也是最后一篇,我们给BugPlayer加上UI
本篇源码: [Unity_benmutou_009](http://www.benmutou.com/wp-content/uploads/2015/11/Unity_benmutou_009.7z)