質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

1428閲覧

Unityにてスコアランキングを実装しようとしています。

aro

総合スコア21

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2019/05/03 15:12

編集2019/05/03 15:16

Unity初心者です。
スコアランキングを実装しようとしており、以下のサイトを参考にしました。
https://blog.naichilab.com/entry/webgl-simple-ranking

以下のエラーが出ているのですが、原因はわかりますでしょうか?
NullReferenceException: Object reference not set to an instance of an object
naichilab.RankingSceneManager.get_BoardIdPlayerPrefsKey () (at Assets/naichilab/unity-simple-ranking/Scripts/RankingSceneManager.cs:44)
naichilab.RankingSceneManager.Start () (at Assets/naichilab/unity-simple-ranking/Scripts/RankingSceneManager.cs:75)

C#

1using System.Collections; 2using UnityEngine; 3using UnityEngine.UI; 4using System.Linq; 5using NCMB; 6using NCMB.Extensions; 7 8namespace naichilab 9{ 10 public class RankingSceneManager : MonoBehaviour 11 { 12 private const string OBJECT_ID = "objectId"; 13 private const string COLUMN_SCORE = "score"; 14 private const string COLUMN_NAME = "name"; 15 16 17 [SerializeField] Text captionLabel; 18 [SerializeField] Text scoreLabel; 19 [SerializeField] Text highScoreLabel; 20 [SerializeField] InputField nameInputField; 21 [SerializeField] Button sendScoreButton; 22 [SerializeField] Button closeButton; 23 [SerializeField] RectTransform scrollViewContent; 24 [SerializeField] GameObject rankingNodePrefab; 25 [SerializeField] GameObject readingNodePrefab; 26 [SerializeField] GameObject notFoundNodePrefab; 27 [SerializeField] GameObject unavailableNodePrefab; 28 29 private string _objectid = null; 30 31 private string ObjectID 32 { 33 get { return _objectid ?? (_objectid = PlayerPrefs.GetString(BoardIdPlayerPrefsKey, null)); } 34 set 35 { 36 if (_objectid == value) 37 return; 38 PlayerPrefs.SetString(BoardIdPlayerPrefsKey, _objectid = value); 39 } 40 } 41 42 private string BoardIdPlayerPrefsKey 43 { 44 get { return string.Format("{0}_{1}_{2}", "board", _board.ClassName, OBJECT_ID); } 45 } 46 47 private RankingInfo _board; 48 private IScore _lastScore; 49 50 private NCMBObject _ncmbRecord; 51 52 /// <summary> 53 /// 入力した名前 54 /// </summary> 55 /// <value>The name of the inputted.</value> 56 private string InputtedNameForSave 57 { 58 get 59 { 60 if (string.IsNullOrEmpty(nameInputField.text)) 61 { 62 return "名無し"; 63 } 64 65 return nameInputField.text; 66 } 67 } 68 69 void Start() 70 { 71 sendScoreButton.interactable = false; 72 _board = RankingLoader.Instance.CurrentRanking; 73 _lastScore = RankingLoader.Instance.LastScore; 74 75 Debug.Log(BoardIdPlayerPrefsKey + "=" + PlayerPrefs.GetString(BoardIdPlayerPrefsKey, null)); 76 77 StartCoroutine(GetHighScoreAndRankingBoard()); 78 } 79 80 IEnumerator GetHighScoreAndRankingBoard() 81 { 82 scoreLabel.text = _lastScore.TextForDisplay; 83 captionLabel.text = string.Format("{0}ランキング", _board.BoardName); 84 85 //ハイスコア取得 86 { 87 highScoreLabel.text = "取得中..."; 88 89 var hiScoreCheck = new YieldableNcmbQuery<NCMBObject>(_board.ClassName); 90 hiScoreCheck.WhereEqualTo(OBJECT_ID, ObjectID); 91 yield return hiScoreCheck.FindAsync(); 92 93 if (hiScoreCheck.Count > 0) 94 { 95 //既にハイスコアは登録されている 96 _ncmbRecord = hiScoreCheck.Result.First(); 97 98 var s = _board.BuildScore(_ncmbRecord[COLUMN_SCORE].ToString()); 99 highScoreLabel.text = s != null ? s.TextForDisplay : "エラー"; 100 101 nameInputField.text = _ncmbRecord[COLUMN_NAME].ToString(); 102 } 103 else 104 { 105 //登録されていない 106 highScoreLabel.text = "-----"; 107 } 108 } 109 110 //ランキング取得 111 yield return StartCoroutine(LoadRankingBoard()); 112 113 //スコア更新している場合、ボタン有効化 114 if (_ncmbRecord == null) 115 { 116 sendScoreButton.interactable = true; 117 } 118 else 119 { 120 var highScore = _board.BuildScore(_ncmbRecord[COLUMN_SCORE].ToString()); 121 122 if (_board.Order == ScoreOrder.OrderByAscending) 123 { 124 //数値が低い方が高スコア 125 sendScoreButton.interactable = _lastScore.Value < highScore.Value; 126 } 127 else 128 { 129 //数値が高い方が高スコア 130 sendScoreButton.interactable = highScore.Value < _lastScore.Value; 131 } 132 133 Debug.Log(string.Format("登録済みスコア:{0} 今回スコア:{1} ハイスコア更新:{2}", highScore.Value, _lastScore.Value, 134 sendScoreButton.interactable)); 135 } 136 } 137 138 139 public void SendScore() 140 { 141 StartCoroutine(SendScoreEnumerator()); 142 } 143 144 private IEnumerator SendScoreEnumerator() 145 { 146 sendScoreButton.interactable = false; 147 highScoreLabel.text = "送信中..."; 148 149 //ハイスコア送信 150 if (_ncmbRecord == null) 151 { 152 _ncmbRecord = new NCMBObject(_board.ClassName); 153 _ncmbRecord.ObjectId = ObjectID; 154 } 155 156 _ncmbRecord[COLUMN_NAME] = InputtedNameForSave; 157 _ncmbRecord[COLUMN_SCORE] = _lastScore.Value; 158 NCMBException errorResult = null; 159 160 yield return _ncmbRecord.YieldableSaveAsync(error => errorResult = error); 161 162 if (errorResult != null) 163 { 164 //NCMBのコンソールから直接削除した場合に、該当のobjectIdが無いので発生する(らしい) 165 _ncmbRecord.ObjectId = null; 166 yield return _ncmbRecord.YieldableSaveAsync(error => errorResult = error); //新規として送信 167 } 168 169 //ObjectIDを保存して次に備える 170 ObjectID = _ncmbRecord.ObjectId; 171 172 highScoreLabel.text = _lastScore.TextForDisplay; 173 174 yield return StartCoroutine(LoadRankingBoard()); 175 } 176 177 178 /// <summary> 179 /// ランキング取得&表示 180 /// </summary> 181 /// <returns>The ranking board.</returns> 182 private IEnumerator LoadRankingBoard() 183 { 184 int nodeCount = scrollViewContent.childCount; 185 for (int i = nodeCount - 1; i >= 0; i--) 186 { 187 Destroy(scrollViewContent.GetChild(i).gameObject); 188 } 189 190 var msg = Instantiate(readingNodePrefab, scrollViewContent); 191 192 //2017.2.0b3の描画されないバグ暫定対応 193 MaskOffOn(); 194 195 var so = new YieldableNcmbQuery<NCMBObject>(_board.ClassName); 196 so.Limit = 30; 197 if (_board.Order == ScoreOrder.OrderByAscending) 198 { 199 so.OrderByAscending(COLUMN_SCORE); 200 } 201 else 202 { 203 so.OrderByDescending(COLUMN_SCORE); 204 } 205 206 yield return so.FindAsync(); 207 208 Debug.Log("データ取得 : " + so.Count.ToString() + "件"); 209 Destroy(msg); 210 211 if (so.Error != null) 212 { 213 Instantiate(unavailableNodePrefab, scrollViewContent); 214 } 215 else if (so.Count > 0) 216 { 217 int rank = 0; 218 foreach (var r in so.Result) 219 { 220 var n = Instantiate(rankingNodePrefab, scrollViewContent); 221 var rankNode = n.GetComponent<RankingNode>(); 222 rankNode.NoText.text = (++rank).ToString(); 223 rankNode.NameText.text = r[COLUMN_NAME].ToString(); 224 225 var s = _board.BuildScore(r[COLUMN_SCORE].ToString()); 226 rankNode.ScoreText.text = s != null ? s.TextForDisplay : "エラー"; 227 228// Debug.Log(r[COLUMN_SCORE].ToString()); 229 } 230 } 231 else 232 { 233 Instantiate(notFoundNodePrefab, scrollViewContent); 234 } 235 } 236 237 public void OnCloseButtonClick() 238 { 239 closeButton.interactable = false; 240 UnityEngine.SceneManagement.SceneManager.UnloadSceneAsync("Ranking"); 241 } 242 243 private void MaskOffOn() 244 { 245 //2017.2.0b3でなぜかScrollViewContentを追加しても描画されない場合がある。 246 //親maskをOFF/ONすると直るので無理やり・・・ 247 var m = scrollViewContent.parent.GetComponent<Mask>(); 248 m.enabled = false; 249 m.enabled = true; 250 } 251 } 252}

44行目は以下です
get { return string.Format("{0}{1}{2}", "board", _board.ClassName, OBJECT_ID); }

75行目は以下です
Debug.Log(BoardIdPlayerPrefsKey + "=" + PlayerPrefs.GetString(BoardIdPlayerPrefsKey, null));

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

同じエラーが出ていて困っています。
解決方法の「呼び出しの方に設定が出来ていなかったのが原因」とは
どのようにすれば良いのでしょうか?
教えていただけますと幸いです

投稿2021/05/24 17:18

imatetsu

総合スコア4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

呼び出しの方に設定が出来ていなかったのが原因でした。

投稿2019/05/03 17:41

aro

総合スコア21

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問