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

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

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

Q&A

解決済

1回答

2605閲覧

GetTileがうまくいかない [NullReferenceException]

snowshink

総合スコア138

0グッド

0クリップ

投稿2019/05/05 12:31

編集2019/05/05 14:36

プレイヤーがいる位置のタイルを得たいのですが、うまくいきません。
タイルを得るために、タイルマップにTilemapSc.cs、プレイキャラにtile_player.csを紐づけたのですが、できません。
このサイトのコードと比較しても違いがないように思うのですが、なぜうまくいかないのでしょうか。グリッドとプレイキャラはヒエラルキーでは同階層で、グリッドの下階層にタイルマップがあります。


ヒエラルキー

├ Grid
│└Tile map ~ TilemapSc.cs
└player ~ tile_player.cs


TilemapSc.cs

unity2D

1 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5using UnityEngine.Tilemaps; 6 7public class TilemapSc : MonoBehaviour { 8 public static Tilemap map; 9 10 void Start(){ 11 map = GetComponent<Tilemap> (); 12 if (map == null) 13 Debug.Log ("map is null"); 14 } 15}

tile_player.cs

unity2D

1 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5using UnityEngine.Tilemaps; 6 7public class tile_player : MonoBehaviour { 8 Tilemap map; 9 // Use this for initialitation 10 void Start () { 11 map = TilemapSc.map; 12 //Debug.Log (gameObject.map.ToString ()); 13 } 14 15 // Update is called once per frame 16 void Update () { 17 if (Input.GetMouseButton (0)) { 18 Vector3 p_pos = this.transform.position; 19 Vector3Int pos = new Vector3Int (); 20 pos.x = (int)p_pos.x; 21 pos.y = (int)p_pos.y; 22 pos.z = (int)p_pos.z; 23 string msg = pos.ToString (); 24 Debug.Log (msg); 25 Tile t = (Tile)map.GetTile(pos); 26 if (t == null) 27 msg = "get tile incorrect"; 28 else 29 msg = t.sprite.ToString (); 30 Debug.Log (msg); 31 } 32 } 33} 34

発生したエラーのメッセージ
NullReferenceException: Object reference not set to an instance of an object
tile_player.Update () (at Assets/Script/example/tile_player.cs:24)

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

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

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

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

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

y_waiwai

2019/05/05 14:44

できません、うまくいきませんではなにがなんやらわかりませんw できないとは何がどういうふうにできないんでしょうか。 うまくいかないとは何がどうなってうまくいかないのでしょう。 具体的に詳しく説明してください。
Bongo

2019/05/05 20:16

tile_playerのStart内に「//Debug.Log (gameObject.map.ToString ());」がありますが、このコメントアウトを解除して有効化するとどうなるでしょうか?コンソールに正常にメッセージが表示されるか、それともこの位置でNullReferenceExceptionが発生するでしょうか。
guest

回答1

0

ベストアンサー

1.TilemapScのStart()Awake()に変えてください。
複数のスクリプトのStart()の実行順はUnityが勝手に決めるので、もしもTilemapScのStartの前にtile_playerのStartが実行されると、TilemapSc.mapはまだ設定されていないので中身はnullになります。
Awake()Start()より必ず先に実行されるので、これを利用してTilemapScのmap = GetComponent<Tilemap> ();を先に動作させるようにします。

2.「Tile map」オブジェクトにTilemapコンポーネントが付いているのを確認してください。
これが無いとmap = GetComponent<Tilemap> ();の結果がnullになるのでエラーになります。
(コンソールに"map is null"と出ていたらダメ)

投稿2019/05/07 01:08

sakura_hana

総合スコア11425

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

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

snowshink

2019/05/07 13:22

問題が解決しました。ありがとうございます。ですが、望んだタイルを得られなかったのでいろいろ調べてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問