Unity3D で横スクロールアクション

20110125-1

昨日の記事とどうちゃうねん?

2D Toolkit を使わずにサイドビューアクションゲームにしてみました。今回はゴールオブジェクトを用意し、ゴールに到達したら次のシーンに切り替わります。的な事をして全60ステージクリアを目指せ的な事もできてしまいますね。

いや、128ステージクリアを目指してステージ間のつながりがものすごくイヤンなゲームも作れますね。

ではテストプレイどうぞ

思いつきでやったんで大してステージ数ないですがシーン内に当たり判定のあるオブジェクトとかテクスチャはりつけたりとかいろいろできそうですね。ただ、サイドビュー限定です。

FPS とか 3D ものはいっぱい溢れてるのでとにかくサイドビューなのです。

2D toolkit だと事前にタイルマップテクスチャを作ったりとか前準備はある程度必要ですがオブジェクトのみでやるならお手軽にゲームもどきが作れます。 あと、挙動の検証とかレベルデザインの研究にも使えるかも?

構想

本格的にゲームを作るでなくてお手軽にゲームをサクサク作りたい時やプログラムスキル無しでゲームを作ってみたいって時にはポリゴンデータにコンポーネントを割り当てて色々役割をきめていき、それをシーン内に配置する。ってやり方は結構楽でいいと思います。作っているうちにどんどん慣れていくのでそのうち複雑なこともこなせるようになりますし。

そういうコンポーネントを作っていけばゲーム本体はデザイナーさんやレベルデザイナーさんにおまかせできるのでとても効率がいいです。

プロジェクトまるごとパッケージ

とりあえずエクスポートしてみました。使い方やステージ追加方法とかはまた後日記事にて。

UniAction20131030

プレイヤーソースコード

using UnityEngine;
using System.Collections;

[RequireComponent(typeof(CharacterController))]
public class Player : MonoBehaviour {

    CharacterController oController = null; // キャラクタコントローラ
    CollisionFlags oCollisionFlags = CollisionFlags.None; // 衝突判定情報
    Camera oMainCamera = null;          // カメラ
    Vector2 v2AxisMove = Vector2.zero;  // パッド入力
    Vector3 v3Force = Vector3.zero;     // 内部加速度
    Vector3 v3Speed = Vector3.zero;     // 内部速度
    bool isGround = false;              // 接地状態
    int iIgnoreJumpCount = 0;           // ジャンプ不可タイム
    int iIgnoreJumpCountMax = 5;        // 最大ジャンプ不可タイム
    int iJumpButtonDownCount = 0;       // ジャンプボタン押下カウンタ

    public float fMegaminSpeed = 4f;         // 横速度
    public float fMegaminJumpPower = 11f;    // ジャンプ力
    public float fMegaminFallSpeed = 0.31f;  // 落下速度
    public bool bDebug = true;

    GUIStyle oStyle; // GUIデバッグ用

    // オブジェクト初期化
    void Start() {
        // あらかじめオブジェクトに割り当てられたコンポーネントを取得しておく
        oMainCamera = GameObject.Find("Main Camera").GetComponent();
        oController = GetComponent();
        oStyle = new GUIStyle();
        oStyle.normal.textColor = Color.red;
    }

    // オブジェクト更新処理
    void Update() {
        // カメラをめがみんにあわせる
        oMainCamera.transform.localPosition = new Vector3(
            transform.position.x,
            transform.position.y + 0.5f,
            oMainCamera.transform.position.z);
        // パッド入力処理
        v2AxisMove = new Vector2(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"));
        // 加速度設定
        v3Force.x = isGround ? (v2AxisMove.x) : 0f;
        // ジャンプ
        if (Input.GetAxis("Jump") > 0f) iJumpButtonDownCount++; else iJumpButtonDownCount = 0;
        if (iJumpButtonDownCount == 1 && isGround && iIgnoreJumpCount == 0) {
            v3Speed.y = 0f;
            v3Force.y = fMegaminJumpPower;
            isGround = false;
            iIgnoreJumpCount = iIgnoreJumpCountMax;
        }
        // 横入力無しの時又は反転時に横方向減速
        if (v2AxisMove.x == 0 || Mathf.Sign(v2AxisMove.x) != Mathf.Sign(v3Speed.x)) v3Speed.x *= 0.5f;
        // 加速と最高速度抑制
        v3Speed += v3Force;
        v3Speed.x = Mathf.Clamp(v3Speed.x, -fMegaminSpeed, fMegaminSpeed);
        v3Force.y = 0f;
        // 落下
        v3Speed.y -= fMegaminFallSpeed;
        // パッド入力方向によってキャラクタを左右反転させる処理
        if (v2AxisMove.x > 0f) {
            transform.localScale = Vector3.one;
        } else if (v2AxisMove.x < 0f) {             transform.localScale = new Vector3(-1f, 1f, 1f);         }         // 移動する         if (v3Speed.magnitude > 0f) {
            oCollisionFlags = oController.Move(v3Speed * Time.deltaTime);
            if ((oCollisionFlags & CollisionFlags.Below) > 0) {
                isGround = true;
                v3Force.y = 0f;
                v3Speed.y = 0f;
            }
        }
        // Z軸方向にずれたら補正する
        transform.localPosition = new Vector3(transform.localPosition.x, transform.localPosition.y, 0);
        // ジャンプ不可カウントを更新する
        iIgnoreJumpCount += (iIgnoreJumpCount > 0) ? -1 : 0;
    }

    void OnGUI() {
        if (!bDebug) return;
        GUILayout.BeginArea(new Rect(8, 8, Screen.width - 16, Screen.height - 16));
        GUILayout.Label("isGround      : " + (isGround ? "On" : "Off"), oStyle);
        GUILayout.Label("Speed         : " + v3Speed.ToString(), oStyle);
        GUILayout.Label("Force         : " + v3Force.ToString(), oStyle);
        GUILayout.Label("Above         : " + ((oCollisionFlags & CollisionFlags.Above) > 0 ? "On" : "Off"), oStyle);
        GUILayout.Label("Below         : " + ((oCollisionFlags & CollisionFlags.Below) > 0 ? "On" : "Off"), oStyle);
        GUILayout.Label("Sides         : " + ((oCollisionFlags & CollisionFlags.Sides) > 0 ? "On" : "Off"), oStyle);
        GUILayout.Label("CollidedAbove : " + ((oCollisionFlags & CollisionFlags.CollidedAbove) > 0 ? "On" : "Off"), oStyle);
        GUILayout.Label("CollidedBelow : " + ((oCollisionFlags & CollisionFlags.CollidedBelow) > 0 ? "On" : "Off"), oStyle);
        GUILayout.Label("CollidedSides : " + ((oCollisionFlags & CollisionFlags.CollidedSides) > 0 ? "On" : "Off"), oStyle);
        GUILayout.EndArea();
    }
}

「シェアする」

ツイートツイート