Corgi Engineの使用方法メモ２～キャラクター能力設定～【Unity】

# キャラ操作を設定しよう
コーギー君にたくさんついてるコンポーネントを紐解いていく試み。

# もくじ

1. **設定する能力の選定**
1. **事前準備**
 2. 動ける範囲を広げよう
 3. 足場素材の設定
 4. コライダーの設定
1. **能力の基礎**
2. **能力①：ジャンプ**
 3. Character HorizontalMovement とは
 4. 歩行速度変更
3. **能力②：ダッシュ**
 4. CharacterJump とは
 5. ジャンプ設定変更
4. **おまけ**
3. **総括と今後**

# 設定する能力の選定
コーギー君がどんなふうに動けるかを選定する。
ひとまず下記のとおりに可愛いコーギーを目指すこととする。
![こんな能力が欲しい！.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332244/09e8e54b-4318-4b03-28ec-bf4aa6bebdca.png)

# 事前準備

### 動ける範囲を広げよう
![フィールド境界を広げる.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332244/3690c132-b59a-93df-fecb-ffb72c3f0abd.png)
**LevelBounds**の範囲をx50、y20、z5ぐらいまで広げる。
欄はLevelManagerコンポーネントの一番下にある。
画面中央の黄色い枠はコーギー君の動ける範囲、白い枠はカメラに写る範囲なので比べながら良い感じに調整するのも楽しい。

### 足場素材の設定
いい加減白い棒の足場は寂しいので草原を用意してみた。Oh！なんて美しい！
下記の画像を保存し、プロジェクトウィンドウにドラッグ&ドロップ。
※画像は練習など自由にお使いください。
![地面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332244/0dc4b36c-524b-e8bd-8e24-b9b8185837cd.png)
地面のスプライトモードを「**複数**」にしてから保存し、そのあとスプライトエディターを開く。
![地面設定１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332244/fc369dfd-f7e5-81f7-55a4-39cc65534b0e.png)
スプライトエディターで画像を切り分ける。
![地面０.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332244/0773c4fd-33cc-8869-fe55-d10734bd3410.png)
切り分けたらさっそく配置だァ！

ドラッグ&ドロップで良い感じの場所に置いた地面たちを**Levels**の子としてまとめておく。
名前も分かりやすいように「地面右端」「地面中央」「地面左端」とかにするとよい。
レイヤーは8:Platformsに指定する。
三つともPlatformsにするのよ！ちなみに親のLevelsのレイヤーをPlatformsにすれば三ついっぺんに変わります。
![レイヤー設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332244/cbdaaaef-387f-5a51-3704-92103beaa06b.png)

ちなみにだがレイヤーの設定を忘れると、「コライダーがあるはずなのにキャラが足場をすり抜けて死ぬ！」という現象が起こります。
どうやら既存のUnityのシステムを上書きしているようだ。

そんなわけで！
出来上がった三つの地面御をプロジェクトウィンドウにドラッグ&ドロップしてプレハブ化してしまえば、素晴らしい足場をいつでもどこでも使い放題だ！

### コライダーの設定
![コライダー設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332244/c176e9a6-2435-8c24-ee7d-b9abe76d2f94.png)
３つの地面プレハブにコライダー（当たり判定）を追加すべし。
値はだいたいこんな感じ。

|   |  中央  |  右端  |  左端  |
| ---- | ---- | ---- | ---- |
|  オフセットx |  0  |  0-0.65  |  -0.6 |
|  オフセットy  |  -0.26  |  -0.26 |  -0.26 |
|  サイズx  |  5.45  |  3.34  |  3.04  |
|  サイズy  |  3.83  |  3.83  |  3.83  |

そして適度に増やす。
![適度に増やした地面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332244/5ecdb803-35f4-17cf-2a3c-dbbb9512398a.png)

# 能力の基礎
さっそくコーギー君を動かしてみよう！
初期設定のコーギー君は以下のキーで動きます。

|   動き  |  キー   |   対応するコンポーネント  |  注意事項    | 
| --- | --- | --- |  --- | 
|  左右移動   |  A もしくは D   |  Character HorizontalMovement   |      | 
|   ジャンプ  |   スペースキー  |  Character Jump   |      | 
|   走り  |  左右移動 + Sift   |   Character Run  |      | 
|  ダッシュ   |  F   |  Character Dash   |   初期設定だと明後日の方向へ飛んでいく   | 
|  見下ろす   |   S  |  Character Crouch   |   しゃがみ機能でもある   | 
|  見上げる   |  W   |   Character Look Up  |      | 
|  ダイブ   |   S + F  |  Character Dive   |   画面が揺れて強そうだが攻撃力は無い   | 
|  ジェットパック   |  2   |  Character Jetpack    |      | 
|  壁にしがみつく   |    壁へ向かって A もしくは D   |  Character Wall Clinging   |      | 
|  壁ジャンプ   |  スペースキー   |   Character Walljump  |      | 

他にも色々能力はあるが今は使えないなり。
念のため、リファレンス用一覧だけ記事の最後に置いとく。

# 能力①：左右移動
ようやく調整に入るなり。
### Character HorizontalMovement とは

コーギー君のプレハブを開いてみると、Character HorizontalMovementというコンポーネントがある。
そこが左右移動の設定となっている。
![左右移動設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332244/1a3aa057-884d-5351-ac6d-99e8b4c4209b.png)
ちなみに！アイコンのところには英語で
> 　このコンポーネントは、基本的な左右の動き、摩擦、および地面の衝突の検出を処理します。
　ここで標準の移動速度、歩行速度、およびジャンプ/落下後にキャラクターが地面にぶつかったときに使用するエフェクトを定義できます。

って書いてあるぞよ。
詳細は下記公式リファレンスへ。（英語注意）
[CharacterHorizontalMovement Class Reference](https://corgi-engine-docs.moremountains.com/API/class_more_mountains_1_1_corgi_engine_1_1_character_horizontal_movement.html)


### 歩行速度変更
イッヌは足が速いのでWalkSpeedを12に。
愚鈍な人間と違って慣性など無視できるのがイッヌなのでInstantAccelerationへチェックを入れる。
コーギー君すごい！！！

# 能力②：ジャンプ
### CharacterJump とは
コーギー君プレハブに付いてるCharacterJumpがジャンプの詳しい設定を担ってる。
![ジャンプ設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332244/244b69c2-34a4-fadb-b59b-7c3a1a8228c4.png)
！アイコンにある注釈は
> 　このコンポーネントはジャンプを処理します。
　ここでは、ジャンプの高さ、ジャンプがボタンの押し込み時間の長さに比例するかどうか、最小滞空時間（プレーヤーがジャンプボタンを離した場合にキャラクターがダウンできるようになるまでに空中に留まる時間）を定義できます。
　ジャンプウィンドウの持続時間（崖から落ちた後もジャンプが可能である時間）、ジャンプの制限、キャラクターが地面に再び触れずに実行できるジャンプの数、すり抜け足場（1-Way Platform）や動く足場を通過するときにコリジョンを無効にする時間など。

とのことです。

### ジャンプ設定変更
コーギー君は足腰が強靭なのでJump Heghtを4に。
空中でジャンプはこの世の摂理に反するからNumper Of Jumpsを1に。
同じ理由でJump Restrictionsを「Can Jump On Greound」（地上でのみジャンプ可能）へ変更する。
ただし崖から落ちたとき成すすべなく死んでしまうので、Jump Time Windowを0.5として落下後0.5秒間は空中ジャンプを許す。

# おまけ

細かな追加設定が必要だが、他にもこんな動きができるらしい。

|   動き 　|   対応するコンポーネント  |  注意事項    | 
| --- | --- | --- |
|   はしごを上る  |   Character Ladder  |  Ladderコンポーネントをはしごに付ける   | 
|  階段を上る   |  Character Stairs   |     |
|   泳ぐ  |  Character Swim   |     |
|   ダイブの拡張版  |  Character SimpleDive   |     |
|  ぶら下がり   |  Character Dangling   |      | 
|   物を掴む  |  Character Grip   |   Gripコンポーネントを物側に付ける    | 
|  物を掴んだり持ち運んだり投げる   |  CharacterGrabCarryAndThrow   |  GrabCarryAndThrowObjectを物側に付ける  |
|  でっぱりを掴む   |  CharacterLedgeHang   |   Ledgeコンポーネント&Collider2Dをでっぱりに付ける  |
|  ブロックを押す   |  Character Push   |  Pushableコンポーネントをブロックに付ける   |
|  他キャラクターを押す   |  Character Push Corgi Controller    |  PushableとCorgiControllerの両方を他キャラクターに付ける   |
|  インベントリを使用   |   Character Inventory  |   InventoryEngineを用意すべし  |
|  武器を使用   |   Character Handle Weapon  |   |
|  セカンダリ武器を使用  |  Character Handle Secondary Weapon   |     | 
|  決定ボタン全般   |  Character Button Activation   | NPCとの会話とかスイッチを押すとかに使えるやつ | 
|   飛行  |  Character Fly   |     |
|  体当たり    |  Character Damage Dash   |   威力のある版ダッシュ   |
|  パラシュートを開く   |  Character Glide   |     |
|  加速する  |   Character Speed  |     | 
|  斜面に直立できるようにする   |  Character SlopeOrientation   |     |
|  つぶれる   |  Character Crush Detection   |   岩が落っこちてきたらダメージ判定、とかに使えるやつ   | 
|  墜落死   |  Character Fall Damage   |   一定以上の高さから落ちたらダメージ判定、とかに使えるやつ   |
| 可変の重力方向を受ける   |  CharacterGravity   |  一部機能は普通の重力方向に沿ってしまう模様   |
|   パーティクル処理  |   Character Particles  |     |
|  複数キャラ使用時の操作入れ替え   |  CharacterSwap、CharacterSwapManager   |     |
|  キャラクター外見変更   |  Character Switch Model   |   プレハブ語と入れ替えたい場合はCharacterSwapManagerの方を使うようだ  |
|  ポーズ（一時停止）   |  Character Pause   |   InputManagerとTimeManagerの二つがシーンに必要   | 
|  強制移動する   |  Character Auto Movement   |  AutoMovementControlZonesで移動方向を操作する   |
|  自動移動   |  Character Follow Path   |  NPC向け。事前設定されたルートを自動移動する   |

# 総括と今後
左右移動とジャンプはできたので、次はパラシュートや頭突きを設定していきたい。