2017-04-08 92 views
-1

基本的2D跳转&我正在开发的运行游戏基于这段代码。 https://github.com/angelotadres/RunAndJump基本的3D Unity游戏Singleton抛出NullReferenceException仅在Build

当我运行构建时,Atm会抛出一个NullReferenceException异常。 下面是完整的调试消息:

NullReferenceException: Object reference not set to an instance of an object 
at RunAndJump.LevelMetadata.get_SceneName() [0x0000c] in 
D:\Dropbox\Dropbox\Unity\RunAndJump-master\Assets\Scripts\Level\LevelMetadata.cs:19 
at RunAndJump.LevelHandlerScene+<InitScene>c__Iterator1.MoveNext() [0x0006c] in D:\Dropbox\Dropbox\Unity\RunAndJump-master\Assets\Scenes\LevelHandler\LevelHandlerScene.cs:85 
at UnityEngine.SetupCoroutine.InvokeMoveNext (IEnumerator enumerator, IntPtr returnValueAddress) [0x00028] in C:\buildslave\unity\build\Runtime\Export\Coroutines.cs:17 
UnityEngine.MonoBehaviour:StartCoroutine_Auto_Internal(IEnumerator) 
UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) (at C:\buildslave\unity\build\artifacts\generated\common\runtime\MonoBehaviourBindings.gen.cs:62) 
RunAndJump.<InitSequence>c__Iterator0:MoveNext() (at D:\Dropbox\Dropbox\Unity\RunAndJump-master\Assets\Scenes\LevelHandler\LevelHandlerScene.cs:77) 
UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr) (at C:\buildslave\unity\build\Runtime\Export\Coroutines.cs:17) 
UnityEngine.MonoBehaviour:StartCoroutine_Auto_Internal(IEnumerator) 
UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) (at C:\buildslave\unity\build\artifacts\generated\common\runtime\MonoBehaviourBindings.gen.cs:62) 
RunAndJump.LevelHandlerScene:Start() (at D:\Dropbox\Dropbox\Unity\RunAndJump-master\Assets\Scenes\LevelHandler\LevelHandlerScene.cs:58) 

这里是problematioc单例类:

using UnityEngine; 
using System.Collections; 
using System.Collections.Generic; 



public class Session : Singleton<Session> { 

    private LevelsPackage _levels; 
    private int _currentLevelId = 0; 

    private void Awake() { 
     _levels = Resources.Load<LevelsPackage>(LevelsPackage.ResourcePath); 
     Debug.Log(_levels); 
    } 

    public void PlayLevel(int id) { 
     _currentLevelId = id; 
    } 

    public void PlayNext() { 
     _currentLevelId++; 
    } 

    public LevelMetadata GetLevelMetadata() { 
     return _levels.metadataList[_currentLevelId -1]; 
    } 

    public bool HasNext() { 
     return (_currentLevelId < _levels.metadataList.Count); 
    } 

    public int GetLevelId() { 
     return _currentLevelId; 
    } 

    public int GetTotalLevels() { 
     return _levels.metadataList.Count; 
    } 
} 

任何想法,为什么这只是在构建会怎么样? 谢谢!

P.S.所述LevelMetadata类:

这是文件:

using UnityEngine; 
using System; 

namespace RunAndJump { 
[Serializable] 
public class LevelMetadata { 

    public UnityEngine.Object scene; 
    [SerializeField] 
    private string levelName; 

    public string LevelName { 
     get { return (levelName == null || levelName == "") ? "Untitled" : levelName; } 
     set { levelName = value; } 
    } 

    public string SceneName { 
     get { 
      Debug.Log ("Scene Name : " + scene.name); 
      return scene.name; 
     } 
    } 
} 
} 
+0

你怎么知道它的这个类是有问题的?你真的调试过吗? * D:\ Dropbox \ Dropbox \ Unity \ RunAndJump-master \ Assets \ Scripts \ Level \ LevelMetadata.cs:19 *是错误的地方。 *提示:*'RunAndJump.LevelMetadata.get_SceneName' – t0mm13b

+0

我复制了我的问题中的代码。 – Fex

回答

0

的NullReferenceException:在RunAndJump.LevelMetadata.get_SceneName()[0x0000c]在 d不设置为一个对象 的实例对象引用: \ Dropbox的\ Dropbox的\团结\ RunAndJump主\资产\脚本\级\ LevelMetadata.cs:19

仔细阅读错误:它说的错误是对LevelMetadat.cs它Happe的19线ns时调用get_SceneName()方法。现在你没有get_SceneName方法,但引擎盖下的属性被创建为方法。因此,get_SceneName方法是名为SceneName的属性中的吸气剂。所以,问题是在下面的代码:

public string SceneName { 
    get { 
     Debug.Log ("Scene Name : " + scene.name); 
     return scene.name; 
    } 
} 

在该代码中,它可以可能是空的唯一项目是scene。所以你需要调试你的代码,并找出为什么scene为空。如果scene被允许为空,那么你需要像这样做一些事情:

public string SceneName { 
    get { 
     if (scene == null) 
     { 
      return string.Empty; //maybe or something else 
     } 
     Debug.Log ("Scene Name : " + scene.name); 
     return scene.name; 
    } 
} 
+0

感谢您的回答。 在编辑器模式下,它永远不会为空。 但在构建它是allways null。 我不明白为什么会出现这种情况。 – Fex

+0

因为在运行时会发生变化,它们会根据您的代码进行更改。使用调试器并找出原因。 – CodingYoshi