Unity上で何かに力を加えたりするのにRigidbodyを呼び出し、Addforceなどを使用すると思いますが、そこで躓いたので書きます
多分めちゃくちゃ初心者ゆえのミスなんですが、初心者はみんな躓くんじゃないかなと思ったので書きます
何より私がつまづいて、キレかけたのでかきます!
#GetCompornentはMonobehaviorに置いたらキレそうになる
私の書いたコードは以下のとおりです
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()上にあった気が
ということで少し書き直しました
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()上で初期化するのがいいのかもしれません(・・;)
たぶん初心者ゆえのわけわかめミスなのですが、プログラムを日常的に触っている人からすると当然でしょ?的な話な気もします
しかし、私がつまづいたのでつまづくかたもいると思ったので書きました
参考になってくれたら嬉しいですし、原因など詳しい話があったらそれも聞いてみたいです
ここまでお読み下さりありがとうございました