【问题标题】:gameObject Transform in DontDestroyOnLoadDontDestroyOnLoad 中的游戏对象变换
【发布时间】:2021-02-06 19:44:59
【问题描述】:

我使用以下脚本复制游戏对象的变换。

public Transform alignment;

void Update()
{
    DontDestroyOnLoad(transform.gameObject);

    transform.position = new Vector3(alignment.position.x, alignment.position.y, alignment.position.z);
    float y = alignment.transform.localRotation.eulerAngles.y;
    float x = alignment.transform.localRotation.eulerAngles.x;
    float z = alignment.transform.localRotation.eulerAngles.z;
    transform.localEulerAngles = new Vector3(x, y, z);
}

我想在其他场景中使用此变换(将其应用于游戏对象)。 如何访问 DontDestroyOnLoad 中的转换?

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    首先,不要在更新函数中使用 DontDestroyOnLoad。在您的开始或唤醒功能中使用它。

    其次,您可以像访问任何其他对象一样访问您的 Non-Destroyed 对象。 两者唯一的区别是,Non-Destroyed 在切换场景时会停留在场景中。

    以下是一些访问它的方法:

    var obj = GameObject.Find("My Non Destroyed Object Name");
    

    或者我个人最喜欢的,如果该对象用于评分或设置,我将创建一个新的游戏对象并将以下脚本添加到其中:

    public class GameManager : MonoDevelop {
    
        /* These are all script on the same gameobject that is not being destroyed */
        public static Settings settings;
        public static PlayerMananger playerMananger;
        public static UIManager uiManager;
        
        
        void Start() {
            DontDestroyOnLoad(this.gameobject);
            
            // Get the components
            settings = GetComponent<Settings>();
            playerMananger = GetComponent<PlayerMananger>();
            uiManager = GetComponent<UIManager>();
        }   
    }
    

    现在我可以从任何地方创建脚本,并且可以访问所有这些管理器和设置文件,只需使用:

    var settings = GameManager.settings;
    

    【讨论】:

    • 感谢您的回答!它已经帮助我了解发生了什么。但我开始明白,这可能不是我想要的。澄清一下——这就是我在想的:我有一个游戏对象,它在游戏时间改变了它的变换。我希望其他场景中的等效游戏对象与这个新变换相匹配。在这种情况下我不能使用 DontDestroyOnLoad,因为每个场景中的游戏对象应该不同(除了变换)我正在寻找一种方法来读取一个游戏对象的变换并将其应用于其他场景中的其他对象跨度>
    • 告诉我更多关于你的游戏是关于什么的,我能想到一些东西。
    • 我正在 VR 中创建一个混合现实世界。因此,我有我的房间和 Oculus Quest 的 1:1 3d 模型。我使用 VR 控制器将我的数字房间模型与真实模型对齐。这就是房间变换在运行时发生变化的原因。在这个房间内,我使用手部追踪与房间(真实)表面上的按钮进行交互。这就是为什么我不想对房间使用 DontDestroyOnLoad - 我的接口需要适应房间的变换。但另一方面,我不想为每个场景加载重新对齐跟踪。
    • 我找到了一个适合我的解决方案:LoadSceneMode.Additive。我只是简单地覆盖场景,然后通过这种方式进行转换。
    【解决方案2】:

    您需要将对齐作为参数提供给 DontDestroyOnLoad 方法,而不是 transform.gameObject。

    DontDestroyOnLoad(alignment.gameObject);
    

    另外,您不需要在 Update() 中调用此方法。只需调用一次就足够了。您可以在 Start() 中调用它,如下所示:

    void Start()
    {
        DontDestroyOnLoad(alignment.gameObject);
    }
    

    现在,当您更改场景时,您的对齐游戏对象仍然可以访问。如果您想从新场景中的其他游戏对象访问它,您可能需要给它一个标签或使其成为单例。

    【讨论】:

      猜你喜欢
      • 2020-11-12
      • 2011-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-18
      • 1970-01-01
      • 2015-12-02
      • 1970-01-01
      相关资源
      最近更新 更多