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)
';