【笨木头Unity】入门之旅009:Demo之四处找死(四)_在代码里操作物体



有没有发现越往后写,旁白出现的次数越少?
是的,最近公司出了点小问题,思绪就变得沉重了一些,思绪一沉重,我的精神分裂就很难发作。

 

不唠叨了,这次我们来试试在代码里操作物体吧,很简单很简单的。

 

 

笨木头花心贡献,啥?花心?不,是用心。

转载请注明,原文地址:http://www.benmutou.com/archives/2176

文章来源:笨木头与游戏开发

 

 

 

1.找遍全世界,只为了发现你——FindGameObjectWithTag

还记得很早之前我们介绍的Tag吗?我知道你们肯定不记得的。
先给我们的BugPlayer设置一个Tag吧,如下操作:
【笨木头Unity】入门之旅009:Demo之四处找死(四)_在代码里操作物体_第1张图片

 

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 sWithTag函数,可以查找所有满足Tag值的物体,返回一个数组。
(小若:那,如果有很多个具有Tag=”BugPlayer”的物体呢?用FIndGameObjectWithTag会怎么样?)

 

如果拥有某个Tag属性的物体有多个,而你特么的又故意用FindGameObjectWithTag来查找单个物体,那就等着出Bug吧,我可不知道会发生什么。

 

留意第二句代码:obj.SetActive(false),这句代码会把物体变成非活动状态,这样就会就不会在场景中出现,也不会参与场景中的各种事件。就好像,它死了,但灵魂还在。

 

我们来看看效果:
【笨木头Unity】入门之旅009:Demo之四处找死(四)_在代码里操作物体_第2张图片

 

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,看看它的属性:
【笨木头Unity】入门之旅009:Demo之四处找死(四)_在代码里操作物体_第3张图片
有没有发现什么?
是的,SomethingGGD里多了一个BugPlayer属性,而且它右边还有一个框框,看起来好像可以拖东西进去。
在Unity里就是这样,看起像的东西,那么它一定就是了。

 

脚本里的Public属性,是可以出现在编辑里的,而且可以直接拖动赋值。
我们把BugPlayer拖动到这个属性里吧:
【笨木头Unity】入门之旅009:Demo之四处找死(四)_在代码里操作物体_第4张图片
拖动物体的时候,在到达位置之前,一定不要松开鼠标,否则就会变成选中这个物体了。

 

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,我们多复制几个地雷,摆满场景:
【笨木头Unity】入门之旅009:Demo之四处找死(四)_在代码里操作物体_第5张图片
我们复制出来的地雷和原来的是一毛一样的,地雷的所有逻辑都存在。
这是很爽的事情,我们只需配好一个物体,就能制作一堆相同的物体了。

 

现在,运行游戏,让BugPlayer踩地雷去吧。
【笨木头Unity】入门之旅009:Demo之四处找死(四)_在代码里操作物体_第6张图片

 

我发现这主角还蛮难控制的….

 

5待续

好了,这个Demo的主要功能已经完成了。
下一篇,也是最后一篇,我们给BugPlayer加上UI

 

本篇源码:  Unity_benmutou_009
有没有发现越往后写,旁白出现的次数越少?
是的,最近公司出了点小问题,思绪就变得沉重了一些,思绪一沉重,我的精神分裂就很难发作。

 

不唠叨了,这次我们来试试在代码里操作物体吧,很简单很简单的。

 

 

笨木头花心贡献,啥?花心?不,是用心。

转载请注明,原文地址:http://www.benmutou.com/archives/2176

文章来源:笨木头与游戏开发

 

 

 

1.找遍全世界,只为了发现你——FindGameObjectWithTag

还记得很早之前我们介绍的Tag吗?我知道你们肯定不记得的。
先给我们的BugPlayer设置一个Tag吧,如下操作:
【笨木头Unity】入门之旅009:Demo之四处找死(四)_在代码里操作物体_第7张图片

 

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 sWithTag函数,可以查找所有满足Tag值的物体,返回一个数组。
(小若:那,如果有很多个具有Tag=”BugPlayer”的物体呢?用FIndGameObjectWithTag会怎么样?)

 

如果拥有某个Tag属性的物体有多个,而你特么的又故意用FindGameObjectWithTag来查找单个物体,那就等着出Bug吧,我可不知道会发生什么。

 

留意第二句代码:obj.SetActive(false),这句代码会把物体变成非活动状态,这样就会就不会在场景中出现,也不会参与场景中的各种事件。就好像,它死了,但灵魂还在。

 

我们来看看效果:
【笨木头Unity】入门之旅009:Demo之四处找死(四)_在代码里操作物体_第8张图片

 

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,看看它的属性:
【笨木头Unity】入门之旅009:Demo之四处找死(四)_在代码里操作物体_第9张图片
有没有发现什么?
是的,SomethingGGD里多了一个BugPlayer属性,而且它右边还有一个框框,看起来好像可以拖东西进去。
在Unity里就是这样,看起像的东西,那么它一定就是了。

 

脚本里的Public属性,是可以出现在编辑里的,而且可以直接拖动赋值。
我们把BugPlayer拖动到这个属性里吧:
【笨木头Unity】入门之旅009:Demo之四处找死(四)_在代码里操作物体_第10张图片
拖动物体的时候,在到达位置之前,一定不要松开鼠标,否则就会变成选中这个物体了。

 

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,我们多复制几个地雷,摆满场景:
【笨木头Unity】入门之旅009:Demo之四处找死(四)_在代码里操作物体_第11张图片
我们复制出来的地雷和原来的是一毛一样的,地雷的所有逻辑都存在。
这是很爽的事情,我们只需配好一个物体,就能制作一堆相同的物体了。

 

现在,运行游戏,让BugPlayer踩地雷去吧。
【笨木头Unity】入门之旅009:Demo之四处找死(四)_在代码里操作物体_第12张图片

 

我发现这主角还蛮难控制的….

 

5待续

好了,这个Demo的主要功能已经完成了。
下一篇,也是最后一篇,我们给BugPlayer加上UI

 

本篇源码:  Unity_benmutou_009

你可能感兴趣的:(脚本,unity)