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



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

 

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

 

 

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

转载请注明,原文地址: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的值是可以随意设置的,因此也有FindGameObject sWithTag函数,可以查找所有满足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
有没有发现越往后写,旁白出现的次数越少?
是的,最近公司出了点小问题,思绪就变得沉重了一些,思绪一沉重,我的精神分裂就很难发作。

 

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

 

 

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

转载请注明,原文地址: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的值是可以随意设置的,因此也有FindGameObject sWithTag函数,可以查找所有满足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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
故事简介丑小鸭生来就很丑,谁都不喜欢它,从小被其他鸭子欺负。它无奈离开了妈妈,拿上一把猎枪,独自流浪,风餐露宿。每当遇到各种怪物而子弹不够用时,丑小鸭只能通过自己的血肉之躯踩死怪物。路上只能靠水果和蔬菜维持体力,无聊时也能抬头数星星。翻山越岭,逢水架桥,勇闯空中栈道和独木桥,踩过蹦床,躲过电锯,钻过加农炮,坐过火箭,穿过枪林弹雨,在极度艰苦的条件下大战终极BOSS。最终,丑小鸭占领了一座豪华城堡,面住着它心仪的白富美(其实也是个丑小鸭),它在夜色降临之前,轻轻关上门,打开灯,结束了流浪生涯,此时天空绽放绚烂的烟花,拉开幸福生活的序幕......这个故事告诉我们:只要你肯奋斗,我命由我不由天 时长课程分为上下两部,共64节课(21.1小时)其中,上部29节课(8.5小时),下部35节课(12.6小时)课程特色对初学者友好,初次遇到新技术会详细讲解全程直播,坚决不在直播外偷偷修改展示所有细节,手把手教学游戏元素完整丰富,共3张地图18个关卡代码和文档开源,github托管地址 https://github.com/sailings/DuckAdventure完善的售后支持涵盖实战中常用的知识点Physics,刚体,碰撞,弹簧体Mecanim,动画状态机,动画融合,动画层Animation,动画编辑与录制单例模式协程Dotween粒子特效射线检测键盘和移动端输入Cinemachine相机跟随,Confiner扩展UGUI常见控件,HUD屏幕自适应地图与关卡解锁关卡滑动背景滚动子弹轨迹计算音效管理场景编辑数据及上下文存储大纲丑小鸭历险记——趣味玩转unity2d游戏开发(上)  1.游戏简介及演示2.怎样画一匹骏马3.千之行始于足下4.修复连续跳跃以及Jump动画融合和播放5.匍匐前进6.星星碰撞以及游戏管理中增加积分7.吃水果蔬菜、游戏结束、制作水果蔬菜预设8.相机跟随、口水怪动画9.踩死怪物10.喷火怪11.钢管怪12.飞翔的小鸟怪13.食人鱼14.从天而降怪15.落水逻辑16.空中栈道和独木桥17.蹦床和电锯18.加农炮19.强力磁铁20.坐着火箭旅行21.漫天飞舞的电锯22.枪林弹雨23.丑小鸭的反击24.定点保存25.Boss动画、移动、释放怪物、生命值管理26.Boss无敌以及特效27.Boss血条以及坠机冒烟28.Boss射击以及子弹轨道计算29.梦幻城堡

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值