Unity3D
Unity
ゲーム制作
GetComponent

UnityのGetCompornentはMonobehavior上には置いてはいけないらしい?

More than 1 year has passed since last update.

Unity上で何かに力を加えたりするのにRigidbodyを呼び出し、Addforceなどを使用すると思いますが、そこで躓いたので書きます

多分めちゃくちゃ初心者ゆえのミスなんですが、初心者はみんな躓くんじゃないかなと思ったので書きます

何より私がつまづいて、キレかけたのでかきます!


GetCompornentはMonobehaviorに置いたらキレそうになる

私の書いたコードは以下のとおりです


Unity.cs

public class UniversalGravitation : MonoBehaviour {

public GameObject rocket;
Rigidbody rocket_body = rocket.GetComponent<Rigidbody>();
// Use this for initialization
void Start () {
}

// Update is called once per frame
void Update () {
if (Input.GetKey(KeyCode.D))
{
rocket_body.AddForce(0, 100, 0);
}
}
}


まあrocketという名前のGameObjectのRigidbodyを取り出して、キーボードの”D"が押されてる間100の力を加えるという意味で書いてます

publicに指定しているrocketに力を加えたいオブジェクトをUnity上で関連付ければ動くはずだと思ったわけです

しかし以下のエラーが出てきました(´・ω・`)

A field initializer cannot reference the nonstatic field,method,or property

まあわけわかめですわ(;´∀`)

で、いくつか読んだ本に書いてたサンプルコードを思い出したわけです

(´-`).。oO(あれ?そういえばGetCompornentってStart()上にあった気が

ということで少し書き直しました


Unity.cs

public class UniversalGravitation : MonoBehaviour {

public GameObject rocket;
Rigidbody rocket_body; //←ここを定義だけにした
// Use this for initialization
void Start () {
rocket_body = rocket.GetComponent<Rigidbody>(); //←Start()上で代入した
}

// Update is called once per frame
void Update () {
if (Input.GetKey(KeyCode.D))
{
rocket_body.AddForce(0, 100, 0);
}
}
}


こうしたら、動いた~~

なんかStart()上で書き直したらうまくいきました


まとめ

原因はわかりませんが、GetCompornetをMonobehavior上に置くとerrorがでて、Start()上に置くとうまくいきました

もしかしたら、Monobehavior上では変数定義だけにして、Start()上で初期化するのがいいのかもしれません(・・;)

たぶん初心者ゆえのわけわかめミスなのですが、プログラムを日常的に触っている人からすると当然でしょ?的な話な気もします

しかし、私がつまづいたのでつまづくかたもいると思ったので書きました

参考になってくれたら嬉しいですし、原因など詳しい話があったらそれも聞いてみたいです

ここまでお読み下さりありがとうございました