【问题标题】:Hierarchy Climbing and Descending Unity层级攀登和下降统一
【发布时间】:2017-03-28 23:27:19
【问题描述】:

我的Player 预制件上有以下层次结构,这将是一个非常简单的多人射击游戏。

它是这样工作的,Controller 对象有处理玩家输入的脚本,PlayerShip 对象有所有的转弯、移动、射击等脚本,Camera 就像听起来一样,带有一些脚本的相机,用于移动它。

当一个新的Player 被实例化时,Control 脚本需要找到其相关的PlayerShip,很简单。

这可以使用以下代码来实现:

_playerShip = gameObject.transform.parent.gameObject.transform.FindChild("PlayerShip").GetComponent<PlayerShip>();

效果很好,唯一的问题是,对我来说,它看起来非常笨重、不优雅和脆弱。因此,我想知道是否有更好、更高效、更简洁的方法来实现同样的目标?

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    首先,

    _playerShip = gameObject.transform.parent.gameObject.transform.FindChild("playerShip").GetComponent<PlayerShip>(); 
    

    是多余的。可以简化为

    _playerShip = gameObject.transform.parent.FindChild("playerShip").GetComponent<PlayerShip>();
    

    甚至可以像使用文件夹名称一样使用“/”。

    _playerShip = GameObject.Find("Player/playerShip").GetComponent<PlayerShip>();
    

    现在,您可以实际实例化它并同时检索引用,而不是实例化 Object 并稍后搜索它。

    GameObject obj = Instantiate(prefab,Vector3.zero,Quaternion.identity) as GameObject;
    _playerShip = obj.GetComponent<PlayerShip>();
    

    如果是你用Network.Instantiate实例化的网络游戏:

    GameObject obj = Network.Instantiate(prefab,Vector3.zero,Quaternion.identity,0) as GameObject;
    _playerShip = obj.GetComponent<PlayerShip>();
    

    现在,将PlayerShip 引用发送到Control 脚本。

    【讨论】:

      【解决方案2】:

      如果不是每帧都调用它,请考虑:

      _playerShip = GameObject.Find("PlayerShip").GetComponent>PlayerShip>();
      

      在此处阅读有关上述内容的更多信息:https://docs.unity3d.com/ScriptReference/GameObject.Find.html

      如果每帧都调用它,请查看: https://docs.unity3d.com/ScriptReference/GameObject.FindWithTag.html

      任何一个都应该更容易理解。

      编辑:我可能误解了。会重新排列层次结构以使控制器成为 playerShip 的父级吗?然后你应该能够只看孩子,而不是通过父母看到兄弟姐妹。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-05
        • 2020-05-01
        • 1970-01-01
        • 2020-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-22
        相关资源
        最近更新 更多