我目前正在开发的基本2D Jump&Run游戏就是基于这个代码的。https://github.com/angelotadres/RunAndJump
Atm 当我运行构建时,它会给我抛出一个 NullReferenceException。以下是完整的调试消息:
NullReferenceException: Object reference not set to an instance of an object
at RunAndJump.LevelMetadata.get_SceneName () [0x0000c] in
D:DropboxDropboxUnityRunAndJump-masterAssetsScriptsLevelLevelMetadata.cs:19
at RunAndJump.LevelHandlerScene+<InitScene>c__Iterator1.MoveNext () [0x0006c] in D:DropboxDropboxUnityRunAndJump-masterAssetsScenesLevelHandlerLevelHandlerScene.cs:85
at UnityEngine.SetupCoroutine.InvokeMoveNext (IEnumerator enumerator, IntPtr returnValueAddress) [0x00028] in C:buildslaveunitybuildRuntimeExportCoroutines.cs:17
UnityEngine.MonoBehaviour:StartCoroutine_Auto_Internal(IEnumerator)
UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) (at C:buildslaveunitybuildartifactsgeneratedcommonruntimeMonoBehaviourBindings.gen.cs:62)
RunAndJump.<InitSequence>c__Iterator0:MoveNext() (at D:DropboxDropboxUnityRunAndJump-masterAssetsScenesLevelHandlerLevelHandlerScene.cs:77)
UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr) (at C:buildslaveunitybuildRuntimeExportCoroutines.cs:17)
UnityEngine.MonoBehaviour:StartCoroutine_Auto_Internal(IEnumerator)
UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator) (at C:buildslaveunitybuildartifactsgeneratedcommonruntimeMonoBehaviourBindings.gen.cs:62)
RunAndJump.LevelHandlerScene:Start() (at D:DropboxDropboxUnityRunAndJump-masterAssetsScenesLevelHandlerLevelHandlerScene.cs:58)
这是问题单例类:
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;
}
}
任何想法为什么这只发生在构建中?谢谢!
附言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;
}
}
}
}
NullReferenceException:对象引用未设置为对象的实例 在 RunAndJump.LevelMetadata.get_SceneName (( [0x0000c] in D:\Dropbox\Dropbox\Unity\RunAndJump-master\Assets\Scripts\Level\LevelMetadata.cs:19
仔细阅读错误:它说错误位于LevelMetadat.cs
的第 19 行,并且在调用方法时发生get_SceneName()
。现在您没有get_SceneName
方法,但后台的属性创建为方法。因此,get_SceneName
方法是名为 SceneName
的属性中的 getter 。所以问题出在下面的代码中:
public string SceneName {
get {
Debug.Log ("Scene Name : " + scene.name);
return scene.name;
}
}
在该代码中,唯一可能为 null 的项是 scene
。因此,您需要调试代码并找出scene
为什么为 null。如果允许scene
为 null,那么您需要像这样做一些事情:
public string SceneName {
get {
if (scene == null)
{
return string.Empty; //maybe or something else
}
Debug.Log ("Scene Name : " + scene.name);
return scene.name;
}
}