Unityで2D格闘(2D Fighting game)作るときに相手の方向を向くには?

  • 1
    いいね
  • 0
    コメント

201701211228gif32.gif
相手の方向を自動で向く

ソース公開中 Open source

https://github.com/muzudho/KifuwarabeFighter2

プログラミング的には

201701210653a55.png
数直線があるとする。 左から 0、1、2、3 と増えていく。
ここで

相手 - 自分

を計算すると、相手が左にいるとき 負の数、相手が右にいるとき 正の数 になる。
数直線と向きが同じで覚えやすいだろう。

仮にこれを フェイシング・ナンバー (Facing number) とあだ名を付けよう。自分の顔がどちらを向いているかの数字だ。負の数なら左で、正の数なら右だ。

201701210653a56.png
レバーもまた、左に倒すと -1、 右に倒すと -1 に設定されているだろう。(Input設定でInvertフラグを立てていると逆になる)
これも 数直線と向きが同じで覚えやすいだろう。

とりあえず レバーX (lever X) とでも あだ名を付ける。

201701210653a57.png
なので、フェイシング・ナンバーと、レバーXの 正負 だけを見て、符号が同じなら 相手の方を向いているし、符号が異なれば 相手から離れる方向を向いている。

重なっているときは どちらを向く?

同じ位置だと 0 になる。 Mathf.Sign( ~ ) では 0 は 正の数と判定されるので 右を向いていることになる。
レバー操作的には 重なった瞬間、右に倒していると 相手の方に近づいているし、左に倒していると 相手から離れていると判定されるかと思う。

コーディング的には

とりあえず 列挙型を作っておくと見やすいのではないか。

/// <summary>
/// 相手に向かっていっているかどうか。めんどうなので、相手に重なっている、Equal は無しで。
/// </summary>
public enum FacingOpponentFwBk
{
    Forward,
    Back
}
/// <summary>
/// 相手は左か右か。めんどうなので、相手に重なっている、Equal は無しで。
/// </summary>
public enum FacingOpponentLR
{
    Left,
    Right
}

次のようなメソッドを作っておくと便利かもしれない。そのままでは使えないので改造してほしい。

FacingOpponentFwBk GetFacingOpponentFwBk(float leverX)
{
    if (Mathf.Sign(SceneCommon.Player_to_transform[(int)CommonScript.ReverseTeban((PlayerIndex)playerIndex)].position.x - transform.position.x)
        ==
        Mathf.Sign(leverX)
        )
    {
        return FacingOpponentFwBk.Forward;
    }
    return FacingOpponentFwBk.Back;
}
FacingOpponentLR GetFacingOfOpponentLR()
{
    // 自分と相手の位置(相手が右側にいるとき正となるようにする)
    if( 0<=SceneCommon.Player_to_transform[(int)CommonScript.ReverseTeban((PlayerIndex)playerIndex)].position.x - transform.position.x)
    {
        return FacingOpponentLR.Right;
    }
    return FacingOpponentLR.Left;
}
void DoFacingOpponent(FacingOpponentLR facingOpponentLR)
{
    //localScale.xを-1にすると画像が反転する
    Vector2 temp = transform.localScale;
    switch (facingOpponentLR)
    {
        case FacingOpponentLR.Left: // 左を向くぜ☆
            temp.x = -1 * SceneCommon.GRAPHIC_SCALE;
            break;
        case FacingOpponentLR.Right: // 右を向くぜ☆
            temp.x = 1 * SceneCommon.GRAPHIC_SCALE;
            break;
        default:
            break;
    }
    transform.localScale = temp;
}

ところで、何にも説明していなかったが キャラクターは 右向きの画像 で作っているもの とする。

GetFacingOpponentFwBk( ~ ) は何に使うのかというと、

if (FacingOpponentFwBk.Forward == facingOpponentFwBk)
{
    // 相手に向かっていくぜ☆
}
else
{
    // 相手から離れていくぜ☆
}

レバー操作から 相手に歩いて近づくか、攻撃を受けたときブロックするか、といった場合分けに使えるかと思う。

コンピューターが プレイヤーに近づいてくる、といったプログラムを書くときにも使えるだろう。 フェイシング・ナンバー を ただ足せばいい。