Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
3
Help us understand the problem. What is going on with this article?
@kugipanti

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

More than 3 years have 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()上で初期化するのがいいのかもしれません(・・;)
たぶん初心者ゆえのわけわかめミスなのですが、プログラムを日常的に触っている人からすると当然でしょ?的な話な気もします
しかし、私がつまづいたのでつまづくかたもいると思ったので書きました
参考になってくれたら嬉しいですし、原因など詳しい話があったらそれも聞いてみたいです

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

3
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
kugipanti
千石撫子が大好きです

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
3
Help us understand the problem. What is going on with this article?