0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2020-03-25

ヤルこと:今回は移動のみで、「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)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?