我的Player
预制件上有以下层次结构,用于制作一个非常简单的多人射击游戏。
它以这种方式工作,Controller
对象具有处理玩家输入的脚本,PlayerShip
对象具有所有转动,移动,射击脚本等,Camera
是就像听起来一样,一个带有几个脚本的相机可以移动它。
当实例化新的Player
时,Control
脚本需要找到相关的PlayerShip
,这很简单。
这可以使用以下代码实现:
_playerShip = gameObject.transform.parent.gameObject.transform.FindChild("PlayerShip").GetComponent<PlayerShip>();
对我而言,唯一可行的是,它看起来非常笨重,不优雅和脆弱。因此,我想知道是否有更好,更有效,更难看的方式来实现同样的目标?
答案 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的父级吗?然后你应该能够看到孩子,而不是通过父母来看待兄弟姐妹。