ゴマちゃんフロンティア

気まぐれと勢いで作るUnityゲーム開発日記です。

【Unity】横スクロールアクション作成のためのオブジェクト移動制御

time 2016/12/30

というわけで、年越しを前にして風邪が全然治らないりべるんです。
ブログも2週間近く放置していたので、年越し前に何か書いておこうと思います!

shot2ss20161230224759374

今回はUnityで横スクロールアクションを作る際の移動制御についてになります。
最近のゲームでありがちな、「3Dで作られているけど中身は2D」な感じです。
故にUnityの2D機能とは趣旨が異なるためご注意下さい。

こんな記事を書いた理由は他でもなく、自作ゲームを3Dで作ることに挫折しかけているためです。
ステージ作成が2Dの方がやりやすいのもありますが、カメラアングルの問題を上手く解決できません。
そのあたりのセオリーが分かるまで、ステージは2D移動をベースにして作ろうと思っています。

プレイヤー移動を2Dに限定

前に記事で紹介した、「CharacterMotor使用時の移動を2Dに限定する」でプレイヤー移動を2D方向に限定できます。

【Unity】CharacterMotor使用時のキャラクター移動を2Dに限定する

ただしこれだけでは完全ではなく、Unity側の物理演算の結果によってZ軸に移動する可能性があります。
適球状のオブジェクトを配置し、横から突っ込むと分かりやすいです。
上の対応は「プレイヤー側の入力で」Z軸に移動しないだけなので・・・。

スマートに解決する方法が分からなかったので、Update() 内で強引にZ軸を制御しました。
RigidBody があれば FreezePosition を指定することで解決しますが、CharacterController を使用している関係で使用できません。

void Update () {
    transform.position = new Vector3(transform.position.x, transform.position.y, globalManager.stageManager.baseDepth);
}

スタックオーバーフローには「Z軸を0にしろ(意訳)」的なものがあったりします。
が、自分はZ軸が0になるようにステージを作っていなかったので、真に受けて設定すると異次元にぶっ飛んでしまいました。

ということで、ステージ用のマネージャクラスに「現在ベースとなっているZ軸」を持たせることにしました。
ステージ進行に合わせて変化させることも可能で、その値でプレイヤーのZ軸を固定します。
マネージャクラスについては趣旨から外れる上に我流なので割愛しますが、 単に Player クラスのフィールドに持たせても問題ありません。
その場合、Start() 内で transform.position.z を元に初期化すればOKです。

20161230_01

ダッシュ時に挙動が怪しくなる時がありますが、概ね固定されるみたいです。

オブジェクト・敵キャラクター移動を2Dに限定

RigidBody の「FreezePosition」でZを指定してあげるだけでOKです。
あまりにも簡単すぎてプレイヤー制御の苦労が嘘のようです。

shot2ss20161230230000329

・・・本当にこれだけでOKなので、あまり書くことはないです!
「RigidBody万歳!」といったところでしょうか。

強いて言えば、敵キャラクターのロジックが3D用になっているので、それを修正します。
プレイヤーと同じように左右のみ瞬時で振り向くようにします。
Slerp() で補完していたのを LookRotation() に置き換えるだけでOKです。
その際、Y軸とZ軸を0に設定して振り向かせます。

void Update() {
    if (lookTarget != null) {
        Vector3 angle = lookTarget.position - transform.position;
        angle.y = 0;
        angle.z = 0;
        transform.rotation = Quaternion.LookRotation(angle);
    }
}

lookTarget にはプレイヤーの Transform を入れます。
実際は別オブジェクトに判定を持たせ、OnTriggerEnter() でセットしています。
(これまた趣旨と外れるので割愛します)

まとめ

かなりざっくりですが、横スクロールアクションにおける移動制御について考えてみました!
自分が作りたいゲームを想像すると、何かと2Dっぽい部分が多い気がするので、とりあえずこれで行ってみようと思います!

2016年もあと24時間ちょっとです。今年も早かったですね。
来年も「ゴマちゃんフロンティア」をよろしくお願いします!

スポンサーリンク

down

コメントする



ツイッター