Skip to content

Instantly share code, notes, and snippets.

@anchan828
Forked from makoto-unity/TempRun.md
Last active August 29, 2015 14:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anchan828/39a2d353bcb3cc765ba3 to your computer and use it in GitHub Desktop.
Save anchan828/39a2d353bcb3cc765ba3 to your computer and use it in GitHub Desktop.

Temp Run

使用するプロジェクト :

完成ゲーム「てんぷらん」 :

とりあえず完成しているゲームを見てみましょう。

環境を揃えましょう

手順通りに説明していきます。

手順  
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 CameraTeddyBearにドラッグ&ドロップしましょう。

再生してみましょう。カメラが追従するようになりました。

障害物を置こう

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(トリガー)**というものを使い障害物はすり抜けるを事をデフォとすることです。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment