Пример #1
0
    void Update()
    { // ずっと行う
        vx = 0;
        vz = 0;

        // インプット処理呼び出し
        NInput.InputMain();

        // 入力されたインプット内容でステータスを変更
        NStateChange.StateChangeMain();

        // 攻撃の処理
        //NAttack.AttackMain();

        // 移動処理呼び出し
        NMove.MoveMain(NSound);

        // ジャンプ処理呼び出し
        NJump.JumpMain(NSound);

        // 攻撃喰らい判定
        NHurtBox.HurtBoxMain(NSound);

        #region 画面への描画
        // 入力された内部XYZをtransformに設定する。

        // 基本的に、描画位置はジャンプなどのキャラ状態かかわらず、同じように内部座標を描画座標に適用する
        // (適用できるように、必要ならば内部座標の段階で調整をしておく)

        /// @@@Y座標も同じ場所で速度反映を行ったほうがよいです
        /// ここで行うと着地時めり込むということだと思うのですが
        /// いずれ直面する左右の壁めり込みなども同様の現象なので
        /// 「速度を座標に反映する」処理の後に、「地形にぶつかっていたら適切な位置に戻す」
        /// という処理を入れる必要があります。
        /// とりあえずY座標だけでもめり込み判定をNekketsuJumpから取り出し
        /// NekketsuMerikomiCheckみたいなクラスを作り、
        /// 速度を座標に反映する処理の後に、上記クラスの処理を通して適切な位置に戻す流れを作っておくのが良いでしょう

        //座標への速度反映
        X += vx;
        //Y += vy;
        Z += vz;

        pos.x = X;
        pos.y = Z + Y;

        transform.position = pos;

        /// @@@所持アイテムの位置調整および、くらい判定の移動
        /// も専用のNekketsuHaveItemのようなクラスを作り、
        /// そこで管理するのが良いかと思います。

        /// @@@NekketuActionはあくまでマネージャー、管理人というべきクラスなので、
        /// 管理人の仕事は基本的にNMoveやNJumpなどの仕事人を呼び出すだけに努め
        /// それ以外のことはできるだけ書かないようにルールを作るのが良いです
        /// ここに書くと楽なのですが、今後どんどん膨れていくので、
        /// 今のうちから仕事は仕事クラスにふるようにしていきましょう

        #region 所持アイテムの位置調整
        if (haveItem != ItemPattern.None)
        {
            Transform ItemTransform = GameObject.Find(haveItem.ToString()).transform;
            Vector3   ItemScale     = ItemTransform.localScale;
            Vector3   ItemPos       = pos;
            if (leftFlag)
            {
                ItemPos.x   = pos.x - 0.4f;
                ItemScale.x = -1;
            }
            else
            {
                ItemPos.x   = pos.x + 0.4f;
                ItemScale.x = 1;
            }
            ItemPos.y = pos.y + 0.25f;
            ItemTransform.localScale = ItemScale;

            ItemTransform.position = ItemPos;
        }

        #endregion


        // 喰らい判定の移動
        if (NowDamage == DamagePattern.UmaTaore ||
            NowDamage == DamagePattern.UmaTaoreUp)
        {
            //倒れ状態の当たり判定(アイテム化)
            hurtBox = new Rect(X, Y + Z, 1.6f, 0.7f);
        }
        else
        {
            //通常当たり判定
            hurtBox = new Rect(X, Y + Z, 0.7f, 1.6f);
        }


        #endregion

        #region スプライト反転処理
        Vector3 scale = transform.localScale;
        if (leftFlag)
        {
            scale.x = -1; // 反転する(左向き)
        }
        else
        {
            scale.x = 1; // そのまま(右向き)
        }

        transform.localScale = scale;
        #endregion

        #region キャラクターの影の位置描画処理
        /// @@@GameObject.Findは非常に重い処理なので、
        /// ここに書くと毎フレーム呼ばれることになってしまいます。
        /// Startの中で一度呼び出しshadeTransformに書き込んでおいて
        /// それを使い回すのが良いでしょう
        Transform shadeTransform = GameObject.Find(this.gameObject.name + "_Shade").transform;

        pos.y = Z - 0.8f;

        if (!squatFlag)
        {
            shadeTransform.position = pos;
        }
        #endregion

        #region アニメ処理

        if (NowDamage != DamagePattern.None)
        {
            // ダメージアニメ処理
            animator.Play(NowDamage.ToString());
        }
        else
        {
            if (!squatFlag && !brakeFlag)
            {
                if (NowAttack != AttackPattern.None)
                {
                    if (haveItem == ItemPattern.None)
                    {
                        // 現在の攻撃状態をアニメーションさせる。
                        animator.Play(NowAttack.ToString());
                    }
                    else
                    {
                    }
                }
                else
                {
                    //  攻撃以外のアニメーション
                    if (vx == 0 && vz == 0)
                    {
                        animator.SetBool("Walk", false);
                    }
                    else
                    {
                        animator.SetBool("Walk", true);
                    }

                    if (jumpFlag &&
                        NowDamage == DamagePattern.None)
                    {
                        animator.Play("Jump");
                    }
                }
            }
            else
            {
                if (brakeFlag)
                {
                    animator.Play("Brake");
                }

                if (squatFlag)
                {
                    animator.Play("Squat");
                }
            }
        }

        #endregion

        #region 失格判定(ゲームシーンから削除)

        if (DeathFlag == DeathPattern.death)
        {
            Destroy(this.gameObject);
        }

        #endregion
    }