hamsterの移動および制御
アニメーションの用意ができましたので、hamsterを動かしていきます。
ここから作業を開始したい場合は、「project_009_001.unitypackage」をインポートして開始してください。
アニメーションの制御
Scriptの追加
アニメーションの設定が終わりましたので、hamsterのアニメーションと移動を制御するコードを記述していきます。
HierarchyウィンドウまたはSceneウィンドウからhamsterを選択した状態で、Inspectorウィンドウの「Add Component」をクリックします。名前をHamsterManager、言語をCSherpに設定して「Create and Add」をクリックします。
Projectウィンドウを確認して、HamsterManagerスクリプトがScriptsフォルダー以外に作成された場合はScriptsフォルダーに移動します。
hamsterの移動処理
HamsterManagerを以下のように編集します。
using UnityEngine; using System.Collections; public class HamsterManager : MonoBehaviour { // 左向きかどうか private bool _isLeftMove; private float _movePoint = 0.1f; // Use this for initialization void Start() { this._isLeftMove = true; } // Update is called once per frame void Update() { var position = this.transform.position; if (this._isLeftMove == true) { position.x -= this._movePoint; } else { position.x += this._movePoint; } transform.position = position; } }
デバッグ実行するとハムスターが左にゆっくりと移動します。そのまま床から落下してしまいますが、この後落下については処理を追加していきます。
transform.position
キャラクターの移動は以下のようにAddForceメソッドを利用していました。
/// <summary> /// キャラクターを移動させる /// </summary> /// <param name="force">移動させる方向と値</param> private void _moveCharactor(Vector2 force) { this._charactor.rigidbody2D.AddForce(force); }
これはキャラクターの「GameObjectに力を加える」という処理でした。今回はそれとは異なり、座標を変更することで移動を表現しています。
var position = this.transform.position; if (this._isLeftMove == true) { position.x -= this._movePoint; } else { position.x += this._movePoint; } transform.position = position;
この場合、hamsterは一定間隔を等速で移動しているように表示されます。
hamsterを床から落ちないようにする
hamsterは床から落下せずに、床の端に来たら反転して逆方向に移動するようにします。hamsterが床の端に到着したかどうかの判定には、透明なGameObjectを利用します。
透明なGameObjectを作成する
Hierarchyウィンドウ上で「右クリック」→「Create Empty」をクリックします。GameObjectがHierarchyウィンドウに追加されるので「leftHitArea」に名前を変更します。
leftHitAreaを選択した状態でInspectorウィンドウのAdd Componentをクリック、「Physics 2D」→「Box Collider 2D」をクリックします。
leftHitAreaを床の左端に配置します。
Scriptを修正する
HamsterManager.csに以下のメソッドを追加します。
public void OnCollisionEnter2D(Collision2D col) { if (col.gameObject.name == "leftHitArea") { this._isLeftMove = false; var animator = this._hamster.GetComponent<Animator>(); animator.Play("hamster_move_right"); } }
これはhamsterがleftHitAreaに触れたらキャラクターの移動方向とアニメーションを右向きに変更するという処理になります。デバッグ実行すると、左側に移動したhamsterが床の左端で方向を変えて右側に移動します。
rightHitAreaを追加する
最後に、同様に右側にも透明な壁を追加して、スクリプトを修正します。GetComponent<Animator>()の処理を毎回呼び出さないようにStart()メソッドに移動しました。
using UnityEngine; using System.Collections; public class HamsterManager : MonoBehaviour { // 左向きかどうか private bool _isLeftMove; private float _movePoint = 0.1f; private GameObject _hamster; private Animator _animator; // Use this for initialization void Start() { this._isLeftMove = true; this._hamster = GameObject.Find("hamster"); this._animator = this._hamster.GetComponent<Animator>(); } // Update is called once per frame void Update() { var position = this.transform.position; if (this._isLeftMove == true) { position.x -= this._movePoint; } else { position.x += this._movePoint; } transform.position = position; } public void OnCollisionEnter2D(Collision2D col) { if (col.gameObject.name == "leftHitArea") { this._isLeftMove = false; this._animator.Play("hamster_move_right"); } else if (col.gameObject.name == "rightHitArea") { this._isLeftMove = true; this._animator.Play("hamster_move_left"); } } }
デバッグ実行すると、ハムスターが床の上を左右に移動するのが確認できます。
ただしこのままだと、操作するキャラクターがハムスターの制御用に作成した透明なGameObjectの上に乗ってしまいます。
この問題の解決方法は後編で紹介します。
まとめ
今回は画面にターゲットキャラクター(hamster)を配置して床の上を落ちずに移動する処理を実装しました。その中で、GameObjectの座標を変更して移動させる処理と、透明なGameObjectを判定に利用して移動範囲を制限する方法を紹介しました。
次回はプレイヤーが操作するキャラクターがターゲットキャラクターを捕まえる処理の実装と、先述のキャラクターまでが透明なGameObjectの影響を受けてしまう問題の回避方法を紹介します。