您好,欢迎来到Unity之家!   unity.jb51.net 
  • 首 页
  • 你问我答
  • 当前位置:首页 > 程序开发 > 开发经验 >
    隐藏3D模型及GetComponentsInChildren的使用
    时间:2015-03-25 08:56 来源:Unity之家 作者:unity.jb51.net 浏览:收藏 挑错 推荐 打印



    有时游戏设计的需求,在场景中的3D模型物件未必都是一开始就一直是显示的状态,

    有可能会因为某些事件的发生而必须将物件隐藏,或因为某些事件的发生必须使该物件再次显示出来,

    通常在大部份的状况,我们可能会先制作一个Prefabs,在需要该物件时利用Instantiate()建立一个实例物件,

    使物件在场景中运作,在不需要该物件时利用Destroy()将此物件销毁,可是如果我们的需求是必须持续使用该物件,

    物件本身带有某些资料值会持续使用到,那么就不能随意将其销毁,但此时需有一段时间不能使该物件出现在画面上,那么我们应该怎么做呢?

    物件的隐藏与显示,这个定义上很广泛,主要就是让镜头里看不到此物件,


    以下就来讨论几种方式:



    一. 将物件移出镜头外


    通常游戏场景都会有地板、背景等,我们如果暂时需要将物件隐藏掉,可暂时改变物件在3D空间的座标位置,

    将它藏在地板下、背景后,甚至是镜头后方,这样就可以很轻易的隐藏画面中的物件,不过,有些缺点,

    就是当需要再次将物件显示在画面之中时,必须将物件放回正确的位置,如果游戏场景及镜头都是定点固定不动的,

    那么将物件放回原来位置并不难,但如果游戏场景、镜头都是依照游戏进行在不断运作改变方向及内容的话,

    此时在处理物件座标定位上可能就要多费点功夫了。


    二. 统一储存相关资讯


    如上面第一段所提到的,在需要时产生物件,在不需要显示时销毁物件,需要延续使用的相关数据,

    统一储存在某个记忆位置、档案、资料库...中,如此做法其实相当直接,不需要的东西就丢,

    但也有同样的问题,当该物件于下次需要显示时,我们必须要很清楚知道他应该出现的位置,

    然后在这个位置产生物件,使游戏进行不会错乱掉,但对于有使用物理碰撞反弹等等的游戏,

    那就很难去预测到该出现的正确位置,而且如果这些位置数据还要自己写程式计算的话,

    Unity的物理引擎反倒显得无用武之地了。


    三. 关闭物件,使物件无法运作


    当游戏进行到某事件发生时,我们不想将物件销毁,而只想让物件在目前位置消失并停止运作,

    等待之后事件发生时再显示出来,此时我们就可以利用GameObject.active将该物件关闭,

    或使用GameObject.SetActiveRecursively()直接将该物件及他的子物件全部关闭,使他停止运作,

    因为物件被停止了,所以此时他将不会显示在画面上,而物件本身带有的Component也都会停止运作,

    待之后事件发生需要显示该物件时再将其开启,不过此时很容易发生一种情形是,

    GameObject.Find()要找回此物件并将其开启时,却发现找不到,因为Find()只会帮你找出正在活动中的物件,

    所以在将物件关闭前,我们必须将此物件放至预先定义好的变数成员中,使我们的程式保有他的参照,

    在需要开启时才能利用此参照找回这个已被关闭的物件;因为已持有他的参照,所以此物件虽然是在关闭的状态,

    但我们仍然能对他控制,使他改变位置或变更其他数据,但也因为是关闭的状态,

    所以我们付予他的任何主动功能动作将不会运作。



    (责任编辑:脚印)
    免责声明:Unity之家部分内容来源于互联网,如有侵权,请联系我们,本站将立即进行处理。
    标签:Unity之家