如何在Unity3d中创建游戏范围内的对象而不使用singleton?

如何在Unity3d中创建游戏范围内的对象而不使用singleton?,unity3d,singleton,game-engine,scene,gameobject,Unity3d,Singleton,Game Engine,Scene,Gameobject,在Unity3d framework中是否有一种方法可以注册一个对象,该对象在游戏中所有场景中的所有实体都可以访问,而无需使用单例模式(如游戏状态对象)?您可以采用以下方法: 在创建游戏对象的场景中,在附加到游戏对象的单行为脚本中: 在Awake()中(或在编辑器中)用“Name=…”命名游戏对象。 示例:myObject.name=“FindMineVeryScene” 参考: 在Awake()中对游戏对象调用“DontDestroyOnLoad” 示例:DontDestroyOnLo

在Unity3d framework中是否有一种方法可以注册一个对象,该对象在游戏中所有场景中的所有实体都可以访问,而无需使用单例模式(如游戏状态对象)?

您可以采用以下方法:

在创建游戏对象的场景中,在附加到游戏对象的单行为脚本中:

  • 在Awake()中(或在编辑器中)用“Name=…”命名游戏对象。
    • 示例:myObject.name=“FindMineVeryScene”
    • 参考:
  • 在Awake()中对游戏对象调用“DontDestroyOnLoad”
    • 示例:DontDestroyOnLoad(myObject)
    • 参考:
在同一场景和后续场景中,在附加到其他游戏对象的单行为脚本中

  • 使用GameObject查找对象。在Start()中查找(…)
    • 示例:globalGameObject=GameObject.Find(“findMineVeryScene”)
    • 参考:
这将允许您访问名为“FindMineVeryScene”的游戏对象,而无需单例

把这一切放在一起

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;
        }
    }
}
// Attached to GameObjects that need access to the GlobalGameObject
public class UsingGameObject : MonoBehaviour
{
    private GameObject globalGameObject = null;

    void Start()
    {
        globalGameObject = GameObject.Find( "FindMeInEveryScene" );
    }
}
使用GameObject.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;
        }
    }
}
// Attached to GameObjects that need access to the GlobalGameObject
public class UsingGameObject : MonoBehaviour
{
    private GameObject globalGameObject = null;

    void Start()
    {
        globalGameObject = GameObject.Find( "FindMeInEveryScene" );
    }
}

您可以使用事件进行操作,但这并不是使用事件的最佳方式。我很想知道为什么单例模式不适合您,因为这几乎是它们的主要用途。

如果您不打算使用静态或单例模式,我看不出您在系统设计中使用任何类型的游戏状态对象有任何意义。它会做同样的事情,但速度较慢(避免使用GameObject.Find,不惜一切代价)。它将缺乏单例的瓜拉兰特式的独特性,以及两者提供的简单参考。我不明白你的意思是什么,但我认为它们是合理的,可以尝试回答你的问题

在没有中央游戏状态对象的情况下执行此操作将需要更分散的解决方案。由静态游戏管理器执行的任务现在由单个对象本身控制,并由其他对象通知


这种方法的美妙之处在于,对象之间根本不需要相互了解。他们只需要监听事件并通知系统发生了事件。我真的想不出另一个选择。希望这有帮助。祝你好运

当然,但是你需要找到与他交互的每个对象的引用为什么不使用静态类?@SwiftingDuster静态类的singleton-y并不比singleton少。它非常适合OP存储游戏状态的目标。它们在本质上是相似的,但确实存在差异。也许你可以和我分享你的方法?@SwiftingDuster静态类对我也不起作用,因为它和我正在尝试规避的singleton有着非常相同的缺点。singleton会起作用。问题是,除非绝对必要,否则我宁愿避免这种权衡