Unity3d框架中是否有一种方法可以注册游戏中所有场景中的所有实体都可以访问的对象,而无需求助于单例模式(例如游戏状态对象)?
答案 0 :(得分:1)
您可以采用以下方法:
在创建GameObject的场景中,在附加到GameObject的MonoBehavior脚本中:
在同一场景和后续场景中,在附加到其他GameObjects的MonoBehavior脚本中。
这将使您可以单例访问名为“ FindMeInEveryScene”的GameObject。
将它们组合在一起...
GlobalGameObject.cs
// Attached to the GameObject that needs to be accessd by any other
// GameObjects and needs to survive between loading scenes
public class GlobalGameObject : MonoBehaviour
{
static bool gameObjectInitialized = false;
void Awake()
{
if ( !gameObjectInitialized )
{
gameObject.name = "FindMeInEveryScene";
DontDestroyOnLoad( gameObject );
gameObjectInitialized = true;
}
}
}
UsingGameObject.cs
// Attached to GameObjects that need access to the GlobalGameObject
public class UsingGameObject : MonoBehaviour
{
private GameObject globalGameObject = null;
void Start()
{
globalGameObject = GameObject.Find( "FindMeInEveryScene" );
}
}
答案 1 :(得分:0)
您可以使用事件来做到这一点,但这并不是使用事件的最佳方法。我很想知道为什么单例模式对您不起作用,因为这几乎是他们的主要目的。
答案 2 :(得分:0)
如果您不打算使用静态或单例方式进行此操作,那么在系统设计中使用任何类型的游戏状态对象对您来说都没有任何意义。它将执行相同的操作,但速度较慢(不惜一切代价避免使用GameObject.Find)。它将缺乏单例的保证唯一性和两者提供的简单参考。我不明白您的取舍是什么意思,但我认为尝试您的问题是合理的。
在没有中央游戏状态对象的情况下执行此操作将需要更加分散的解决方案。静态游戏管理器将执行的任务现在由单个对象自己控制,并由其他对象通知。
https://unity3d.com/learn/tutorials/topics/scripting/delegates
此方法的优点在于,对象根本不需要了解彼此。他们只需要侦听事件并通知系统已发生事件。我真的想不出另一种选择。希望这可以帮助。祝你好运!