###実現したい機能
Mobが最初のオブジェクトを踏む
↓
次の目的地になるオブジェクトをFindしてその座標をモブに送る
↓
連続的に配置されたオブジェクトを辿るようにMobが移動する!
という機能のスクリプトを作りたいのです。
DoTweenProのPath設置のように、複数のパスとなるオブジェクトを配置して
それぞれの名前を「1」「2」「3」・・・と設定し、全てにこのスクリプトを貼れば、
現在踏んでいるオブジェクトの名前に1を足す形で次の目的地をFindさせられるはずでした。
そう、あんなエラーが起きるまでは・・・
まずは以下のコードをご覧下さい。
public class Mob_Gethome : MonoBehaviour { GameObject ThisMOB; GameObject NextPath; Mob mob; Mob_Gethome mob_gethome; public int PathNumber; public int nextPathNumber; public string NextPathName; Vector3 nextPathposition; Vector3 nextdestination; private void Start() { //➀:このオブジェクトの名前(stringで"1"と設定)をintに変換し、パス番号とする。 PathNumber = int.Parse(this.gameObject.name); //➁:➀で設定したパス番号に1を足したものを「次のパス番号」とする。 nextPathNumber = ( PathNumber + 1 ); //➂:次のパス番号(int)をstringに変換し、「次のパスの名前」とする。 NextPathName = nextPathNumber.ToString(); //➃:「次のパスの名前」で検索したオブジェクトを「次のパスオブジェクト」に指定する。 NextPath = GameObject.Find($"{ NextPathName }"); //➄:トランスフォームをベクターに変換するためのローカル変数に格納 ★ここでエラー★ Vector3 nextpath = NextPath.transform.position; //➅:次のパスのポジション(Vector3)は、➄でローカル変数に格納された「次のパスオブジェクト」のトランスフォームのポジションである。 nextPathposition = nextpath; //nextPathposition = NextPath.transform.position; //➆:次の目的地を示す座標(Vector3)は、次のパスのポジション(Vector3) nextdestination = nextPathposition; } void OnTriggerEnter2D(Collider2D collision) { if (collision.gameObject.CompareTag("Mob")) { ThisMOB = collision.transform.root.gameObject; mob = ThisMOB.GetComponent<Mob>(); mob.destination = nextdestination; Debug.Log(mob.destination); } }
実行自体はできるのですが、意図通りに動作せず
➄の個所がNullReferenceException: Object reference not set to an instance of an object
となってしまいます。
この箇所は元は➅の左辺に➄の右辺を代入して nextPathposition = NextPath.transform.position;
としていました。
その状態でも同じエラーが起きていたので、調べるうちに「Vectorに対してトランスフォームをそのままは代入できない」ということが分かったので、2行に分割した部分です。
今回に限らず一つの文に凝縮して記述しているとこのエラーがよく起こるため、できるだけ分解して一段階づつに分けてみたのですが・・・
実行時のインスペクタ上では、publicであるNextPathName
やnextPathNumber
は意図通りに、元の名前に1を加算されて表示されています。
なにが悪いのか、これ以上どうしていいかわかりません。
どなたかご教示頂ければ幸いです。
何卒、よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。