Unity界隈では話題の「ユニティちゃん」に手を出してみました。
ここからすぐに使えるプロジェクトがダウンロードできるのですが、今回は2Dバージョンのスクリプト[UnityChan2DController]を見て勉強をしようと思います。
【過去回】 【Unity 2D】2Dユニティちゃんのスクリプトを勉強する-その1 | albatrus.com 【Unity 2D】2Dユニティちゃんのスクリプトを勉強する-その2 | albatrus.com
RequireComponent
スクリプトを上にある[RequireComponent]とは何か。 これはスクリプトに必要なコンポーネント(RigidBodyなど)を明示しています。もし、コンポーネントがない場合は、自動的にコンポーネントを追加してくれます。 [c] [RequireComponent(typeof(Animator), typeof(Rigidbody2D), typeof(BoxCollider2D))] [/c] 使い所としては、スクリプト内でGameObjectを作成(instance)し、スクリプトを割り当てる際に便利な感じです。
Jump
ジャンプは以下のスクリプトで行っています。 ジャンプを割り当てられたボタンを押す(bool jump = true)の時に、地面に接している場合 [Jump]トリガーを起動して、RigidBody2Dに力を加えています。 [c]
public float jumpPower = 1000f;
void Move(float move, bool jump){
//jump Action if (jump && m_isGround){
m_animator.SetTrigger("Jump");
m_rigidbody2D.AddForce(Vector2.up * jumpPower);
} }
[/c]
キーボードの割り当て
[ユニティちゃん]のスクリプトでは、スペースキーを押した場合にジャンプします。 [c]
//ここでBool型の判定を行っている bool jump = Input.GetButtonDown("Jump");
[/c]
GetBuutonDown()にどのキーが割り当て割れているか調べる場合、Unityの[ProjectSetting]->[Input]を開きます。
そうすると、既にいくつかが登録されています。 今回利用している[Jump]には[Space key]が割り振られています。
ジャンプの高さ調整
ジャンプの高さは次の2つで調整をします。
- スクリプト内の変数(jumpPower:初期値は1000.0f)
- RigidBody2Dの[Gravity Scale]
ダメージ
このスクリプトの最後は「ダメージ」の処理です。 ここでは以前に勉強した「コルーチン」が使われています。 [c] //衝突判定 void OnTriggerStay2D(Collider2D other) { if (other.tag == "DamageObject" && m_state == State.Normal) { m_state = State.Damaged; StartCoroutine(INTERNAL_OnDamage()); } }
//コルーチンの処理 IEnumerator INTERNAL_OnDamage() { m_animator.Play(m_isGround ? "Damage" : "AirDamage"); m_animator.Play("Idle");
SendMessage("OnDamage", SendMessageOptions.DontRequireReceiver);
m_rigidbody2D.velocity = new Vector2(transform.right.x * backwardForce.x, transform.up.y * backwardForce.y);
yield return new WaitForSeconds(.2f);
while (m_isGround == false)
{
yield return new WaitForFixedUpdate();
}
m_animator.SetTrigger("Invincible Mode");
m_state = State.Invincible;
}
[/c]
衝突判定
衝突判定では[OnTriggerStay2D]を利用しています。 [c] void OnTriggerStay2D(Collider2D other) { //タグ名がDamageObjectかつStateがNomalの時 if (other.tag == "DamageObject" && m_state == State.Normal) { m_state = State.Damaged;
//コルーチンを呼び出す StartCoroutine(INTERNAL_OnDamage()); } } [/c]
また、対象となるGameObjectのタグを変更します。 [is Trigger]にチェックを入れないと反応しません。
コルーチン
メソッドの中で時間の管理ができるのが「コルーチン」です。 色々と条件を設定することで、複雑な処理ができます。 [c] //コルーチンにはIEnumeratorを頭につけます。 IEnumerator INTERNAL_OnDamage() { //ダメージのアニメーションに切り替え m_animator.Play(m_isGround ? "Damage" : "AirDamage"); m_animator.Play("Idle");
//後ろに[ユニティちゃん]を移動させる m_rigidbody2D.velocity = new Vector2(transform.right.x * backwardForce.x, transform.up.y * backwardForce.y);
//条件1 : 0.2f後に下記に記載された処理を行う yield return new WaitForSeconds(.2f);
while (m_isGround == false)
{
//条件2:地上にいない場合は、再度コルーチンを繰り返す
yield return new WaitForFixedUpdate(); } m_animator.SetTrigger("Invincible Mode"); m_state = State.Invincible; } [/c]
条件:yield
条件は以下の様なモノがあります。
- WaitForSeconds : 特定の秒数待機する指示
- WaitForFixedUpdate : FixedUpdate関数が呼び出されるまで待機
今回のダメージ処理に関しては、地上に着くまでダメージのアニメーションを実行しています。
Invincibleアニメーション
[ユニティちゃん]はダメージを受けた場合、一定の時間無敵になります。 [Animator]だと、赤枠の部分です。
実はこの部分のアニメーション[InvincibleMode]は、スプライトを繋ぎあわせた画像の変化ではあります。 ここからは今回初めて知ったのですが、アニメーションとは画像をパラパラ変更するだけではなく、色々な状態変化をコントロールすることができるのです。
点滅
アニメーション[InvincibleMode]は点滅です。
ここでは画像(Sprite)を配置しているのではなく、コンポーネント[SpriteRenderer]を調整しています。
作成方法
今回と同じようなアニメーションを作るにはどうしたらいいのか? 実際に作ってみました。
まずは[Animation window]を開きます。 そこで[Add Curve]を押して下さい。
そうするとGameObjectに追加されているコンポーネントが出てきます。 この中からアニメーションに利用したい値を選びます。 点滅の場合は、コンポーネント[SpriteRenderer]の[Enabled]を選びます。
後は、タイムラインで値を調整して点滅アニメーション作成します。 青い四角形を作成するには、画面上でダブルクリックをして下さい。
コンポーネント[SpriteRenderer]の[Enabled]の場合、チェックを外すとGameObjectが消えます。 これを四角形毎に設定して下さい。
アニメーション途中でスクリプト内の関数を呼び出す
アニメーション中に、特定の関数を呼び出すことができます。 [ユニティちゃん]の例では、点滅が終わった時に下記関数を呼び出しています。 [c] void OnFinishedInvincibleMode() { //点滅が終わったら、Normal状態にしている m_state = State.Normal; } [/c]
設定方法
これも実はとても簡単に設定ができます。 下記画像の赤枠のボタンを押して下さい。
そうすると関数を選べるWindowが表示されます。 ここでアニメーション途中で呼び出す関数を選択します。
後は、どのタイミングで呼び出すかをタイムライン上で決めてあげるだけです。
最後に
これで、今回参考にした[ユニティちゃん]のスクリプトは全て確認できました。 今から見ると難しいことは何一つやっていなかったです。とても簡単でした。
アニメーションの設定がAfterEffectsみたいに設定できることがとてもびっくりしました。 これなら複雑なアニメーションが簡単に実装できます。 今まではUnityってそこまで凄いとは思っていなかったのですが、このアニメーションはとても便利です。びっくりしました。
明日以降は、[ユニティちゃん]のサンプルゲームの中身を見ていこうと考えています。
Unityではじめる2Dゲーム作り徹底ガイド スマートフォンでも遊べる本格ゲーム開発に挑戦 大野 功二 SBクリエイティブ 2014-10-29 売り上げランキング : 6401 Amazonで詳しく見る |