【问题标题】:Unity Scene Management and Android - Unable to Load SceneUnity 场景管理和 Android - 无法加载场景
【发布时间】:2016-03-30 08:31:52
【问题描述】:

我是 C#/Unity 的新手(温柔点) - 我正在尝试创建自己的脚本,将公共变量添加到 Inspector,这样做可以让我让一个脚本适用于多个 GameObjects(或者我认为)。

脚本非常简单。

它可以在 PC 上运行,但不能在 Android 上运行。

using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.EventSystems;

public class BtnLoadScene : MonoBehaviour {
    public Object SceneObj;
    private string SceneName;

    public void LoadLevel()
    {
        SceneName = SceneObj.name;
        Debug.Log (SceneName);
        SceneManager.LoadScene(SceneName);
    }
}

我将此脚本作为组件附加到驱动场景加载的所有按钮(跨整个应用程序)。同样,这里的价值是我可以将我的“场景”从资产文件夹拖到检查器/组件中(因此我不必显式管理“整数”或“字符串” - 这一切都将通过对象引用)。​​

例如:

再次,这适用于 PC 更新:根据评论中的建议,我在独立播放器中尝试过,但失败了。这仅适用于 Unity 编辑器。当我为 Android 构建时(是的,它可以编译并且我可以安装 APK)它不起作用 - 第一个场景加载,按钮响应我的触摸,我看到它“按下”,但 ADB 抛出:

12-23 15:37:27.028 14816 14847 I Unity   : NullReferenceException: Object reference not set to an instance of an object
12-23 15:37:27.028 14816 14847 I Unity   :   at BtnLoadScene.LoadLevel () [0x00000] in <filename unknown>:0
12-23 15:37:27.028 14816 14847 I Unity   :   at UnityEngine.Events.InvokableCall.Invoke (System.Object[] args) [0x00000] in <filename unknown>:0
12-23 15:37:27.028 14816 14847 I Unity   :   at UnityEngine.Events.InvokableCallList.Invoke (System.Object[] parameters) [0x00000] in <filename unknown>:0
12-23 15:37:27.028 14816 14847 I Unity   :   at UnityEngine.Events.UnityEventBase.Invoke (System.Object[] parameters) [0x00000] in <filename unknown>:0
12-23 15:37:27.028 14816 14847 I Unity   :   at UnityEngine.Events.UnityEvent.Invoke () [0x00000] in <filename unknown>:0
12-23 15:37:27.028 14816 14847 I Unity   :   at UnityEngine.UI.Button.Press () [0x00000] in <filename unknown>:0
12-23 15:37:27.028 14816 14847 I Unity   :   at UnityEngine.UI.Button.OnPointerClick (UnityEngine.EventSystems.PointerEventData eventData) [0x00000] in <filename unknown>:0
12-23 15:37:27.028 14816 14847 I Unity   :   at UnityEngine.EventSystems.ExecuteEvents.Execute (IPointerClickHandler handler, UnityEngine.EventSystems.BaseEventData eventData) [0x00000] in <filename unknown>:0
12-23 15:37:27.028 14816 14847 I Unity   :   at UnityEngine.EventSystems.ExecuteEvents.Execute[IPointerClickHandler] (UnityEngine.GameObject target
12-23 15:37:27.036 14816 14847 I Unity   : NullReferenceException: Object reference not set to an instance of an object
12-23 15:37:27.036 14816 14847 I Unity   :   at BtnLoadScene.LoadLevel () [0x00000] in <filename unknown>:0
12-23 15:37:27.036 14816 14847 I Unity   :   at UnityEngine.Events.InvokableCall.Invoke (System.Object[] args) [0x00000] in <filename unknown>:0
12-23 15:37:27.036 14816 14847 I Unity   :   at UnityEngine.Events.InvokableCallList.Invoke (System.Object[] parameters) [0x00000] in <filename unknown>:0
12-23 15:37:27.036 14816 14847 I Unity   :   at UnityEngine.Events.UnityEventBase.Invoke (System.Object[] parameters) [0x00000] in <filename unknown>:0
12-23 15:37:27.036 14816 14847 I Unity   :   at UnityEngine.Events.UnityEvent`1[T0].Invoke (.T0 arg0) [0x00000] in <filename unknown>:0
12-23 15:37:27.036 14816 14847 I Unity   :   at UnityEngine.EventSystems.EventTrigger.Execute (EventTriggerType id, UnityEngine.EventSystems.BaseEventData eventData) [0x00000] in <filename unknown>:0
12-23 15:37:27.036 14816 14847 I Unity   :   at UnityEngine.EventSystems.EventTrigger.OnPointerClick (UnityEngine.EventSystems.PointerEventData eventData) [0x00000] in <filename unknown>:0
12-23 15:37:27.036 14816 14847 I Unity   :   at UnityEngine.EventSystems.ExecuteEvents.Execute (IPointerClickHandler handler, UnityEngine.EventSystems.BaseEventData eventData) [0x00000] in <filename

如果我输入硬编码值(字符串或场景 int),它在 Android 和 PC 中可以正常工作。但是,由于某种我看不到的原因,当我为 Android 构建时,我在 Inspector 中引用的 Scene 对象似乎没有像我想的那样捕获字符串名称并将其传递给 LoadScene() .

谁能告诉我我做错了什么?这是不可能的还是愚蠢的想法?

提前谢谢你。

【问题讨论】:

  • 您必须在构建游戏时添加所有将加载到游戏中的场景。如果您这样做了,请不要从调试器而是从独立版本在 pc 上尝试。我不知道是什么原因造成的,但您也可以在 Unity 论坛上提问。
  • @Snak,是的,这是我检查的第一件事;在我在原始问题中提供的屏幕截图中,我显示了构建中加载的场景 + 检查器/组件/脚本中引用的场景对象。如果我不能在这里寻求解决方案,我会尝试统一论坛。谢谢。
  • 那么酷。无论如何,我会说问题在于 SceneObj 对象为空,因此当代码尝试访问它时,它会抛出异常。
  • @JustinCarroll 还有一个游戏开发堆栈交换网站,看起来相当活跃的unity tag

标签: c# unity3d unity5


【解决方案1】:

恐怕UnityEngine.SceneAsset 只能在编辑器中使用,它最终会在任何构建中为空。 然而,Unity3D 只需要来自BuildSettings 列表的字符串或索引,所以它很容易:只需在检查器中传递场景名称。无论哪种方式,它都会在您的整个开发过程中保持不变,并且如果您更改场景名称,就好像您将实际的 SceneAsset 对象放在那里一样(在这两种情况下重命名都会失败)。

【讨论】:

  • 我也怀疑过,这就是为什么我告诉他为 PC 进行构建并注意从调试器中执行它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-16
相关资源
最近更新 更多