Unity无法销毁克隆GameObject

时间:2020-06-25 07:38:15

标签: c# dictionary unity3d photon

我正在使用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)。它从字典中找回了错误的内容。

看不到我做错了吗?

1 个答案:

答案 0 :(得分:1)

认为我已经解决了这个问题。 GameObject-OtherCraft-有一个脚本,也称为OtherCraft。实际存储在字典中(后来被删除并销毁)的是脚本的实例,而不是GameObject

许多Unity社区说明文档,视频等都暗示要保持名称相同-“创建GameObject'Fred',现在向其中添加脚本,命名-为什么不命名-'Fred'”。好吧,那样会带来麻烦。很多时候,两者是可以互换的,并且无论如何您都希望访问脚本。它们几乎可以互换,但是似乎并非总是如此。无论如何不是这种情况。

我将其更改为GameObjectOtherCraftGo,并将脚本保持为OtherCraft。字典已更改为存储GameObject,并且在需要时,OtherCraft script = myOtherCraftGo.GetComponent<OtherCraft>()访问了脚本。

解决了问题。无论如何,对我来说是一个有益的教训。