SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

速習 Unity 2Dゲーム開発

速習 Unity 2Dゲーム開発
~第9回 ターゲットキャラクターの表示(前編)

速習 Unity 2Dゲーム開発 第9回

  • X ポスト
  • このエントリーをはてなブックマークに追加

hamsterの移動および制御

 アニメーションの用意ができましたので、hamsterを動かしていきます。

 ここから作業を開始したい場合は、「project_009_001.unitypackage」をインポートして開始してください。

アニメーションの制御

Scriptの追加

 アニメーションの設定が終わりましたので、hamsterのアニメーションと移動を制御するコードを記述していきます。

 HierarchyウィンドウまたはSceneウィンドウからhamsterを選択した状態で、Inspectorウィンドウの「Add Component」をクリックします。名前をHamsterManager、言語をCSherpに設定して「Create and Add」をクリックします。

 Projectウィンドウを確認して、HamsterManagerスクリプトがScriptsフォルダー以外に作成された場合はScriptsフォルダーに移動します。

Scriptの追加
Scriptの追加

hamsterの移動処理

 HamsterManagerを以下のように編集します。

hamsterの移動処理
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に力を加える」という処理でした。今回はそれとは異なり、座標を変更することで移動を表現しています。

hamsterの座標を変更する
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」に名前を変更します。

空のGameObjectを追加
空のGameObjectを追加

 leftHitAreaを選択した状態でInspectorウィンドウのAdd Componentをクリック、「Physics 2D」→「Box Collider 2D」をクリックします。

 leftHitAreaを床の左端に配置します。

leftHitAreaの位置を変更
leftHitAreaの位置を変更

Scriptを修正する

 HamsterManager.csに以下のメソッドを追加します。

hamsterの座標を変更する
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()メソッドに移動しました。

HamsterManager.cs全文
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の上に乗ってしまいます。

キャラクターまでが透明なGameObjectに
乗ってしまう(期待した動作ではない)
キャラクターまでが透明なGameObjectに乗ってしまう(期待した動作ではない)

 この問題の解決方法は後編で紹介します。

まとめ

 今回は画面にターゲットキャラクター(hamster)を配置して床の上を落ちずに移動する処理を実装しました。その中で、GameObjectの座標を変更して移動させる処理と、透明なGameObjectを判定に利用して移動範囲を制限する方法を紹介しました。

 次回はプレイヤーが操作するキャラクターがターゲットキャラクターを捕まえる処理の実装と、先述のキャラクターまでが透明なGameObjectの影響を受けてしまう問題の回避方法を紹介します。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
速習 Unity 2Dゲーム開発連載記事一覧

もっと読む

この記事の著者

西村 誠(ニシムラ マコト)

 Microsoft MVP Windows Platform Development。 Flash、PHPの開発経験もあり国産ECサイト構築フレームワーク「EC-CUBE」の公式エバンジェリストでもある。 ブログ:眠るシーラカンスと水底のプログラマー 著書:基礎から学ぶ Windowsストアアプリ開発

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/8395 2015/01/19 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング