とりあえず完成しているゲームを見てみましょう。
手順通りに説明していきます。
手順 | ||
---|---|---|
1 | レイアウト | 2 by 3 |
2 | Pivot | Global |
Directional Lightを作ります。 ハードシャドウの設定をしましょう。
GameObject → Create Other → Cube
名前を「Ground」としましょう。
適当に縦長になるようにグイーっと大きくしましょう
シーンを保存するのは大事です。
Player/Character/TeddyBear
をシーン上にドラッグ&ドロップしましょう。
位置を(0,0,0)の位置に移動しましょう。
Groundの中に埋もれちゃいましたね。モデルのYを0.5にしてみましょう。うまくGroundの上に立ちました。
カメラの位置をクマの後ろに来るように調整してみましょう。
Positionを(0, 3, -2)、Rotationを(30, 0, 0)にすると期待するカメラの位置になります。
プレイボタンを押して再生してみましょう。何も起こりません。
モデルに動きを与えてみましょう
Assets/Player/Animations/Run
をシーン上のモデルに向けてドラッグ&ドロップしましょう。
再生してみましょう。モデルが奥に走って行きました。
奥に走って行きましたがカメラが動いていないため、どんどんモデルが遠くに行ってしまいます。今回はモデルにカメラを追従させるようにしてみましょう。
ヒエラルキー
を見て、Main CameraをTeddyBearにドラッグ&ドロップしましょう。
再生してみましょう。カメラが追従するようになりました。
GameObject → Create Other → Cube
名前をBlockとします。Groundの幅に収まるように横に細長い障害物を作りましょう。
細かい値を言うと、Positionが(0, 0.7, 4)、Scaleが(4, 0.4, 0.5)になります。
再生してみましょう。すり抜けちゃいました。でも今はこれでいいんです。
モデルが障害物に当たったという判定を実装していきましょう。
モデルにCapsule Colliderをアタッチします。緑の枠がコライダーと言われる物があたったという判定を行えるエリアですが、モデルに対してズレてGroundに埋まってしまっています。
なのでCenterのYを少しずらし、Rudiusを変更して大きさをモデルに合わせましょう。
CenterのYは0.5、Rudiusは0.3に設定します。
次に、モデルにRigidbodyをアタッチします。これで当たり判定の準備が出来ました。再生してみましょう。
おや、再生直後に前に倒れてしまいました。
モデルが前に倒れた理由ですがこれはRigidbodyによって、重力が与えられ、Capsule Colliderの下側が丸いことによって傾いてしまったためです。
今回、モデル、詳しく言えばゲームオブジェクトを傾かせるような実装は行いません。なのでRigidbodyのFreeze RotationでX Y Zにチェックを入れてゲームを再生してみましょう。
前に進みましたね?障害物にぶつかりましたね?
これからこれからモデルと障害物に関係する実装を行っていくのですが、どちらも色が白いので見た目的にわかりにくいです。なので障害物に色を付けてみましょう。
Create -> Materialで新しくマテリアルを作成します。名前をBlockとしましょう。Main Colorを青っぽくしましょう。
そしてそのマテリアルをシーン上の障害物に向けてドラッグ&ドロップします。
これから「ぶつかったらゲームオーバー」というようにモデルが地面に倒れるというアニメーションを追加します。
説明はしませんでしたが、Runアニメーションをモデルに付けた時、Runアニメーションと同じ場所にTeddyBearというものができています。 これは複数のアニメーションを管理するためのアニメーターコントローラーと呼ばれるものです。略してアニメーターとも呼びます。 TeddyBearアニメーションコントローラーをダブルクリックしてAnimatorウィンドウを開きましょう
いま、真ん中辺りにオレンジ色のRunという「ステート」と呼ばれるものがあります。これがゲーム再生時直後に再生されているわけです。
AnimatorウィンドウにAssets/Player/Animations/Dying
をドラッグ&ドロップしましょう。
アニメーションを追加できました。これからこのDyingアニメーションを障害物にぶつかった時に再生させます。
アニメーターに「障害物にぶつかった」ということを伝えるため、パラメーターを作成します。
Animatorウィンドウの左下にParametersという部分があるのでその右側の**+**ボタンをクリックしてください。そうするとさらにメニューが開くので、Triggerを選択します。
名前をDeadにしましょう。
ステートからステートへ移動するにはトランジションを実装しなければいけません。
Any Stateで右クリックしてMake Transitionを選択し、「Dyingステート」をクリックしてトランジションをくっつけましょう。
Any Stateは様々なステートから遷移できる便利なものです。
Transitionの矢印をクリックして、インスペクターにあるConditionsを「Exit Time」から「Dead」に変更します。
さてこれでアニメーター側の設定は出来ました。
スクリプトファイルを作成しましょう。
Create -> C# Script
名前をPlayerにしましょう。
TeddyBearゲームオブジェクトのインスペクターを選択してPlayerスクリプトをインスペクターのAdd Componentボタンへドラッグ&ドロップしましょう
Playerスクリプトの中身を書いていきます。
ですが今回は上にあるメニューのPlayerScript/Step 1
を選択してください。そうすると自動でスクリプトコードが記述されます。
using UnityEngine;
public class Player : MonoBehaviour
{
Animator animator;
void Start ()
{
animator = GetComponent<Animator> ();
}
void OnCollisionEnter (Collision collision)
{
if (collision.gameObject.name == "Block") {
animator.SetTrigger ("Dead");
}
}
}
この状態でゲームを再生させましょう。
障害物にぶつかると倒れましたか?なんだかモデルが地面に埋め込まれちゃってますが今回は気にせずに進みましょう。
Assets/Player/Animations/Vaut
をAnimatorウィンドウにドラッグ&ドロップします。
アニメーションパラメータでBoolを選択し、名前をVautにします。
Runステートの上で右クリックし、「Make Transition」でVautステートに繋げます。
そして、トランジションを「Exit Time」から「Vaut」に変更し条件がtrueであることを確認します。
最後にVautからRunへもトランジションを追加しましょう。
これでアニメーター側の設定は終わりました。
次はスクリプトで矢印キーの上(UpArrow)のキー入力を受け取って飛び越えるアニメーションを再生させます。
今回は上にあるメニューのPlayerScript/Step 2
を選択してください。そうすると自動でスクリプトコードが記述されます。
using UnityEngine;
public class Player : MonoBehaviour
{
Animator animator;
void Start ()
{
animator = GetComponent<Animator> ();
}
void Update ()
{
animator.SetBool ("Vaut", Input.GetKeyDown (KeyCode.UpArrow));
}
void OnCollisionEnter (Collision collision)
{
if (collision.gameObject.name == "Block") {
animator.SetTrigger ("Dead");
}
}
}
この状態で再生させましょう。矢印キーの上を押すと飛び越えるアニメーションが再生されます。ですが実際は飛び越えられずDead判定になってしまいます。
これは飛び越えるアニメーションをしていても当たり判定の範囲は飛び越える前と同じ範囲だからです。
これをどう修正する方法は2パターンあります。
1つは飛び越えるアニメーション再生中、モデルに合わせ当たり判定を行うCapsule Colliderの大きさを変更すること。 もう1つは**Trigger(トリガー)**というものを使い障害物はすり抜けるを事をデフォとすることです。