![見出し画像](https://assets.st-note.com/production/uploads/images/152197041/rectangle_large_type_2_ddaf8bce3025d966e64f26149a02f076.png?width=1200)
十二剣戦記の技術的なあれこれ2(InputSystemとアクション)
ゲームはこちら
今回はアクションウィンドウについて。
攻撃すると、下のようにアクションが求められる。
![](https://assets.st-note.com/img/1724061208909-OHhwcQ9ZVV.png?width=1200)
アクションは大きく分けて、
A→Bにドラッグするタイプ
クリックするタイプ
押した後、しばらく待って離すタイプ
2回入力するタイプ
の4つがある。
しかしホールド(押した後~)の動きはデフォルトに無い。そこでInputSystemを使う。
InputSystemによって、コントローラーやキーボードなどの入力を複合的に扱える。
Press(押した時)、Release(離した時)、LongTap(ホールド)の3つをInputActionsに登録する。
PressとReleaseはマウスの押した時/離した時で、LongTapは以下のように設定している。
![](https://assets.st-note.com/img/1724061110567-IF00UZFxJ3.png?width=1200)
PlayerInputにてInputActionsとメソッドを紐づける。
![](https://assets.st-note.com/img/1724756981634-8hFNkTywPN.png?width=1200)
基本と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か決めている。
この記事が気に入ったらサポートをしてみませんか?