(1)3Dカメラを方向キーで操作するの実験


ヤルこと:今回は移動のみで、「transform」「Vector3」「Rigidbody」での違いを体感してみる。

(1)-①「transform」(transform.Translate)版

   ▲現在のオブジェクトの位置を基準にして移動

    void Update()
    {
        //キー入力があったら、カメラ位置を更新する
        //キー入力(上_Y軸+)
        if (Input.GetKey(KeyCode.UpArrow))
        {
            this.transform.Translate(0f, 0.1f, 0f);
        }
        //キー入力(下_Y軸-)
        if (Input.GetKey(KeyCode.DownArrow))
        {
            this.transform.Translate(0f, -0.1f, 0f);
        }
        //キー入力(左_X軸+)
        if (Input.GetKey(KeyCode.LeftArrow))
        {
            this.transform.Translate(-0.1f, 0f, 0f);
        }
        //キー入力(右_X軸-)
        if (Input.GetKey(KeyCode.RightArrow))
        {
            //Vector3宣言せずに通るのが謎だったのでVector3を利用した形をテスト
            Vector3 rightArrow = new Vector3(0.1f, 0f, 0f);
            //この形しか通らない?
            this.transform.Translate(rightArrow);
        }
        //キー入力(右_Z軸+)
        if (Input.GetKey(KeyCode.W))
        {
            this.transform.Translate(0, 0f, 0.1f);
        }
        //キー入力(右_Z軸-)
        if (Input.GetKey(KeyCode.S))
        {
            this.transform.Translate(0f, 0f, -0.1f);
        }
    }

(1)-②「transform」(transform.position)版

   ▲指定した場所へワープさせるのに使う

        if (Input.GetKeyDown(KeyCode.UpArrow))
        {
            Vector3 posItion = this.gameObject.transform.position;
            this.gameObject.transform.position = new Vector3(posItion.x , posItion.y + 1.0f, posItion.z);
                          //👆2:移動量を毎回更新する
   Debug.Log(posItion);
            /*this.gameObject.transform.position = new Vector3(posItion.x, posItion.y + 1.0f, posItion.z);「だけ」だと、毎回(0,0,0)
             ■なんで無いと毎回(0,0,0)その際、Vector3 posItion = this.gameObject.transform.position;はvoid Startに記載した。  
   →なんとなく、Updateに書かないと毎回更新されないからかな?*/          
        }

見た目ほぼ一緒なので、Vector3を毎回宣言して更新するのが「transform.position」は、面倒くさいくらいの違いかな?

        if (Input.GetKeyDown(KeyCode.UpArrow))
        {
            //Vector3宣言 + posItion変数にtransformコンポーネントを取得
            Vector3 posItion = this.gameObject.transform.position;
            Debug.Log(posItion);
            this.gameObject.transform.position = new Vector3(0f, 10f, 0f);
            Debug.Log(gameObject.transform.position);
            //posItionの値は更新されない
            Debug.Log(posItion);
        }

※上は更新されて、どんどん上昇する、下は1回ポッキリの書き方。

(1)-③Vector3 を使わなくてもtransform.upとかも上昇してくれる。

        if (Input.GetKey("up"))
        {
            transform.position += transform.up * 1f * Time.deltaTime;
        }

②はVecter3な気がするけど。

ここまでのまとめ(覚えたこと)
・transform.Translate(0f, 0.1f, 0f);は今いる位置から、XYZの動かしたい方向の値を入力して使う。【Vector3不要】
・transform.positionは指定した場所へワープさせるのに使う
・Vector3は直接更新出来ない。Vector3変数にtransformを1回入れて、そのtransformを新しい移動用newVector3で更新するややこしい作り
・transform.positionにtransform.upなどで更新することもできる【Vector3不要】

(2)「Vector3」の研究 Vector3.MoveTowards

    Vector3 direction = new Vector3(10f, 10f, 10f);
    float speed = 1.0f;
    void Start()
    {
    }
    // Update is called once per frame
    void Update()
    {
        float step = speed * Time.deltaTime;
        transform.position = Vector3.MoveTowards(transform.position, direction, step);
        Debug.Log(transform.position);
        //追尾(移動)したいオブジェクトのポジション = Vector3.MoveTowards(追尾(移動)したいオブジェクトのポジション, ターゲットのポジション, 移動速度)
    }

ここまでのまとめ(覚えたこと)
・Vector3(この場合direction)でターゲットポジションを設定するとそこに向かって移動を開始する。
・カメラが追尾(移動)したいオブジェクトで
・Vector3 directionがターゲットのポジション
・ 移動速度はspeed変数にTime.deltaTimeをかけて均一の速度を提供

(3)「Vector3」の研究 Rigidbody.AddForceでカメラを動かす

 Rigidbody takaRb;
  void Start()
    {
        //takaRbに、リジッドボディを取得
        takaRb = GetComponent<Rigidbody>();
    }
    void FixedUpdate()
    {
        //横と縦方向に-1から1までの数値を返す
        float takaX = Input.GetAxis("Horizontal");
        float takaY = Input.GetAxis("Vertical");
        //入力した分の力を加える
        takaRb.AddForce(takaX, takaY, 0);
    }

ぬるっと動く。
それでspeedをかけるのか。。
Z方向も、Input.GetAxis("Vertical");で作るのかな?

→Z方向作ると、斜めに移動する
 上下左右、奥手前左右に制限されるのか?違うのがあるのか?

ここまでのまとめ(覚えたこと)
・Rigidbodyでもカメラは動く
・ただ、4方向だけっぽい
・Input.GetAxisは-1から1までの数値を返してくれる
・speed変数を設定して、takaXとかに掛けてやると「ぬるっと」が「きりっと」になる予定

参考サイト
【Unity】オブジェクトを移動させる方法まとめ「Translate, Rigidbody, Vector3」
【Unity基礎】transformを変更してオブジェクトを移動させる2つの方法
【Unity(C#)】ゲームオブジェクトを追尾する(MoveToWards)