フラグが入り乱れてバグってた件

(English will follow)
お疲れ様です。本日の進捗をご報告いたします。

コントローラーを購入してからデバッグの毎日でしたが、無事、バグを潰せました。

ちなみに、発生していた障害は次のとおりです。
  • ジャンプ中に攻撃できない
  • 移動しながら攻撃できない

以下、障害の詳細をご報告いたします。
私のアクションゲームの構造上、次のような作りになっています。


空のGameObjectに追加したMainManagerというクラスがいます。
こいつがユーザーからの入力をすべて引き受けています。


ユーザーから入力があったらMainManagerからプレイヤーキャラ(PlayerBehaviour)のSendMessage()を呼び出してやります。
で、PlayerBehaviourに実装してある移動やら攻撃やらが実行される、という仕掛けです。
→なぜこんな面倒なことをとお思いでしょうが、いろいろあってね…。


修正前に、MainManagerの攻撃ロジックと、PlayerBehaviourの移動と攻撃のロジックにログを仕込んだ結果がこちらです。


Mainの方はログが出まくってます。
いっぽうPlayerのログは3件。
入力を受け付けてもPlayerにSendMessageできてないようです。
これを手がかりに調べたところ、押しっぱなしが連打扱いにならないようにするためのストッパーになってるフラグがクリアされてないことが原因だと判明しました。


    void Update()
    {
        jump_on_prev = jump_on;
        action_on_prev = action_on;

        // ここへ移動
        action_on = false;

        // キーが何も押されてないならフラグをすべてクリアする
        if (IsKeyPressing() == false)
        {
            OnRightUp();
            OnLeftUp();
            jump_on = false;
            // 元の位置はここ
            // action_on = false;
            
            return;
        }

        // 以降、入力キーが押されたときの処理
        //   :
        //   :

    }

プログラム中にフラグがたくさんあって制御しきれなくなって、しかたなく「何も押されてなかったら一旦操作系のフラグは全リセット!」とかやったような、やってないような。

そのせいで、移動中は絶対にIsKeyPressing()がtrueになるので、移動中の攻撃はできなくなってた(正確には、移動中1度だけ攻撃できる)というわけです。


こまったらフラグを使う、というのはその場では簡潔でいいんですが、多くなってくると今回みたいにバグの温床になるのが厄介ですね。


以上です。よろしくお願い致します。


To whom it may concern,
I am pleased to inform you that my today's progress report.

Today I was concentrating on debugging.
As a result, I fixed all currently recognized bugs.
It is estimated that there are many flags and it is caused by being unable to manage themselves.
Using flags is easy, but You'll pay for it later.

Please confirm the following information.
Thanks.

0 コメント:

コメントを投稿