CharacterControllerを使ってアスレチックアクションを作ろう

# 今回作るゲーム
![51](http://getabakoclub.com/wp-content/uploads/2018/10/51.png)

# 今回やること
①プレイヤーの移動
②プレイヤーのジャンプ
③プレイヤーからエフェクトを出す
④アイテムを配置する
⑤制限時間を作る


# パッケージのダウンロード
[こちら](https://drive.google.com/file/d/1WUZYkJeQncVHod3KO8c4TWaMLosmMyqb/view?usp=sharing)
よりパッケージをダウンロードしてプロジェクトに入れて下さい

一応[元データ](https://drive.google.com/open?id=1UeQphDBdzur1X0h0baaNUz1KJvU_XQuS)も載っけておきます

プロジェクトの入れ方は[こちら](http://getabakoclub.com/2018/08/29/unity%E3%81%AE%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%82%92%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/)

# プレイヤーの移動
今回はプレイヤーの移動をするために、CharacterControllerというものを使います
このチュートリアルでは事前につけてありますが、本当は自分でつけて、大きさの設定もします
[こちら](http://getabakoclub.com/2018/10/10/unity%E3%81%AE%E4%BE%BF%E5%88%A9%E6%A9%9F%E8%83%BD%E3%82%92%E4%BD%BF%E3%81%84%E3%81%93%E3%81%AA%E3%81%9D%E3%81%86-2-charactercontroller%E3%81%A7%E3%83%97%E3%83%AC%E3%82%A4%E3%83%A4%E3%83%BC%E3%81%AE/)にまとめてあるので自分で一から作成したい場合はご覧ください

### CharacterControllerの説明
①プレイヤーに当たり判定がつく
②階段や坂道の判定を自動で行ってくれる
③characterController.Move(Vector3型の変数)で、プレイヤーを動かす
④characterController.Groundedで、地面についているかどうかを判定できる

### C#の基本的なルールと構造の説明
Unityで使うC#にはいくつかルールがあります。それは以下の通りですが、

①どのような種類のコードをどこに入力するのか

②エリアとエリアは{}でとじる

この2点をおさえておけば、Scratchと大差ありません！！
![図4-1.png](http://getabakoclub.com/wp-content/uploads/2018/08/図4-1.png)

### プレイヤーの移動のプログラミング
プレイヤーの移動は
![図2](http://getabakoclub.com/wp-content/uploads/2018/08/図2.png)
のようにしていきます

早速、Assets → ScriptsにあるPlayerスクリプトをダブルクリックして開きます
![1-2](http://getabakoclub.com/wp-content/uploads/2018/10/1-2.png)

では実際に、表を参考にしながらコードを書いていきましょう。
Scratchのブロックを積む感覚で一行ずつ打っていきます。

![図5.png](http://getabakoclub.com/wp-content/uploads/2018/08/図5.png)

表は[こちら](https://qiita.com/Getabako/items/9efaa6e48c29e7df3a7e)にあります。

以下の画像の四角で囲った部分を参考に入力の手順を見ていきましょう

![図6.png](http://getabakoclub.com/wp-content/uploads/2018/08/図6.png)

①このブロックは「ずっと」ではさまれているので、
**「ゲーム開始後ずっと実行するエリア」**に入力します。

②「もし～なら」を入力していきます。表を見てみると、
![mosihyou.png](http://getabakoclub.com/wp-content/uploads/2018/08/mosihyou.png)
となっています。条件は違うので()の中は空欄にし、
if(){}
と入力しましょう。

③条件は「Wキーが押されたら」です。
![図7.png](http://getabakoclub.com/wp-content/uploads/2018/08/図7.png)
となっていて、今回はSpaceキーではなく、Wキーなので、
if(){}の()の中にInput.GetKey(KeyCode.W))をいれます。

if(Input.GetKey(KeyCode.W))){}
となります。

④実行する内容は「10歩動かす」です。
![図8.png](http://getabakoclub.com/wp-content/uploads/2018/08/図8.png)
となっているので、
if(Input.GetKey(KeyCode.W))){}の{}の中に
transform.position += transform.TransformDirection(Vector3.forward * 10);をいれます。

[su_box title="if文完成形" style="glass"]if(Input.GetKey(KeyCode.W)){transform.position +=　transform.TransformDirection(Vector3.forward * 10);}[/su_box]

となりました。

画面がこんな風になっていれば正解です。
![13-1.png](http://getabakoclub.com/wp-content/uploads/2018/10/13-1.png)

テストプレイをしてWキーをおしてみると…
![14](http://getabakoclub.com/wp-content/uploads/2018/10/14.png)

早すぎて全部突き抜けていきましたね

なので、10の後に「 * Time.deltaTime」を追加で入力しましょう

[su_box title="Time.deltaTimeとは？" style="glass"]Scratchで言う「タイマー」のこと
これを移動の後に入力すると処理の速度が一定になり、ちょうどいい感じになる[/su_box]

同様に他のブロックも入力してみましょう。
再生ボタンを押してエラーがないか、確認しましょう。
![図9.png](http://getabakoclub.com/wp-content/uploads/2018/08/図9.png)

<details><summary>**正解はコチラ♪入力したら答え合わせしましょう。**</summary>
![20.png](http://getabakoclub.com/wp-content/uploads/2018/10/20.png)</details>

### プレイヤーの重力処理とジャンプのプログラミング
CharacterControllerを用いた場合、ジャンプと重力処理に工夫が必要になります
[su_list]<ul>
<li>重力という変数はUnityで用意されているPhysics.gravity.yを使う</li>
<li>地面に触れているかどうかはcharacterController.isGroundedを使う</li>
</ul>[/su_list]
コードをScratchで表すと以下のようになります
なので、右側のコードを表を参考に記述していきましょう
![3-2](http://getabakoclub.com/wp-content/uploads/2018/10/3-2.png)

### 変数をつくる
コードを見てみるとJumpという変数が使われています
![4-2](http://getabakoclub.com/wp-content/uploads/2018/10/4-2.png)

今回はprivateのVector3型のJumpという変数を作ります
変数についてはUnityでは沢山の種類があるので、詳しくは以下を参考にして下さい

<details><summary>**#C#での変数の作り方**</summary>
**①図を参考にして変数を入力していきます。**
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/214359/2a1c05c7-5591-b667-2d37-2a404efb9658.png)
**②変数はアクセス修飾子　型　変数名;と入力します。**
アクセス修飾子については以下を参考にして下さい。
![スライド1.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/d9fe0567-53b3-1f5e-65fd-5977c016ad43.png)
型については以下を参考にして下さい。
![スライド2.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/624cb26a-0389-5d4e-a1c3-0a4ad6062a29.png)
例えば他のオブジェクトでも使用可能なfloat型のgetabakoという変数を作る場合
public float getabako; と入力します。</details>

読むのが面倒くさい人は、以下画像を参考にして、
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/214359/2a1c05c7-5591-b667-2d37-2a404efb9658.png)

private Vector3 Jump;
と入力しましょう
![16](http://getabakoclub.com/wp-content/uploads/2018/10/16.png)


### CharacterControllerを使えるようにする
CharacterControllerを使うには
①変数の部分にprivate CharacterController characterController;を入力
②void Start(){}の中にcharacterController = GetComponent<使用したい機能>();を入力する
![17](http://getabakoclub.com/wp-content/uploads/2018/10/17.png)

### 重力処理を行う
![5-2](http://getabakoclub.com/wp-content/uploads/2018/10/5-2.png)
を入力していきます
**ここからはvoid Update{}の中のプレイヤーの移動の次の行から入力しましょう**

# ジャンプの説明
①ジャンプはCharacterControllerを動かすので、CharacterControllerを動かす命令を入力
②CharacterControllerはcharacterController.Move (作成したVector3型の変数);で動かす
③GravityはUnityではPhysics.gravity.yと入力する
④Jumpをy軸の方向に重力の分だけ変えるので
Jump.y　+= Physics.gravity.y;と入力する
⑤このままだと重力がかかりすぎるので、Time.deltaTimeをかける
⑥地面に触れたときにJumpを0にするのはUnityの当たり判定が勝手にやってくれる
![18](http://getabakoclub.com/wp-content/uploads/2018/10/18.png)

### ジャンプを実装する
![9-1](http://getabakoclub.com/wp-content/uploads/2018/10/9-1.png)
を入力していきます
ジャンプは地面についている時のみ出来るようにするので、
if(characterController.isGrounded){}を入力します

{}の中にはプレイヤーの移動の時のようにif文を作成し、スペースキーがおされたらという条件を()に入力し、{}にはJumpを3にする命令を入力します
![21](http://getabakoclub.com/wp-content/uploads/2018/10/21.png)

テストプレイをしてみると…Wキーで前進、Sキーで後退、ADキーで方向転換、スペースキーでジャンプができますね
![22](http://getabakoclub.com/wp-content/uploads/2018/10/22.png)

# プレイヤーからエフェクトを出す
AssetStoreを開きます
Window → General → AssetStoreをおします
![23](http://getabakoclub.com/wp-content/uploads/2018/10/23.png)

左上をパーティクルに変更し、検索欄にfreeと入力して虫眼鏡のボタンをおします
![24](http://getabakoclub.com/wp-content/uploads/2018/10/24.png)

気に入ったパーティクルを選んで、パーティクルの名前をクリックします
![25](http://getabakoclub.com/wp-content/uploads/2018/10/25.png)

インポートをおします
![26](http://getabakoclub.com/wp-content/uploads/2018/10/26.png)

importをおします
![27](http://getabakoclub.com/wp-content/uploads/2018/10/27.png)

どんなエフェクトを出したいか決めます
importをしたパーティクル → Scene → Sceneをダブルクリックしてシーンを開きます
再生ボタンを押してパーティクルをダブルクリックするとそのパーティクルによるのでどれがどれだか分かります
![29](http://getabakoclub.com/wp-content/uploads/2018/10/29.png)

シーンを戻し、importをしたパーティクル → Prefabs → 好きなパーティクル を選んでPlayerにD&Dしましょう
![28](http://getabakoclub.com/wp-content/uploads/2018/10/28.png)

左上のアイコンをおして移動させたり回転させたりしてちょうどいい位置にしましょう
![30](http://getabakoclub.com/wp-content/uploads/2018/10/30.png)

いい感じになりました
![31](http://getabakoclub.com/wp-content/uploads/2018/10/31.png)

# アイテムを配置する
Item →　PrefabsにあるアイテムをD&Dします
![32](http://getabakoclub.com/wp-content/uploads/2018/10/32.png)

座標を調整します。xは0、yとzは取りやすい位置にするのがオススメです
![33](http://getabakoclub.com/wp-content/uploads/2018/10/33.png)

いっぱい置いてステージを豪華にしましょう。取れば得点が入るように準備はしてあります
![34](http://getabakoclub.com/wp-content/uploads/2018/10/34.png)

# 制限時間をつくる
ここはまず、自分で考えてみましょう。
※ヒント：public float TimeLimit;という変数を作ります
         小数を使う場合、必ず最後にfをつける　例：0.1f
![12](http://getabakoclub.com/wp-content/uploads/2018/10/12.png)

<details><summary>**制限時間の正解**</summary>
![38](http://getabakoclub.com/wp-content/uploads/2018/10/38.png)</details>

成功していれば、LimitTimeが0になったらスタートに戻されます
![50](http://getabakoclub.com/wp-content/uploads/2018/10/50.png)

お疲れ様でした♪

# プログラミングの完成プロジェクト
[こちら](https://drive.google.com/open?id=1WmJPhXMnslXPPT12o3wdYfBzdnXYZttu)にありますのでご自由にどうぞ♪