我正在使用Photon PUN进行多人游戏,并在玩家进入时从预制中实例化GameObjects(OtherCraft),并在它们离开时销毁它们-否则销毁是行不通的。相关代码如下:
预制件已加载到Start()中,并且有一个字典来保存对实例化的引用(其他工艺现在只是具有网格和脚本的多维数据集):
OtherCraft
otherCraftPrefab;
Dictionary<int, OtherCraft>
otherCrafts = new Dictionary<int, OtherCraft>();
.... // the following in Start()
GameObject
tmp = (GameObject)Resources.Load("Prefabs/OtherCraft", typeof(GameObject));
otherCraftPrefab = null;
if (tmp == null)
Debug.Log("Failed to load prefab for other craft");
else
otherCraftPrefab = tmp.GetComponent<OtherCraft>();
OnPlayerEnteredRoom(Player newPlayer)通知新进入者时,将创建新工艺并将其添加到字典中:
OtherCraft
otherCraft = Instantiate(otherCraftPrefab, new Vector3(0,1,0), Quaternion.identity);
otherCraft.setActorNumber(newPlayer.ActorNumber);
otherCraft.setNickName(newPlayer.NickName);
otherCrafts.Add(newPlayer.ActorNumber, otherCraft);
Debug.Log("Other craft instantiated - " + otherCraft.getNickName() + ", ActorNumber=" + otherCraft.getActorNumber());
Debug.Log行显示一切正常(Created craft - OtherCraft(Clone) (OtherCraft): nick2, ActorNumber=2
),右边的ActorNumber等,并显示在游戏视图和层次结构确定中。
当OnPlayerLeftRoom(Player exPlayer)
通知玩家离开时,它引用字典中的条目并再次删除它:
OtherCraft
otherCraft = otherCrafts[exPlayer.ActorNumber];
int actorNumber = otherCraft.getActorNumber();
string nickName = otherCraft.getNickName();
Debug.Log("Recovered craft - " + otherCraft.ToString() + ": " + nickName + ", ActorNumber=" + actorNumber);
otherCrafts.Remove(actorNumber);
Destroy(otherCraft);
除非没有,否则它仍然存在于游戏视图和层次结构中。 Debug.Log行还显示错误的信息(Recovered craft - OtherCraft(Clone) (OtherCraft): , ActorNumber=0
)。它从字典中找回了错误的内容。
看不到我做错了吗?
答案 0 :(得分:1)
认为我已经解决了这个问题。 GameObject
-OtherCraft
-有一个脚本,也称为OtherCraft
。实际存储在字典中(后来被删除并销毁)的是脚本的实例,而不是GameObject
。
许多Unity社区说明文档,视频等都暗示要保持名称相同-“创建GameObject
'Fred
',现在向其中添加脚本,命名-为什么不命名-'Fred
'”。好吧,那样会带来麻烦。很多时候,两者是可以互换的,并且无论如何您都希望访问脚本。它们几乎可以互换,但是似乎并非总是如此。无论如何不是这种情况。
我将其更改为GameObject
为OtherCraftGo
,并将脚本保持为OtherCraft
。字典已更改为存储GameObject
,并且在需要时,OtherCraft script = myOtherCraftGo.GetComponent<OtherCraft>()
访问了脚本。
解决了问题。无论如何,对我来说是一个有益的教训。