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

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


###（1）-①「transform」（transform.Translate）版
　　　▲現在のオブジェクトの位置を基準にして移動

```csharp
    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）版
　　　▲指定した場所へワープさせるのに使う

```csharp
        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」は、面倒くさいくらいの違いかな？  

```csharp
        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とかも上昇してくれる。

```csharp
        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

```csharp
    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でカメラを動かす

```csharp
 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をかけるのか。。
Ｚ方向も、Input.GetAxis("Vertical");で作るのかな？

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


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

参考サイト
[【Unity】オブジェクトを移動させる方法まとめ「Translate, Rigidbody, Vector3」](https://squmarigames.com/2018/11/08/unity-beginner-translate/)
[【Unity基礎】transformを変更してオブジェクトを移動させる2つの方法](https://freesworder.net/unity-transform-move/)
[【Unity(C#)】ゲームオブジェクトを追尾する(MoveToWards)](https://qiita.com/OKsaiyowa/items/167a0a6afa536c33fc38)