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の影響を受けてしまう問題の回避方法を紹介します。

