0 支持
72 閲覧

Unity使い始めた初心者です。キャラ移動のC#スクリプトで、Rigidbody型の変数rb宣言してGetComponentで代入、最終的にrb.velocityに値を代入するというのを見ながら作ったのですが、変数の中の値が変わっただけに思えます。オブジェクトのRigidbodyに値を返してる仕組みがわからないので教えて頂けませんか。

初心者 (160 ポイント) | 72 閲覧

ログインまたはユーザー登録してから回答してください。

回答 1

+1 支持

少し質問の意図がわかりにくいですね。

ソースコードをGameObjectにアタッチしていますか?

また、そうでない場合、ソースコードの記載をお願いします。

初心者 (320 ポイント)
0
回答ありがとうございます。意図通りに動かないわけではなくて、そのコードでうまく動作する理由が理解できていないという趣旨の質問です。(わかりにくくて申し訳ないです)

public Rigidbody rb;
void Start()
{
   rb = GetComponent<Rigidbody>(); ・・・①
}
void FixedUpdate()
{
   if (Input.GetKey("up"))
   {
      rb.velocity = new Vector3(0, 10.0f, 0); ・・・②
    }
}

一部抜粋ですがこのようなコードです。(調べつつ書きました)
①で変数rbにRigidbodyの値を入れて、②で変数rb内の速度の項目をいじっているように見えるのですが、その解釈だと変数の値が変わっただけで、オブジェクトのコンポーネントには反映されないのでは…と思って、値渡しの仕組みが疑問です。
+1
Rigidbodyをはじめとするコンポーネントに付随している変数に値を代入すれば、Unity側で勝手にその変数に応じて振る舞いを変えてくれます。変数の値を変えるだけで、GameObjectの動きが種々雑多に変化します。
0
そうだったんですね。納得しました。ありがとうございます!
0
追加ですみません。自動でコンポーネントの値を変数に対応させてくれるというのは、GetComponent関数を用いたときのみのシステムなんでしょうか。

void Update()
    {
        Vector3 pos = transform.position;・・・①
        pos.y = 0.0f;
        transform.position = pos;・・・②
    }

上のコードで②を消してみたところ実行されなかったので違いが気になりました。
+1
transformに関しては全てのGameObjectに最初から存在するので、GetComponent関数は必要ありません。

また、上記のコードでは(2)がtransformの変数に値を代入するコードです。これがなければ実行されません。
0
Transformコンポーネントとtransform変数を同一視してしまっていました...。理解出来てスッキリしました。ありがとうございます!

関連する質問

+1 支持
1 回答
Enigmantohihi 初心者 (190 ポイント) 2/13 質問 | 184 閲覧
0 支持
1 回答
0 支持
1 回答
0 支持
1 回答
suraimu1230 初心者 (250 ポイント) 1/20 質問 | 45 閲覧
2021-02-08 質問・回答をMarkdownで入力できるようにしました。
2020-09-03 新たなスパム対策を導入しました。

114 質問

121 回答

137 コメント

146 ユーザー