2017-04-08 2 views
-1

基本的な2Dジャンプ&私は現在このコードに基づいて開発しています。 https://github.com/angelotadres/RunAndJump基本的な3DユニティゲームシングルトンはBuildでのみNullReferenceExceptionをスローする

Atmビルドを実行すると、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: DでRunAndJump.LevelMetadata.get_SceneNameでオブジェクト のインスタンスに設定されていないオブジェクト参照()[0x0000c]:スクリプト\レベル\ LevelMetadata.cs \資産\ \ Dropboxの\ Dropboxが\ユニティ\ RunAndJumpマスター: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; 
    } 
} 

、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; 
    } 
} 
+0

あなたの答えをありがとう。 エディタモードでは、nullになることはありません。 しかし、ビルドでは、常にnullです。 これがなぜこのようになるのか分かりません。 – Fex

+0

実行時に変更され、コードに基づいて変更されるためです。デバッガを使用して、その理由を理解してください。 – CodingYoshi

関連する問題