見出し画像

十二剣戦記の技術的なあれこれ2(InputSystemとアクション)

ゲームはこちら

今回はアクションウィンドウについて。
攻撃すると、下のようにアクションが求められる。

アクションウィンドウ

アクションは大きく分けて、

  • A→Bにドラッグするタイプ

  • クリックするタイプ

  • 押した後、しばらく待って離すタイプ

  • 2回入力するタイプ

の4つがある。
しかしホールド(押した後~)の動きはデフォルトに無い。そこでInputSystemを使う。

InputSystemによって、コントローラーやキーボードなどの入力を複合的に扱える。

Press(押した時)、Release(離した時)、LongTap(ホールド)の3つをInputActionsに登録する。
PressとReleaseはマウスの押した時/離した時で、LongTapは以下のように設定している。

LongTap

PlayerInputにてInputActionsとメソッドを紐づける。

PlayerInputに設定

基本とA→Bにドラッグ

public void ActionPress(InputAction.CallbackContext context)
{
    if (context.started)
    {
        startV2 = mCurrent;
    }
}

マウスが押された時、押された座標を記録。
context.performedだと離した場所の座標になってしまうのでstartedを採用した。

こちらはマウスが離された時のメソッド。

string actionKind = "";

//別メソッドでの例
actionKind = gm.GetWeaponDic()[main.GetMaki().wKind].aKind;

public void ActionRelease(InputAction.CallbackContext context)
{
    if (attackTime && context.performed)
    {
        endV2 = mCurrent;
        string inputKind = "drag";
        if (hold) inputKind = "hold";
        if (JudgeAction(actionKind, inputKind))
        {
            Attack2();
        }
        startV2 = new Vector2();
        endV2 = new Vector2();
    }
    hold = false;
}

このプログラムは、
戦闘中で、かつ離された事が確認されると離された座標を記録する。
そしてドラッグの後かホールドの後かを判定する。
JudgeActionにて、入力されたアクションと、正しいアクションが一致しているかどうかを判定する。
正しければAttack2でダメージを与える処理などをする。
最後に、座標をリセットする。

JudgeActionのメソッドはこちら。

[SerializeField] const int ACTIONWIDTH = 100;

public bool JudgeAction(string actionKind, string kind)
{
    switch (kind)
    {
        case "drag":
            switch (actionKind)
            {
                case "剣":
                    if ((startV2.x + ACTIONWIDTH < endV2.x && startV2.y - ACTIONWIDTH > endV2.y)
                        || (startV2.x - ACTIONWIDTH > endV2.x && startV2.y - ACTIONWIDTH > endV2.y))
                        return true;
                    break;
            }
    }
    return false;
}

正しいアクションを判別。
剣の場合は初めのX座標と終わりのX座標の差が100以上、かつ初めのY座標と終わりのY座標の差が100以上あれば成功。
右スタートか左スタートかは問わない。

省略されているが、後述するアクション以外は大体この形。
ACTIONWIDTHは変わらないので定数にしてある。[SerializeField]で、Unityからも編集できるように。

クリックするタイプ

ほとんどドラッグするタイプと同じ。

case "銃":
    if (startV2.x == endV2.x && startV2.y == endV2.y)
        return true;
    break;

JudgeActionにて、初めの座標と終わりの座標が一致した場合にしている。

押した後、しばらく待って離すタイプ

public void ActionHold(InputAction.CallbackContext context)
{
    if (attackTime && context.performed)
    {
        hold = true;
        aw.ChangeImage(actionKind, true);
    }
}

マウスを押している間、このメソッドが呼び出される。
一定時間押したのが確認されるとホールドしたかの変数holdをTrueにし、チャージ後の画像に変える。
holdがTrueならば、ActionReleaseにてinputKindがholdになり、JudgeActionにて判定する。

2回入力するタイプ

ヤギの魔機などの二刀や、狛犬の魔機などの二丁銃が該当。

case "二丁銃":
    if (startV2.x == endV2.x && startV2.y == endV2.y)
    {
        if (action2nd) return true;
        else { 
            action2nd = true;
            AttackSound();
        }
    }
    break;

二丁銃の場合、JudgeActionの中はこのようになっている。
まず座標が同じかどうか、アクションを判定。
次に1回目か2回目か判定し、1回目だったら攻撃音を鳴らす。

action2ndは、別のメソッドで武器種によってTrueかFalseか決めている。

この記事が気に入ったらサポートをしてみませんか?