ゴマちゃんフロンティア

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

【開発メモ】アシストキャラクターの実装 その1

time 2015/12/15

というわけで、前回の投稿から時間が空いてしまいましたが、今回のお題はこれです!

shot2ss20151215210405763

新要素として「アシストキャラクター」を実装してみようと思います!
プレイヤーキャラとは別にステージ上にいる仲間キャラで、乗ることで操作することができるというものです。

元々はプレイヤーキャラとしてアザラシやカンガルーも入れようとしたのですが、開発中に厳しいと判断し3キャラに絞った経緯があります。
そのキャラを何とかゲームに組み込めないかと思い、「ステージ上で一時的に操作できるキャラ」という結論に至りました。

今回はプレイヤーキャラがアシストキャラに乗り降りするシステムを作ってみます。
焦っても雑になってしまうので、まったりやっていきます!

下準備

当たり前ですが、アシストキャラクターのモデルを作る必要があります。
ということでさくっと作ります!

shot2ss20151215210217326

作成したアザラシ(のつもり)です。
カンガルーとどちらにしようか迷いましたが、アザラシの方が乗るのに違和感なさそうという点と、単純に自分が大好きな動物なのでチョイスしました!
見直すとあまりアザラシっぽくないですが、そのうち修正します!
今回は乗り降りだけなので、モーションも作っていません。

乗る場合の処理

乗っていないアシストキャラには円形のエフェクトを出し、その範囲内でボタンを押すことでプレイヤーキャラが飛び乗るようにします。
アシストキャラの位置はプレイヤーの操作以外で動かすことはないと思われます。

円形の判定はアシストキャラクター本体に子オブジェクトとして作ります。
エフェクトはEffekseerのサンプルを参考にを作成・使用しています。
専用のスクリプト「RideArea」を作成します。

using UnityEngine;
using System.Collections;

public class RideArea : MonoBehaviour {

    private AssistCharacter assistCharacter;

    public void OnTriggerStay(Collider c) {
        if (TagUtility.getParentTagName(c.gameObject) == "Player") {
            if (Input.GetButtonDown("Action")) {
                Player player = c.GetComponent<Player>();
                assistCharacter.setPlayer(player);
                player.onRideOnAssistCharacter(assistCharacter);
            }
        }
    }
}

判定内でボタンが入力された場合、Playerクラスの「onRideOnAssisstCharacter」を実行します。
プレイヤーキャラをアシストキャラの上に飛び乗るように移動させ、transform.parentにアシストキャラを設定して子オブジェクトにします。
また、各種コントロール系を無効化します。

public void onRideOnAssistCharacter(AssistCharacter assistCharacter) {
    // コントロール系の無効化
    charControl.enabled = false;
    charMotor.enabled = false;
    platForm.enabled = false;

    // プレイヤーのtransform修正
    transform.parent = assistCharacter.transform;
    transform.rotation = assistCharacter.transform.rotation;

    // ジャンプ時のモーションパス定義
    var pathList = new List<Vector3>();
    pathList.Add(transform.position);
    pathList.Add((transform.position + assistCharacter.ridePoint.transform.position) / 2 + new Vector3(0f, 10f, 0f));
    pathList.Add(assistCharacter.ridePoint.transform.position);

    iTween.Stop(gameObject);
    iTween.MoveTo(gameObject, iTween.Hash(
        "path", pathList.ToArray(),
        "time", 1f,
        "delay", 0.01f,
        "easetype", "easeOutSine",
        "oncomplete", "onPlayerRideOn",
        "oncompletetarget", assistCharacter.gameObject
    ));
}

ジャンプ時の移動処理はiTweenで行います。
アシストキャラクターの子オブジェクトとして「ridePoint」という空オブジェクトを用意しておきます。
iTween.MoveTo()の移動先は”position”で指定しますが、今回は”path”を使ってみました!
Vector3型のListを作り、「プレイヤーキャラ→ジャンプの頂点→ridePoint」となるように挿入してします。
あとは”easetype”を”easeOutSine”にすればジャンプが放物線っぽい挙動になります。

iTween.Stop()とdelayを入れている理由は以下の記事を参照して頂ければと思います。

【Unity】iTweenの停止と再実行について

最後はアシストキャラ本体に付与するスクリプトを作成します。
以下はAssistCharacterクラスですが、実際にはそれを継承したSealクラスを付けています。
現状ではスーパークラスの関数を呼んでいるだけなのでほとんど意味はありませんが、後々増やすことも考え、専用に作っておきます。

Start()やUpdate()は特に面白いことをしていないので、プレイヤーが乗った際の関数のみ記載します。

public void onPlayerRideOn() {
    isRiding = true;

    charControl.enabled = true;
    charMotor.enabled = true;
    platForm.enabled = true;
}

関数はiTweenの実行後に呼ばれるよう、oncompleteで指定します。
isRidingフラグをONにし、各種コントロールを有効化します。

プレイヤーの参照としてPlayerクラスも渡して設定しておきます。
どのプレイヤーが乗っているか把握したり、何かと処理で使う機会が多いためです。

降りる場合の処理

乗っている最中にボタンを押すことで飛び降ります。
飛び降りる方向はアシストキャラの後ろ側です。
後ろが崖の状態で飛び降りるとそのまま落下しそうですが、現状ではどうしようもない部分なので気にせずいきます!

AssistCharacterクラスのUpdate()内で「ボタン押下かつ地面にいる状態」を判定し、降りる際の処理を記述した関数を呼んでいきます。
降りた後はアシストキャラを操作しなくなるので、コントロール系を無効化します。

public void onPlayerRideOff() {
    isRiding = false;

    charControl.enabled = false;
    charMotor.enabled = false;
    platForm.enabled = false;

    player.onRideOffAssistCharacter(this);
}

アシストキャラの処理後にPlayerクラスの「OnRideOffAssistCharacter」を実行します。
iTweenで飛び降りる処理と、コントロールを有効化する処理を書きます。

public void onRideOffAssistCharacter(AssistCharacter assistCharacter) {
    // コントロール系の有効化
    charControl.enabled = true;
    charMotor.enabled = true;
    platForm.enabled = true;

    // ジャンプ時のモーションパス定義
    Vector3 assistCharBack = assistCharacter.transform.position - (assistCharacter.transform.forward * 10f);
    var pathList = new List<Vector3>();
    pathList.Add(assistCharacter.ridePoint.transform.position);
    pathList.Add((transform.position + assistCharBack) / 2 + new Vector3(0f, 10f, 0f));
    pathList.Add(assistCharBack);

    transform.parent = null;
    iTween.Stop(gameObject);
    iTween.MoveTo(gameObject, iTween.Hash(
        "path", pathList.ToArray(),
        "time", 1f,
        "delay", 0.01f,
        "easetype", "easeOutSine"
    ));
}

「キャラクターの後ろ側に移動する」という点でちょっと詰まりました。
transform.positionを元にtransform.forward + Vector3() で上手くずらすような感じになります。
transofrm.forwardをそのまま参照すると原点近くまで吹っ飛んでしまうので気をつけます。

iTweenは乗る際と同じく”path”で指定します。
今度は「ridePoint→ジャンプの頂点→アシストキャラの背後」となるように設定してあります。

20151215

実際に乗り降りするとこんな挙動になります!
概ね自分の想定していた挙動になってくれてよかったです。

まとめ

そんなわけで、アシストキャラクターと乗り降りの部分を作ってみました!
次はアシストキャラクターを操作する部分を実装していく予定です。
難しそうなので遅れるかもしれませんが、まったりやります!

スポンサーリンク

down

コメントする



ツイッター