【问题标题】:Unity - How can i transfer an object from scene1 and instantiate it in scene2?Unity - 如何从场景 1 传输对象并在场景 2 中实例化它?
【发布时间】:2020-06-16 13:45:56
【问题描述】:

我想在 Unity 中创建一个简单的移动应用程序,让用户选择一个相框,然后用它做一些事情。

所以,我在场景 1 中有一个预制件(相框)列表。此场景在应用启动时显示给用户。

它在我的应用中的外观示例图片:

一旦用户触摸其中一个帧,他就会被引用到场景 2。这是我的代码,用于确定触摸了哪些帧:FrameSelection.cs 附加到 FrameList 游戏对象。

void Update()
    {
        if (Input.touchCount > 0 && Input.touches[0].phase == TouchPhase.Began)
        {
            Touch touch = Input.touches[0];
            Ray ray = Camera.main.ScreenPointToRay(touch.position);
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit))
            {
                Debug.Log(hit.transform.name);
                if (frameList.Contains(hit.transform.gameObject))
                {
                    //Switch scene
                }
            }
        }

但是如何将选定的预制件从场景 1 传递到场景 2?我希望预制件仅在场景2中实例化,具体取决于场景1中选择的预制件。

在场景 2 中,我有一个脚本,当用户触摸屏幕时实例化对象:ObjectSpawner.cs

    void Update()
    {
        if (Input.touchCount > 0 && Input.touches[0].phase == TouchPhase.Began)
        {
            Touch touch = Input.touches[0];
            Ray ray = Camera.main.ScreenPointToRay(touch.position);
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit))
            {
                placedObject = Instantiate(objectToSpawn, hitObject.point,hitObject.transform.rotation);
...

我试图通过在我的FrameSelection.cs 脚本中使用DontDestroyOnLoad 来避免场景切换被破坏,但是当加载scene2 时我仍然得到MissingReferenceException。

    void Awake() 
    {
        DontDestroyOnLoad(transform.gameObject);
    }

我很乐意为您提供任何帮助!

【问题讨论】:

  • 非常详细的问题,有很多很好的信息!干得好。当你到达scene2,检查FrameList,Frame1 还是它的子节点吗?当你将 Frame1 存储在 FrameList 中时,你将它存储在什么 var 中?换句话说,objectToInstantiate 何时填充?
  • @whathm 谢谢!我想多了,我可以通过实现我附加到 frameList 的单例模式来解决它。所以选定的帧通过场景切换保持不变。
  • 将此作为问题的答案发布。 @whathm 得到了信任,我不必来看它 :)

标签: c# unity3d mobile


【解决方案1】:

另一种选择是使用可编写脚本的对象。它们是简洁的小数据容器,可用于存储复杂的对象。该数据独立于场景和类而存在。它们不涉及大量额外代码,并且是 Unity 开发人员需要熟悉的内容,因为它们确实让您摆脱了在尝试为持久数据编写代码时可能遇到的一些讨厌的漏洞。

Architect your code with Scriptable Objects

【讨论】:

  • 如果可以的话,我会给你 1000 个赞,非常感谢你提供的信息!这实际上解决了我在解决方案中遇到的很多问题。
  • 没问题。不过,您需要注意一些事情。它并不总是有很好的文档记录,但是虽然 Scriptable Objects 会在运行时重置,但它们不会在编辑器中自动这样做。因此,如果您有一个保存临时信息或状态信息的 SO,您需要确保它们在每次运行时都重置为默认值。尽管它们没有从 MonoBehavior 继承,因此没有 Start 或 Update 方法,但您可以使用 Awake 方法进行初始化和重置。这是我很长时间不知道的事情。
【解决方案2】:

我想多了,我可以通过实现我附加到 frameList 的单例模式来解决它。因此选定的帧通过场景切换保持不变。还是感谢@whathm

【讨论】:

    猜你喜欢
    • 2014-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多