在Unity中删除接口类的实例

时间:2015-07-01 00:42:06

标签: c# unity3d

编辑:通过取消订阅活动实现部分解决方案。

在开始几个游戏后,我有一个List tableViewController的多个实例被调用。取消订阅调用之间的事件可以解决此问题,但是我无法销毁PROBLEM因此我无法确定每个RunningGame运行的实例都不多。

如何销毁或检查实例计数?

将所有GameType#转换为静态类或销毁GameType#似乎是问题的不正确解决方案。

(我将我的代码提炼为我认为是问题的代码,但是如果它有用的话,我可以将其发布到完成中。)

GameTypeManager

3 个答案:

答案 0 :(得分:1)

为了做到这一点,你需要存储对MonoBehavi和Interface的引用。然后,只要你使用Interface对象,你需要检查monobeahiour引用!= null。 Unity会覆盖!=运算符,并知道何时销毁对象。但它没有能够覆盖接口的!=运算符,因此当你破坏单声道行为时,接口不会为null,但仍然会抛出错误。这有意义吗?

答案 1 :(得分:0)

您正在使用相同的gameObject添加IGameType的新实例。以前的实例将作为gameObject Component的一部分保留在内存中。

在gameObject上尝试UnityEngine.Object.Destroy函数。此函数将删除gameObject的组件。在检查GameOver后,只需为RunningGame调用它。您还可以指定销毁gameObject实例的延迟。

  

更新

使用如下代码:

 IMyComponent comp = obj.GetComponent<GameType1>() As IMyComponent;
 UnityEngine.Object.Destroy(gameToDestory);

在这里,您不能将接口IGameType指定为GetComponents,因为它只接受Concrete类型。

答案 2 :(得分:0)

我通过删除对MonoBehavior GameTypeManager的引用找到了一个解决方案,从而允许我以正常方式实例化我的类,而不用担心在组件周围改组。

这是我的解决方案代码:

public class GameTypeManager
{
    public static IGameType RunningGame;

    public void Setup (int selectedGameType)
    {
        RunningGame = GetGameType(selectedGameType);
        EventManager.Killed += RunningGame.CheckGameOver;
    }

    public void TearDown ()
    {
        EventManager.Killed -= RunningGame.CheckGameOver;
        RunningGame = null;
    }

    public IGameType GetGameType(int gameType)
    {
        IGameType currentGameType = null;
        switch (gameType)
        {
            case 0 :
                currentGameType = new GameType0();
                break;
            // Additional cases...
        }
        return currentGameType;
    }
}

public interface IGameType
{
    void CheckGameOver(PlayerState deadPlayer);
}