层次结构攀登和下降统一

时间:2017-03-28 23:27:19

标签: c# unity3d

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

Hierarchy

它以这种方式工作,Controller对象具有处理玩家输入的脚本,PlayerShip对象具有所有转动,移动,射击脚本等,Camera是就像听起来一样,一个带有几个脚本的相机可以移动它。

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

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

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

对我而言,唯一可行的是,它看起来非常笨重,不优雅和脆弱。因此,我想知道是否有更好,更有效,更难看的方式来实现同样的目标?

2 个答案:

答案 0 :(得分:1)

首先,

tomcat-embed-jasper

是多余的。这可以简化为

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

甚至使用' / ',就像使用文件夹名称一样。

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

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

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

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

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

现在,将GameObject obj = Network.Instantiate(prefab,Vector3.zero,Quaternion.identity,0) as GameObject; _playerShip = obj.GetComponent<PlayerShip>(); 引用发送到PlayerShip脚本。

答案 1 :(得分:0)

如果每个帧都没有被调用,请考虑这个:

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

在此处详细了解上述内容:https://docs.unity3d.com/ScriptReference/GameObject.Find.html

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

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

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