笨木头  2015-11-15 11:04     Unity3D     阅读(4984)     评论(5)
转载请注明,原文地址: http://www.benmutou.com/archives/2176
文章来源:笨木头与游戏开发
 
有没有发现越往后写,旁白出现的次数越少?
是的,最近公司出了点小问题,思绪就变得沉重了一些,思绪一沉重,我的精神分裂就很难发作。
 
不唠叨了,这次我们来试试在代码里操作物体吧,很简单很简单的。
 


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

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

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

 

 

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

还记得很早之前我们介绍的Tag吗?我知道你们肯定不记得的。
先给我们的BugPlayer设置一个Tag吧,如下操作:
u009_1.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
 
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,看看它的属性:
有没有发现什么?
是的,SomethingGGD里多了一个BugPlayer属性,而且它右边还有一个框框,看起来好像可以拖东西进去。
在Unity里就是这样,看起像的东西,那么它一定就是了。
 
脚本里的Public属性,是可以出现在编辑里的,而且可以直接拖动赋值。
我们把BugPlayer拖动到这个属性里吧:
u009_3.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,我们多复制几个地雷,摆满场景:
我们复制出来的地雷和原来的是一毛一样的,地雷的所有逻辑都存在。
这是很爽的事情,我们只需配好一个物体,就能制作一堆相同的物体了。
 
现在,运行游戏,让BugPlayer踩地雷去吧。
u009_4.gif
 
我发现这主角还蛮难控制的....
 

5待续

好了,这个Demo的主要功能已经完成了。
下一篇,也是最后一篇,我们给BugPlayer加上UI
 
本篇源码: Unity_benmutou_009
 
5 条评论
  • 漫步梦路 2016-01-11 00:26:28

    楼主:我爸爸不抽烟不喝酒不喝茶,女朋友第一次看他,不知道带什么礼物?
    回复:旺旺雪饼。
    0回复
  • 【笨木头Unity】入门之旅009:Demo之四处找死(四)_在代码里操作物体 | 安卓文档网 2015-12-29 02:10:28

    […] 转载请注明,原文地址:http://www.benmutou.com/archives/2176 […]
    0回复
  • 【笨木头Unity】入门之旅009:Demo之四处找死(四)_在代码里操作物体 &#045; 移动开发 &#045; 阿里欧歌 2015-11-17 08:32:00

    […] 转载请注明,原文地址:http://www.benmutou.com/archives/2176 […]
    0回复
  • 【笨木头Unity】入门之旅000:前言(含教程目录导航) | 笨木头与游戏开发 2015-11-15 11:23:28

    […] 【笨木头Unity】入门之旅009:Demo之四处找死(四)_在代码里操作物体 […]
    0回复
  • 【笨木头Unity】入门之旅010(完结):Demo之四处找死(五)_UI | 笨木头与游戏开发 2015-11-15 11:17:26

    […] 转载请注明,原文地址:http://www.benmutou.com/archives/2176 […]
    0回复
发表评论
粤ICP备16043700号

本博客基于 BlazorAnt Design Blazor 开发