ゴマちゃんフロンティア

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

【開発メモ】チャージ攻撃とエフェクトの実装

time 2015/11/20

というわけで、今回はボタンを押し続けて溜め、放すと攻撃する「チャージ攻撃」の実装になります!
これまたアクションゲームでは割とよくあるアクションです。

20151120_charge

現在攻撃系のボタンは「通常」と「特殊」の2つがあります。
今回実装する「通常チャージ」と「特殊チャージ」と合わせれば4パターンに分岐できます。
やや複雑ですが、幅広いアクションを持たせることができそうです。

通常チャージと特殊チャージを別々に行えるようにするか、片方のみにするかは検討中です。
変に共通化しても面倒なことになりそうなので、別々にチャージできる方がいいかなーとは思います。
ひとまず今回は通常チャージに相応する部分を作ってみました!

実装方法

PlayerクラスのUpdate()内にInput.GetButton()を入れ、攻撃ボタンが押されているか評価します。
押されている間は専用のカウントを加算します。
カウンタはAnimator.setFloat()でAnimatorに設定しておきます。

以下はPlayerクラスのUpdate()内の該当部分の処理です。

// チャージ時間をAnimatorにセット
animator.SetFloat("ChargeCount", chargeCount);
if (Input.GetButton("Attack")) {
    chargeCount++;
} else {
    // ボタンを離した場合は0に設定
    chargeCount = 0;
}

Player側で行うのはこれだけ。
アニメーションの制御はAnimatorControllerに任せてしまいます。
「パラメータが設定値を超えているか判定し、超えていたらトリガーをONにする」といった感じのスクリプトを作成します。

using UnityEngine;
using System.Collections;

namespace StateController {

    public class SwitchTriggerCondition : SwitchTriggerByKey {

        [SerializeField]
        private string conditionName;

        [SerializeField]
        private float count;

        public override void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
            if (switchByButtonUp) {
                if (Input.GetButtonUp(inputKey)) {
                    switchTrigger(animator);
                }
            } else {
                if (Input.GetButtonDown(inputKey)) {
                    switchTrigger(animator);
                }
            }
        }

        private void switchTrigger(Animator animator) {
            if (animator.GetFloat(conditionName) > count) {
                if (useAnimatorPlay) {
                    animator.Play(parameterName);
                }
                animator.SetTrigger(parameterName);
            }
        }
    }
}

世間一般の溜め攻撃の発動タイミングは「ボタンを離したとき」ですね。
汎用性のために「押したとき」か「離したとき」かを切り替えられるようにしておきます。

また、Animator.Play()を実行するかどうかも制御できるようにしてあります。
ステートの遷移をすぐに切り替えたい時はAnimator.Play()でやってしまうのが手っ取り早いです。

このスクリプトを「チャージ攻撃へ遷移する可能性のあるステート」に付与します。
今回は待機状態であるIdleから遷移させるようにしました。
CondtionをChargeAttackにし、ExitTimeのチェックを外しておきます。

実際のところは移動中やジャンプ中、他の攻撃中でも割り込んで遷移させたいところですが・・・該当ステート全てにスクリプトを付けていくのは面倒で、よろしくない気もします。
AnyStateから遷移させれば一撃ですが、あらゆるステートから割り込めてしまうためNG。
ここに限らずAnimatorの実装に怪しい部分が多いので、一度見直したほうがいいかもしれません。

チャージ中のエフェクト

アニメーション的には出来ましたが、現状ではチャージしているかどうかが分かりにくいです。
ロックマンシリーズのようにチャージ中のエフェクトが欲しいところです。

20151120_1

RenderModeを「Stretched Billborad」に設定し、LengthScaleを調整するとこんなエフェクトができます。
チャージ量が規定値を超えたら色合いやサイズを変化させ、フルチャージが分かるようにします。
PlayerクラスのUpdate()でチャージカウントを判定し、変化させてみました。

  
if (10 < chargeCount) {
    chargeEffectParticle.enableEmission = true;
    if (GameConstants.CHARGE_COUNT < chargeCount) {
        chargeEffectParticle.startSize = 2f;
        chargeEffectParticle.startColor = new Color(0.5f, 0.5f, 1f);
    } else {
        chargeEffectParticle.startSize = 1f;
        chargeEffectParticle.startColor = new Color(0.8f, 0.95f, 1f);
    }
} else {
    chargeEffectParticle.enableEmission = false;
}

chargeEffectParticle はParticleSystem型です。
インスペクターからパーティクルを設定しておき、Start()でGetComponentしています。
CHARGE_COUNT はひとまず60で定義してあります・・・が、短い気もするので後々変えるかもです。

まとめ

ということで、ざっくりですがチャージ攻撃を実装してみました!
チャージが必要なので連発はできませんが、その分高性能で派手な攻撃にしていきたいですね。

スポンサーリンク

down

コメントする



ツイッター