在制作我的第一个游戏大约一个月后,我意识到我将游戏对象作为类附加到另一个游戏对象的脚本时非常困惑。这是一口,所以这是我的问题。
我的Game.cs附加到Game(gameobject)有
public Player player;
我的Player.cs附加到播放器(游戏对象)预制件
为什么我可以将具有播放器脚本的Player游戏对象拖入游戏对象的“玩家”字段?这有什么意义?它应该是
public GameObject player;
然后我会拖动我的预制游戏对象“播放器”。
这让我感到困惑的原因是,如果我实例化“播放器”,我是否实例化游戏对象?似乎没有,因为我不能这样做:
GameObject newPlayer = Instantiate(player, new Vector3(1,1,1), Quaternion.identity) as GameObject;
newPlayer.transform.SetParent(GameObject.Find("Level"));
如果我这样做,我将得到错误,newPlayer为空。
答案 0 :(得分:2)
脚本实际上是一个Component
对象,就像任何其他对象一样(大多数时候)。
从检查员拖动Component
对象到另一个检查器中的另一个插槽,技术上并不容易。可能这就是为什么他们制作这个“速记”,当你可以将实际GameObject
从层次结构中拖出来时。
如果被拖动的GameObject
与插槽有匹配的组件,则会计算拖动Component
本身。
您无法使用Object.Instantiate
实例化脚本Component
,您将始终以这种方式实例化GameObject
,请参阅文档。如果您需要该脚本,只需从全新实例中获取该组件。
确实令人困惑,我个人更喜欢命名约定:
public GameObject playerObject;
public Player player;
答案 1 :(得分:1)
统一。默认情况下,会将任何游戏对象投射到可能的组件中,例如,如果你的脚本中有一个变换并传递一个游戏对象(就像很多教程一样),它会自动转换为给定游戏对象的变换。
主要问题在于,如果你试图在没有Player脚本的情况下附加一个对象,如果不检查该值,它可能会以某种方式崩溃。
无论如何,当您使用自己的场景并且确定玩家游戏对象具有必要的脚本时,它将不会成为任何问题
哦,关于最后一部分,附加组件对于已经实例化的对象是常见的,要从组件中实例化你应该获得该脚本的父游戏对象,并且它没有意义,因为你可以轻松地直接附加预制件< / p>
我现在不记得究竟是怎么回事,对不起