ゴマちゃんフロンティア

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

【ステージメモ】ステージ構成とカメラアングルについて

time 2015/10/12

というわけで、もうすっかり秋の気候な山梨です。
去年は忙しすぎて紅葉をまともに見れなかったので、今年はどこかに見に行きたいです。

shot2ss20151011011310415

今回は新ブログ最初のゲーム開発系の記事になります!
アクションゲームの土台でもあるステージを何とかしたいので、その話題です。
プレイする際に重要なカメラアングルについても修正しておきます!

ステージの構成

最初に作るサンプル的な役割も兼ねるステージということで、やはり海の雰囲気があるステージを作りたいところです。
ざっくりと組み込みたいセクションを書いてみます。
実現できるかどうかはやってみてから考えます!

前回の記事で書きましたが、ステージの難易度や順番は考慮しないことにしました!
1から順に難易度を上げていくことを考えると、どうしても構造が縛られてしまうためです。

・滝の入り江
滝つぼから滝をぐるっと回りながら登っていくイメージです。
地形を作るのが大変そうですが、漠然とした平地よりはアクション性が高くてよさそうです。
ジャンプ力と高低差のバランスに気をつけて作るようにします。

・洞窟
アクションゲームでは定番ですね。
どんな構造にするかは未定ですが、2Dアクションに近い感じになるかもです。
地形作成にTerrainは使わず、ほぼBlenderオンリーになると思われます。

・マングローブ
ステージ後半、夕焼けのようなライティングと合わせて作ってみたいです。
木の上に乗れたりすると面白いかも。
マングローブのモデリングが最大の難関になりそうです。

大きく3つに別れるわけですが、別シーンにするか同一シーンにするかは考え中です。
Unityの場合、同一シーン内の離れた地点に飛ばすような処理のほうが楽でしょうか。

shot2ss20151011005227774

そんなわけで、滝の入り江から作り始めています。
地形はTerrainで作り、所々にあるブロックはBlenderで作る予定です。
最後まで進めることに重点を置いているので、細かい部分は割と適当になっています。
途中で滝のパーティクルが上手くレンダリングされない問題が発生しましたが、パーティクルのSacleを1に直したら改善しました。

ちなみに水没したら「ダメージを受けて一定地点まで戻る」予定です。
「海の仲間たち()」になりそうですが、汚染された海という設定があるにはあるので、細かいところは気にしないで作ります!

カメラアングル

これまた前の記事で書きましたが、カメラアングルを自動化し、場面に合わせて自動で動かすようにします。
カメラアングル専用のクラスを用意し、以下のような関数を作ってカメラを操作するようにします。

public void changeAngle(Vector3 position, Vector3 angle) {
    // カメラ位置
    mainCamera.transform.position = transform.position;
    mainCamera.transform.localPosition = position;

    // カメラ本体角度
    iTween.RotateAdd(mainCamera, iTween.Hash(
        "rotation", angle,
        "time", 1f
    ));
}

public void rotateCameraPosition(float camera_rotate_y) {
    // カメラ回転
    iTween.RotateTo(gameObject, iTween.Hash(
        "y", camera_rotate_y,
        "time", 1f,
        "onupdate", "rotateCameraAngle"
    ));
}

public void rotateCameraAngle() {
    mainCamera.transform.LookAt(gameObject.transform.position);
}

上がカメラの位置と角度、下がカメラ回転用の関数です。

スクリプトはMainCameraに直接付与するのではなく、プレイヤーキャラと同じ位置に空のGameObjectを作り、そこからカメラを取得して操作します。
作成したオブジェクトの子としてMainCameraを設定します。
この状態でカメラ操作用のオブジェクトを回転させることで、カメラをキャラクターを中心として回転させることができます。
カメラ回転中はプレイヤーの方を見てもらわないと困るので、iTweenのonupdate内で指定しておきます。

直接プレイヤーキャラの子オブジェクトとしてしまうと、キャラが動く度に移動するので面倒なことになります。
面倒ですが、Update()内でプレイヤーの位置に合わせる処理を書いておきます。

カメラの回転を直接行うと一瞬で処理が行われてしまうので、見栄えがよろしくありません。
iTweenのRotateToやRotateAddを使いtimeを指定することで、慣性のある角度切り替えを実現できます。

あとはステージ上に透明の判定を用意し、触れた際にカメラの位置・角度を切り替えます。
パラメータとしてカメラ位置・角度・キャラを中心としたカメラの回転位置を設定しておきます。

using UnityEngine;
using System.Collections;

public class AngleChangeController : MonoBehaviour {

    [SerializeField]
    private Vector3 position;

    [SerializeField]
    private  Vector3 angle;

    [SerializeField]
    private float camera_rotate_y;

    private CameraController cameraController;

    void Start () {
        cameraController = GameObject.FindGameObjectWithTag("PlayerManager").GetComponent<CameraController>();
    }

    void OnTriggerEnter(Collider c){
        if (c.gameObject.tag == "Player") {
            cameraController.changeAngle(position, angle);
            cameraController.rotateCameraPosition(camera_rotate_y);
        }
    }
}

OnTriggerEnterでタグがPlayerのオブジェクトの場合のみ実行させます。
設定したパラメータを引数として渡します。

20150605_1

動き自体は問題なさそうです!
ただしCharacterMotorを使用しているため、切り替わった後がすごく操作しにくいです。
プレイヤーの移動に合わせて徐々に回転させるのが良いと思われますが、今の自分の知識で実現するのは難しそうです。
判定をいくつかに分け、小刻みに回転させるようにすると少しマシかも

まとめ

そんなわけで、ステージとカメラアングルに関してまとめてみました!
前よりはステージの構造がイメージしやすいので、そこそこはかどっています。
ひとまず1セクションの地形を作り上げ、システム面の改良も行っていきたいところです。

10/12 追記

カメラ回転時にY軸に限定せず、Vector3型を渡して回転させると汎用性が上がります。
上で記載したrotateCameraPositionをちょっと修正します。

 
public void rotateCameraPosition(Vector3 camera_rotate_angle) {
    // カメラ回転
    iTween.RotateTo(gameObject, iTween.Hash(
        "rotation", camera_rotate_angle,
        "time", 1f,
        "onupdate", "rotateCameraAngle"
    ));
}

public void rotateCameraAngle() {
    mainCamera.transform.LookAt(gameObject.transform.position);
}

AngleChangeControllerの方は型をVector3にするだけなので割愛させていただきます!

上手く調整すればサイドビューにもトップビューにもできます。
これにズームイン・アウトの処理を作れば大抵のアングルはカバーできそうですね。

スポンサーリンク

down

コメントする



ツイッター