Unity 2017.1.0f3:在多个场景中保持3D对象

时间:2017-09-10 15:14:58

标签: c# unity3d

我正在编写一个Android应用程序,允许用户 DIY他们的手机套 ,然后将它们导出为.stl /其他3D打印格式。

我有几个场景(每个场景都有一个用于切换到下一个场景的按钮):

场景0(开始场景) :一个带有退出按钮和开始按钮的简单开始菜单(带有图像作为背景的画布)。

场景1(模型场景) :3个按钮(允许用户选择3种型号:iphone7,iphone6s,LGG6)。按下其中一个按钮后,相应的手机外壳将显示给用户。

场景2(彩色场景) :有多种颜色供用户选择。触摸颜色按钮后,手机外壳的材质将更改为相应的颜色。用户可以立即预览案例的样子。

场景3(模式场景) :有多种模式供用户选择。触摸图案按钮后,手机外壳的背面将更改为相应的图案。用户可以立即预览案例的样子。

......还会有更多场景为手机外壳添加更多功能/功能。

场景x(导出) :将手机外壳导出为3D打印格式。

我在编码时遇到了一些问题。

主要问题是我需要在所有场景中保留所选的手机外壳(3D对象)。详细地说,在用户在scene1中选择了想要的手机外壳(比方说LGG6)之后,需要保留外壳并将其传递到下一个场景(场景2:彩色场景)以进行进一步编辑。在场景2中对案例着色后,彩色手机外壳将被传递到下一个场景(图案场景)以编辑图案等等。

这些天我一直在网上冲浪,我找到了几种可以实现这一目标的方法。我决定使用 " DontDestroyOnLoad" 。但是,有些事情我不明白:

我创建了一个名为&#34; AppManager&#34;的游戏对象。在场景0中。有一个C#脚本(也称为&#34; AppManager&#34;附加到它。在其中,我创建了许多变量来存储所有场景中所需的所有元素 < / em> ,包括Canvas&amp; UI元素,3D对象(3种手机外壳,我将它们存储在渲染类型中),相机,定向光以及我需要的功能。

然后,我实施了一个&#34; DontDestroyOnLoad&#34;脚本内的函数。 enter image description here

此外,我将所有UI元素,3D对象,相机作为 的孩子们做了#34; AppManager&#34; enter image description here

我想问一下:

  1. 我使用&#34; DontDestroyOnLoad&#34;是否正确?我仍然不明白如何从其他场景中访问存储在&#34; AppManager&#34;(场景o)中的变量和函数。
  2. 由于我有几个场景有一些其他场景不需要的独特按钮,我希望我可以激活每个场景中特定UI元素的功能(.gameObject.SetActive(true / false))并禁用我不需要的那些。我想知道我是否可以在我的&#34; AppManager&#34;中实现这个功能?或者在每个场景中,我需要创建一个独特的脚本来启用/禁用这些UI元素?
  3. 我想在场景2,3,4中实现 &#34; back&#34; 按钮......这是什么意思?让我们说用户现在在场景3(模式场景)。他选择了LGG6表壳和红色(材质)。但他想修改颜色,从红色变为黑色。然后,在场景3中有一个后退按钮,让他回到场景2以选择颜色。这意味着我的应用需要撤消颜色变化。我想询问是否有一个单位函数可以保存当前场景中的所有信息,以后可以重新加载?

1 个答案:

答案 0 :(得分:1)

  

我正确使用“DontDestroyOnLoad”吗?我仍然不明白如何从其他场景中访问存储在“AppManager”(场景o)中的变量和函数。

是的,你是。您可以通过以某种方式通过脚本访问它来访问下一个场景中的变量,例如,可以将其存储在静态变量中,或者具有可以获取的管理器类,并通过管理器类获取不是的对象破坏。

  

由于我有几个场景有一些其他场景不需要的独特按钮,我希望我可以激活每个场景中特定UI元素的功能(.gameObject.SetActive(true / false))并禁用我不需要的那些。我想知道我是否可以在“AppManager”中实现此功能?或者在每个场景中,我需要创建一个独特的脚本来启用/禁用这些UI元素?

您可以在管理按钮的每个场景中创建一个脚本,然后在脚本的“OnEnable()”方法中将脚本本身存储在一个静态变量中。

public class ExampleScript : MonoBehaviour
{
    /// <summary>
    /// Store the ExampleScript in a static variable, then have the variable set when the scene is loaded, for example through OnEnable() or possibly Awake().
    /// ExampleScript should act as a manager script and hold the references to the buttons in each scene.
    /// </summary>
    public static ExampleScript _Instance;

    private void OnEnable()
    {
        _Instance = this;
    }

}

public class UsingExampleScript : MonoBehaviour
{

    private void Update()
    {
        if (Input.GetKeyDown("i"))
        {
            if (ExampleScript._Instance != null)
            {
                //Use variables from example script, for example the buttons.
            }
        }
    }
}
  

我想在场景2,3,4中实现“后退”按钮......这是什么意思?让我们说用户现在在场景3(模式场景)。他选择了LGG6表壳和红色(材质)。但他想修改颜色,从红色变为黑色。然后,在场景3中有一个后退按钮,让他回到场景2以选择颜色。这意味着我的应用需要撤消颜色变化。我想询问是否有一个统一的函数可以保存当前场景中的所有信息,以后可以重新加载?

你可以有一个带有静态变量的脚本,然后它们应该保存在场景变化之间,然后在每个场景的开头加载它们。