見出し画像

Unity スクリプトがうまく動かないときの修正ポイント

こんにちは!

ぷもんです。


以前、Unity 進行方向を軸に回転させる!というnoteで
で次のようなスクリプトを書きました。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBehaviourScript5 : MonoBehaviour {

	private GameObject player; 
	private Vector3 Player_pos;
	private Vector3 rotateAxis;

	// Use this for initialization
	void Start () {
		player = GameObject.Find("GameObject (");
		Player_pos = GetComponent<Transform>().position;
	}
	
	// Update is called once per frame
	void Update () {
		
		rotateAxis = transform.position - Player_pos; 

		transform.RotateAround(player.transform.position,rotateAxis,1f);

		Player_pos = transform.position; 
	}
}

実はこれうまく動くように修正した後のものです。


始めたての頃は、全くわからなかったので
自分がやりたいことに近そうな感じのサイトを調べて
それをコピペして動かしてみてスクリプトの意味を理解する
のを繰り返していました。

最近、Unityでスクリプトを書いて動かすのにも慣れてきて
自分で考えたスクリプトを書くようになってきたのですが
そこで問題になるのがエラーが起きてうまく動かないことです。


Unityの挫折ポイント
①スクリプトが理解できない...マジムリ...。
②ちゃんと書いたのにうまく動かない...マジムリ...。
だと思っています。

今回は②の挫折を回避するために
うまく動かないときに「こうすると動いた!」というポイントを
書いていきます。


こちらのnoteは新しいポイントが見つかったら随時追加していく予定です!


Unity 進行方向を軸に回転させる!編

Unity 進行方向を軸に回転させる!というnoteで
書いたスクリプトの修正前がこちら!

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour {

    private Vector3 Player_pos; 

    void Start()
    {
        Player_pos = GetComponent<Transform>().position; 
    }

    void Update()
    {
        Vector3 diff = transform.position - Player_pos; 

        transform.RotateAround(player.transform.position,Vector3 diff,1f);

        Player_pos = transform.position; 
    }

}

修正ポイント

①変数が足りない
②player = GameObject.Find("GameObject (");が必要
③Vector3 diff


順に説明していきます。

①変数が足りない
修正前は変数が
「private Vector3 Player_pos;」しかありません。

変数はスクリプトに出てくるものを全てを
書かないとエラーになる
ので注意が必要です。


②player = GameObject.Find("GameObject (");が必要
名前が「GameObject (」でややこしいです。すいません...。

「void Update () {}」の行で「player.transform.position」を使っているのに
playerの情報を取得できていませんでした。

使う変数を取得できているか?にも注意が必要です。


ちなみに、「Player_pos.transform.position」とするとエラーになりました。

これは「〇〇.transform.position」の〇〇は
「GameObject」じゃないといけなくて
「Player_pos」が「private Vector3 Player_pos;」の行で
「Vector3(=XYZ座標の値)」で設定されているからだと考えられます。

もし「Player_pos」を使う場合は「.transform.position」をつけないで
「Player_pos」のままで入れれば使えます。

このように変数の定義によってうまくいかない場合もあるので注意です。


③Vector3 diff

これはVector3 diffという名前がややこしかったので変更しました。

本当に変える必要があったのかは不明です...。


このような修正をした結果、こちらのスクリプトで動きました!

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBehaviourScript5 : MonoBehaviour {

	private GameObject player; 
	private Vector3 Player_pos;
	private Vector3 rotateAxis;

	// Use this for initialization
	void Start () {
		player = GameObject.Find("GameObject (");
		Player_pos = GetComponent<Transform>().position;
	}
	
	// Update is called once per frame
	void Update () {
		
		rotateAxis = transform.position - Player_pos; 

		transform.RotateAround(player.transform.position,rotateAxis,1f);

		Player_pos = transform.position; 
	}
}


このnoteではうまく動かないときの修正ポイントを書きました。

スクリプトの修正は
パッと見どこが間違っているか分からないので
「動かないときはこのポイントを修正しよう!」という
チェックポイントを持っていると良さそうです。

スクリプトだけだと動きを想像するしかないし面白くないですよね...。
でも、修正して思い通りに動かせた時の喜びはめちゃめちゃ大きいです。
頑張っていきましょう!


最後まで読んでいただきありがとうございました。

ぷもんでした!

noteを日々投稿してます! もしいいなと思ってもらえたら サポートしてもらえるとありがたいです。 VRやパソコンの設備投資に使わせていただきます。 ご意見、質問等ありましたらコメントください。 #ぷもん でつぶやいてもらえると励みになります。 一緒に頑張りましょう!