Help us understand the problem. What is going on with this article?

『Unity C# 個人用メモ』 WASDや矢印キーでオブジェクトの位置を動かす

自分用メモであり同じような初心者の方へ向けた自分なりの解説
名称がちゃんとあっているのかどうかは正直わかりませn

WASDや矢印キーを入力をしたときに移動させる

適当に作ったゲームオブジェクトにRigidbodyコンポーネントを追加してから
以下の様にスクリプトを書く

public class NewBehaviourScript : MonoBehaviour
{
    //Rigidbody型のrbという変数を作る
    private Rigidbody rb;

    //float型のpowerという変数を作り、3fを代入する
    private float power = 3f;

    private void Start()
    {
        //リジットボディを取得しrbに代入する
        rb = GetComponent<Rigidbody>();
    }

    void Update()
    {
        //キー入力による値を代入(解説は後で
        float x = Input.GetAxisRaw("Horizontal");
        float z = Input.GetAxisRaw("Vertical");

        //↑で代入された値をVector3型のIdouHoukouという変数に代入する
        Vector3 IdouHoukou = new Vector3(x, 0, z);

        //rbに力を加える
        //velocityは質量などの物理演算を無視するときに使う
        rb.velocity = IdouHoukou * power;

        //rbの回転をさせない様にする
        rb.constraints = RigidbodyConstraints.FreezeRotation;

        //移動範囲の制限
        transform.position = new Vector3(
            Mathf.Clamp(transform.position.x, -5f, 5f),
            Mathf.Clamp(transform.position.y,1f,1f),
         Mathf.Clamp(transform.position.z, 5f, 5f));
    }
}

これでWASDや矢印キーを入力したときに移動が出来るようになります

解説コーナー

入力受付

Input.GetAxisRaw("Horizontal");
Input.GetAxisRaw("Vertical");

Input.GetAxisRaw
とは入力された物に対してint型(整数)で-1~1を返す
HorizontalA,D,がUnityに初期設定として登録されており、
Aが入力されている時は-1
何も入力されていない時は0
Dが入力されている時はを返す

同じようにVerticalは、
sが入力されている時は-1
何も入力されていない時は0
wが入力されている時はを返す

つまり先ほど書いた以下の

Vector3 idou = new Vector3(x, 0, z);

new Vector3(x, 0, z)このx部分とz部分に-1,0,1が代入される

動かす

rb.velocity = idou * speed;

とあるので
xの値が-1ならx(-1)*speed(3f)となりx軸-3fの力を加える
xの値が0ならx(0)*speed(3f)となりx軸0の力を加える
xの値が1ならx(1)*speed(3f)となりx軸3fの力を加える
ということになる
y軸も同じ考えなので割愛

転がらないようにする

rb.constraints = RigidbodyConstraints.FreezeRotation;

こちらはゲームオブジェクトのインスペクタ内の
Rigidbodyコンポーネントの下部にある
constraintsという項目の2段目にある
回転するかどうかのチェックマークをスクリプト上でつけているだけなので
チェックマークを付けた場合は記入しなくても問題はありません。(てかチェック付けた方が楽)

移動範囲に制限をつける

transform.position = new Vector3(
            Mathf.Clamp(transform.position.x, -5f, 5f),
            Mathf.Clamp(transform.position.y,1f,1f),
         Mathf.Clamp(transform.position.z, -5f, 5f));

Mathf.Clamp(対象,最小値,最大値)を使用することで
簡単にtransform.positionMathf.Clamp()内の範囲以上には移動できなくなるという処理が作れます
使わない場合

        if (transform.position.x >= -5f)
        {
            transform.position = new Vector3(-5f, transform.position.y, transform.position.z);
        }

こんな感じの物をx,y,zそれぞれ2パターンで合計6回も書くことになるのでMathf.Clampは偉大です

以上

MilkCocoa_oishi-yone
自分用のメモとして理解できるような物を書いていきたいなお続くかはしらぬ('ω')自分で作ったものhttps://youtu.be/V-IuSIZfjmM
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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした