Unityを習得していくための 3Step チュートリアル     #1 terrainでフィールドを作成、CharacterControllerでのプレイヤーの移動、ジャンプ、Animatorでのアニメーションの遷移

使うプレイヤーは[こちら](https://drive.google.com/drive/folders/1rz4coesneb3nTI9CledMW3KFCt0ytbER?usp=sharing)にありますので、素材欲しい方はダウンロードして下さい

<h1>Terrainでフィールドを作成</h1>

Terrainはゲームの地形を作るツールです
画像のような地形を簡単に作ることができます
<img src="http://getabakoclub.com/wp-content/uploads/2018/09/15.png" alt="15" />

<h2>Terrainを出す</h2>

画像のようにCreateをおして3D ObjectからTerrainを選択します
![①-1.png](https://qiita-image-store.s3.amazonaws.com/0/214359/fbce319a-af3c-d605-fbf6-4d8b626a91f8.png)

真っ白な地面が出たと思います
![6.png](http://getabakoclub.com/wp-content/uploads/2018/09/6.png)

<h2>テクスチャーを貼る</h2>

このままでは真っ白で味気ないのでテクスチャーを貼ります
テクスチャーは素材名(英語) textureとかで検索してダウンロードして下さい

例えば…草原なら grass texture、岩場なら rock texture、砂なら sand texture

ダウンロードしたテクスチャーは画像のようにAssetsをおしてImport New Assetをおして貼りたいテクスチャーを選びます
<img src="http://getabakoclub.com/wp-content/uploads/2018/09/4.png" alt="4" />

そうしたらTerrainを選択し、右側の筆のアイコンをおして、EditTextureをおします
<img src="http://getabakoclub.com/wp-content/uploads/2018/09/5.png" alt="5" />

EditTexturesをおして、左上に出るSelectをおして、Addをおします
dテクスチャーのサイズはSizeのXとYをいじると変えられます
<img src="http://getabakoclub.com/wp-content/uploads/2018/09/6.png" alt="6" />

全体に選択したテクスチャーが貼られました
<img src="http://getabakoclub.com/wp-content/uploads/2018/09/7.png" alt="7" />

<h2>テクスチャーを追加する</h2>

このままだと全部草原になってしまうので先程のように必要なテクスチャーをダウンロードして入れましょう
追加の仕方も先程と同じです。土と、岩を追加してみました
<img src="http://getabakoclub.com/wp-content/uploads/2018/09/8.png" alt="8" />

画像のように好きな筆とテクスチャを選択すれば、地形を好きなテクスチャで塗ることが出来ます
<img src="http://getabakoclub.com/wp-content/uploads/2018/09/9.png" alt="9" />

<h2>地形を作る</h2>

画像のように各ブラシを選んで地形を作っていきましょう
一番左のブラシは尖った山になり、その右のブラシは頂上が平らになります。
<img src="http://getabakoclub.com/wp-content/uploads/2018/09/10.png" alt="10" />

今回はこんな感じにしてみました♪
<img src="http://getabakoclub.com/wp-content/uploads/2018/09/11.png" alt="11" />

<h1>CharacterControllerの説明</h1>
今回はCharacterControllerというものを使って、プレイヤーの移動とジャンプを実装していきたいと思います

#CharacterControllerとは？
**①取り付けたオブジェクトにはカプセル状の当たり判定(CapsuleCollider)がつく**
**②傾斜や段差の判定を自動で行ってくれる**

とりあえず、3D空間をいい感じに歩き回れてジャンプとかもさせたいんだ！という方にオススメです

# 素材を入れる
[こちら](https://drive.google.com/file/d/1aJdFVi2Xez8UX1BWRNwZik4MVkK-HU-Q/view?usp=sharing)よりダウンロードして使って下さい
とりあえずはプレーンな棒人間にしてあるのでUnityの操作に慣れたら是非自分で作ってみて下さい

<h1>プレイヤーをフィールドに出す</h1>
画像のようにプレイヤーの待機アニメーションをドラッグ&ドロップします
<img src="http://getabakoclub.com/wp-content/uploads/2018/10/1.png" alt="1" />

<h1>プレイヤーとカメラの位置を調整する</h1>
赤枠内の数字をいじってプレイヤーをスタート地点に移動させます
![②.png](https://qiita-image-store.s3.amazonaws.com/0/214359/c7695ef2-0528-926a-4928-df0bee2356f4.png)

同様にカメラをプレイヤーの後ろに移動させます
<img src="http://getabakoclub.com/wp-content/uploads/2018/10/3.png" alt="3" />

<h1>CharacterControllerを取りつける</h1>
プレイヤーを選択して、AddComponentをおします
下の検索欄に｢ch｣と入力して、CharacterControllerを選択します
<img src="http://getabakoclub.com/wp-content/uploads/2018/10/4.png" alt="4" />
<h1>CharacterControllerを調整する</h1>
CharacterControllerには当たり判定の役割もあります
なのでその当たり判定がちょうどプレイヤーの頭、胴体、足を包み込むように調整しましょう
画像のように当たり判定のY座標や半径、高さを調整しましょう
<img src="http://getabakoclub.com/wp-content/uploads/2018/10/5.png" alt="5" />

<h1>プレイヤーを移動させる</h1>
では、プログラミングをしていきます
CharacterControllerにはcharacterController.MoveとcharacterController.isGroundedというCharacterController独自のコードがありますので覚えておきましょう

# characterController.Move();
**①CharacterControllerを移動させる**
**②()の中にはVector3型の変数を入れる**

# characterController.isGrounded;
**①CharacterControllerが地面についているか判定する**
**②if(characterController.isGrounded){}のように使う**

また、上記のようなコンポーネント独自のコードを扱う場合、

**①コンポーネントの機能を代入する変数を作成**
**②コンポーネントの値を作成した変数に代入**
**③実際に値を操作**

という手順を踏みます
スクリプトの作り方やプレイヤーにつける方法、スクリプトの書き方は[こちらの漫画](http://getabakoclub.com/2019/01/18/%E6%BC%AB%E7%94%BB%E3%81%A7%E5%88%86%E3%81%8B%E3%82%8Bunity%e3%80%801%E5%9F%BA%E6%9C%AC%E6%93%8D%E4%BD%9C%E7%B7%A8/)に出てきますので参考にして下さい

今回作成するスクリプトはScratchで表すとこんな感じになります
![ws1.png](https://qiita-image-store.s3.amazonaws.com/0/214359/fac028cb-2634-fd1a-3cce-259983e0485a.png)

[こちら](https://qiita.com/Getabako/items/9efaa6e48c29e7df3a7e)に対応表がありますので参考にしながら記述していきましょう

以下スクリプトです

```csharp:Player.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{

    private CharacterController characterController;//①CharacterControllerの機能を使うためにcharacterControllerという変数を作成
    private Vector3 Velocity;//CharacterControllerを動かすためのVector3型の変数を作成
    [SerializeField]
    private float JumpPower;
    [SerializeField]
    private float MoveSpeed;//移動スピードを入れるための変数

    // Use this for initialization
    void Start()
    {
        characterController = GetComponent<CharacterController>();//②characterControllerにCharacterControllerを代入する
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKey(KeyCode.W))//Wキーがおされたら
        {
            characterController.Move (this.gameObject.transform.forward * MoveSpeed * Time.deltaTime);//前方にMoveSpeed * 時間経過分動かす
        }
        if (Input.GetKey(KeyCode.S))
        {
            characterController.Move (this.gameObject.transform.forward * -1 * MoveSpeed * Time.deltaTime);//後方にMoveSpeed * 時間経過分動かす
        }
        if (Input.GetKey(KeyCode.A))
        {
            transform.Rotate(new Vector3(0, -5, 0));//左回転する        
        }
        if (Input.GetKey(KeyCode.D))
        {
            transform.Rotate(new Vector3(0, 5, 0));//右回転する        
        }

       characterController.Move (Velocity * Time.deltaTime);//characterControllerを常にVelocity * Time.deltaTime分動かす

		Velocity.y += Physics.gravity.y * Time.deltaTime;//Velocityのy軸をPhysics．gravity．y * 時間の経過分動かす
		if (characterController.isGrounded) {//もしcharacterControllerが地面に着いたら
			if (Input.GetKeyDown (KeyCode.Space)) {//もしSpaceキーがおされたら
				Velocity.y = JumpPower;//Velocity.yをJumpPowerにする
			}
		}
    }
}
```

入力し終わったらJumpPower、MoveSpeedに数値を入力してみましょう(お好みで調整してほしいですが、オススメは4、10です)
また、カメラをプレイヤーにドラッグ&ドロップします
！[1-4.png](http://getabakoclub.com/wp-content/uploads/2018/10/1-4.png)

<h1>AnimatorControllerの説明</h1>

名前の通りキャラクターのアニメーションを切り替えます
例えば何もしてない時は、待機アニメーションにしたり、移動キーがおされたら、走るアニメーションに切り替えたりします
切り替えは変数を使って行います

<h1>AnimatorControllerの作成</h1>

まずは、AnimatorControllerを作成します
画像のように、右クリック → Create → AnimatorControllerで作成します
<img src="http://getabakoclub.com/wp-content/uploads/2018/10/1-1.png" alt="1-1" />

続いて、Playerと名前をつけて、プレイヤーにドラッグ&ドロップします
<img src="http://getabakoclub.com/wp-content/uploads/2018/10/2.png" alt="2" />

<h1>AnimatorControllerの設定</h1>

<h3>AnimatorControllerにアニメーションをいれる</h3>

作成したAnimatorControllerをダブルクリックして開き、各アニメーションのデータをD&amp;Dします
<img src="http://getabakoclub.com/wp-content/uploads/2018/10/3-1.png" alt="3-1" />

<h3>アニメーションの名前を変更する</h3>

ドラッグ&ドロップしたアニメーションを選択し、名前を分かりやすいように変更します
今回は待機アニメーションをWait、走るアニメーションをRun、攻撃アニメーションをAttackに変更しました
<img src="http://getabakoclub.com/wp-content/uploads/2018/10/4-1.png" alt="4-1" />

<h3>アニメーションが繰り返し再生するようにする</h3>

アニメーションには繰り返し再生するものと単発で終わるものがあります
繰り返し再生するもの(今回の場合は待機、走り)はアニメーションをダブルクリックし、Loop Timeにチェックをいれます
<img src="http://getabakoclub.com/wp-content/uploads/2018/10/5-1.png" alt="5-1" />

<h3>アニメーションを矢印で結びつける</h3>

アニメーションは矢印で結んで遷移させます
今回は待機→走り、待機→攻撃、走り→攻撃、走り→待機、攻撃→待機とつなぎます
まずは待機で右クリックし、Make Transitionをおします
<img src="http://getabakoclub.com/wp-content/uploads/2018/10/6-1.png" alt="6-1" />

続いて、走りの方まで矢印をひっぱり、走りで左クリックして確定します
<img src="http://getabakoclub.com/wp-content/uploads/2018/10/7.png" alt="7" />

同様に待機→攻撃、走り→攻撃、走り→待機、攻撃→待機もつなぎましょう
<img src="http://getabakoclub.com/wp-content/uploads/2018/10/8.png" alt="8" />

<h3>アニメーションを遷移させる変数をつくる</h3>

アニメーションの遷移は変数で管理します
そのための変数を作ります
＋をおして、変数の型をBoolにします
<img src="http://getabakoclub.com/wp-content/uploads/2018/10/9.png" alt="9" />
変数の名前はRunにしておきます
<img src="http://getabakoclub.com/wp-content/uploads/2018/10/10.png" alt="10" />
同様にAttackという変数も作りましょう
<img src="http://getabakoclub.com/wp-content/uploads/2018/10/11.png" alt="11" />

<h3>アニメーションを遷移させる条件を設定する</h3>

各変数がどうなっていたら遷移をするのかを設定します
まずは、待機→走りの矢印を選択します
そうすると右側に設定画面が開くので、Has Exit Timeのチェックを外します
Has Exit Timeはチェックを付けた場合、前のアニメーションを最後まで再生してから切り替えます
チェックを外した場合は、遷移の条件が切り替わった時に、前のアニメーションを中断して次のアニメーションに切り替わります
Conditionsは＋をおしてRunをtrueにします

![true.png](http://getabakoclub.com/wp-content/uploads/2019/01/true.png)

同様に走り→待機、待機→攻撃、攻撃→待機の条件も設定します
設定の条件は以下の通りです

![seni.png](http://getabakoclub.com/wp-content/uploads/2019/01/seni.png)

<h3>設定した変数をスクリプトで制御する</h3>

こちらもCharacterControllerの時と同様に
**①コンポーネントの機能を代入する変数を作成**
**②コンポーネントの値を作成した変数に代入**
**③実際に値を操作**

という手順を踏みます

スクリプトにコメントでそれぞれの該当する部分を書いておきましたので参考にしてください

簡単に説明するとWASDキーで移動している時はRunをtrue、キーが離された時はRunをfalse、
同様に攻撃のボタンであるマウスが左クリックされたらAttackがtrue、離されたらAttackがfalseになるようになっています

```csharp:Player.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{

    private CharacterController characterController;
    private Vector3 Velocity;
    [SerializeField]
    private float JumpPower;
    [SerializeField]
    private float MoveSpeed;
    private Animator animator;//①コンポーネントの機能を代入する変数を作成
    
    // Use this for initialization
    void Start()
    {
        characterController = GetComponent<CharacterController>();
        animator =GetComponent<Animator>();//②コンポーネントの値を作成した変数に代入
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKey(KeyCode.W))//Wキーがおされたら
        {
            characterController.Move (this.gameObject.transform.forward * MoveSpeed * Time.deltaTime);//前方にMoveSpeed * 時間経過分動かす
            animator.SetBool("Run", true);//③Runをtrueにする        
        }
        else if (Input.GetKeyUp(KeyCode.W))
        {
            animator.SetBool("Run", false);//③Runをfalseにする
        }
        
        if (Input.GetKey(KeyCode.S))
        {
            characterController.Move (this.gameObject.transform.forward * -1 * MoveSpeed * Time.deltaTime);//後方にMoveSpeed * 時間経過分動かす
            animator.SetBool("Run", true);//③Runをtrueにする        
        } 
        else if (Input.GetKeyUp(KeyCode.S))
        {
            animator.SetBool("Run", false);//③Runをfalseにする
        }

        if (Input.GetKey(KeyCode.A))
        {
            transform.Rotate(new Vector3(0, -5, 0));//左回転する        
        }
        if (Input.GetKey(KeyCode.D))
        {
            transform.Rotate(new Vector3(0, 5, 0));//右回転する        
        }

       characterController.Move (Velocity * Time.deltaTime);//characterControllerを常にVelocity * Time.deltaTime分動かす

		Velocity.y += Physics.gravity.y * Time.deltaTime;//Velocityのy軸をPhysics．gravity．y * 時間の経過分動かす
		if (characterController.isGrounded) {//もしcharacterControllerが地面に着いたら
			if (Input.GetKeyDown (KeyCode.Space)) {//もしSpaceキーがおされたら
				Velocity.y = JumpPower;//Velocity.yをJumpPowerにする
			}
		}
    }
}

```

テストプレイしてみるとこんな感じです♪

![VR1.gif](https://qiita-image-store.s3.amazonaws.com/0/214359/25e926a1-4f38-f6e7-9780-f26dcc932710.gif)

走っている時は、走っているアニメーション、攻撃や待機ポーズもバッチリですね