【问题标题】:Enable a gameObject that is present in another scene in Unity?启用 Unity 中另一个场景中存在的游戏对象?
【发布时间】:2021-11-16 20:27:54
【问题描述】:

当我通过当前场景中的脚本执行上述操作时,如何设置另一个场景中存在的游戏对象 true/false GameObject.SetActive(true);

【问题讨论】:

  • 如果那个场景没有在你加载的时候加载。
  • @Eddge 那么访问另一个场景中的脚本怎么样?
  • 如果场景没有加载你不能,游戏对象只有在场景被加载时才会被加载,那些游戏对象上的场景中的脚本只有在它们附加到的游戏对象被加载时才会被加载.
  • 看看用单例模式或使用“DontDestroyOnLoad”制作一个游戏对象,以便该对象是持久的。

标签: c# unity3d


【解决方案1】:

正如@Eddge 所说,您无法访问未加载场景中的对象。 场景对象实际上是在加载场景时创建的,因此之前无法访问它们。

问题是,当加载新场景时,旧场景(在您的情况下是要调用 SetActive 的脚本)已被卸载。

DontDestroyOnLoad

加载新场景时不要破坏目标对象。 新场景的加载会破坏所有当前场景对象。调用Object.DontDestroyOnLoad 以在关卡加载期间保留一个对象。

-- https://docs.unity3d.com/ScriptReference/Object.DontDestroyOnLoad.html

如果当前场景中的对象在加载的场景中持续存在有助于解决您的问题,则此方法适用。

LoadScene 附加

对于DontDestroyOnLoad 没有剪切的情况,可以在不卸载旧场景的情况下加载新场景,让您有机会在两者之间传递信息。

(这实际上是 DontDestroyOnLoad 所做的,因为它将目标对象放入名为 DontDestroyOnLoad 的“场景”中,永远不会被卸载)

您可以使用SceneManagement.LoadSceneLoadSceneMode.Additive 模式来实现。请注意,在您卸载第一个场景之前,这两个场景将同时处于活动状态!

请参阅LoadSceneLoadSceneAsyncUnloadSceneAsync

静态

您还可以简单地将数据存储在静态字段中,这些字段会在应用的整个生命周期中保留,以跨场景保留数据和引用。 这可能是传递一些原始类型的更简单的解决方案,但请记住它们是全局的,因此具有相同的缺点。

Singleton pattern

【讨论】:

    【解决方案2】:

    我最近发现了一种 hacky 方法,如果您想在场景之间发送数据,可编写脚本的对象也可以正常工作,因为可编写脚本在项目中保存为资产,因此它独立于场景。只需创建一个可编写脚本的对象,然后您就可以从一个场景更新数据并从另一个场景访问它们。

    示例代码:

    只需创建一个可编写脚本的目标代码:

    [CreateAssetMenu(fileName = "StoreData")]
    public class StoreData : ScriptableObject {
        public bool objectActive;
    }
    

    然后在第一个场景中访问您的可编写脚本对象并将可编写脚本对象中的布尔值设置为 true:

    public class FirstSceneClass : MonoBehaviour {
        public StoreData storeData;
        public SetObjectActive() {
           storeData.objectActive = true;
        }
    }
    

    然后,当您更改场景时,您可以再次访问可编写脚本的对象,并根据布尔值将游戏对象设置为活动或不活动:

    public class SecondSceneClass : MonoBehaviour {
        public StoreData storeData;
        void Start() {
            if (storeData.objectActive) {
               // Set your game object active here
            }
        }
    }
    

    【讨论】:

    • 请添加代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多