编辑:通过取消订阅活动实现部分解决方案。
在开始几个游戏后,我有一个List tableViewController
的多个实例被调用。取消订阅调用之间的事件可以解决此问题,但是我无法销毁PROBLEM
因此我无法确定每个RunningGame
运行的实例都不多。
如何销毁或检查实例计数?
将所有GameType#
转换为静态类或销毁GameType#
似乎是问题的不正确解决方案。
(我将我的代码提炼为我认为是问题的代码,但是如果它有用的话,我可以将其发布到完成中。)
GameTypeManager
答案 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);
}