UnityChanControlScriptWithRgidBody.FixedUpdate C# (CSharp) Méthode

FixedUpdate() public méthode

public FixedUpdate ( ) : void
Résultat void
    void FixedUpdate()
    {
        if (itsMe)
        {
            float h, v;

            if (Application.isEditor) {
                h = Input.GetAxis("Horizontal");              // 入力デバイスの水平軸をhで定義
                v = Input.GetAxis("Vertical");                // 入力デバイスの垂直軸をvで定義
            }
            else {
                h = CnInputManager.GetAxis("Horizontal");
                v = CnInputManager.GetAxis("Vertical");
            }

            anim.SetFloat("Speed", v);                          // Animator側で設定している"Speed"パラメタにvを渡す
            anim.SetFloat("Direction", h);                      // Animator側で設定している"Direction"パラメタにhを渡す
            anim.speed = animSpeed;                             // Animatorのモーション再生速度に animSpeedを設定する
            currentBaseState = anim.GetCurrentAnimatorStateInfo(0); // 参照用のステート変数にBase Layer (0)の現在のステートを設定する
            rb.useGravity = true;//ジャンプ中に重力を切るので、それ以外は重力の影響を受けるようにする

            // 以下、キャラクターの移動処理
            velocity = new Vector3(0, 0, v);        // 上下のキー入力からZ軸方向の移動量を取得
            // キャラクターのローカル空間での方向に変換
            velocity = transform.TransformDirection(velocity);
            //以下のvの閾値は、Mecanim側のトランジションと一緒に調整する
            if (v > 0.1) {
                velocity *= forwardSpeed;       // 移動速度を掛ける
            } else if (v < -0.1) {
                velocity *= backwardSpeed;  // 移動速度を掛ける
            }

            if ((Application.isEditor && Input.GetButtonDown("Jump")) ||
                (Application.isMobilePlatform && CnInputManager.GetButtonDown("Jump"))) {  // スペースキーを入力したら
                last_jump = true;
                //アニメーションのステートがLocomotionの最中のみジャンプできる
                if (currentBaseState.nameHash == locoState){
                    //ステート遷移中でなかったらジャンプできる
                    if(!anim.IsInTransition(0))
                    {
                        rb.AddForce(Vector3.up * jumpPower, ForceMode.VelocityChange);
                        anim.SetBool("Jump", true);     // Animatorにジャンプに切り替えるフラグを送る
                    }
                }
            }

            // 上下のキー入力でキャラクターを移動させる
            transform.localPosition += velocity * Time.fixedDeltaTime;

            // 左右のキー入力でキャラクタをY軸で旋回させる
            transform.Rotate(0, h * rotateSpeed, 0);

            if (last_jump || transform.position != last_position || transform.rotation != last_rotation)
            {
                last_position = transform.position;
                last_rotation = transform.rotation;

                InputUpdate input = new InputUpdate();
                input.a_v = v;
                input.a_h = h;
                input.p_x = transform.position.x;
                input.p_z = transform.position.z;
                input.r_y = transform.rotation.y;
                input.r_w = transform.rotation.w;
                input.jump = last_jump;

                NetworkController.instance.SendInput(input);
            }
        }
        else
        {
            anim.SetFloat("Speed", last_axis_v);                          // Animator側で設定している"Speed"パラメタにvを渡す
            anim.SetFloat("Direction", last_axis_h);                      // Animator側で設定している"Direction"パラメタにhを渡す
            anim.speed = animSpeed;                             // Animatorのモーション再生速度に animSpeedを設定する
            currentBaseState = anim.GetCurrentAnimatorStateInfo(0); // 参照用のステート変数にBase Layer (0)の現在のステートを設定する
            rb.useGravity = true;//ジャンプ中に重力を切るので、それ以外は重力の影響を受けるようにする

            if (last_jump)
            {
                if (currentBaseState.nameHash == locoState){
                    //ステート遷移中でなかったらジャンプできる
                    if(!anim.IsInTransition(0))
                    {
                        rb.AddForce(Vector3.up * jumpPower, ForceMode.VelocityChange);
                        anim.SetBool("Jump", true);     // Animatorにジャンプに切り替えるフラグを送る
                    }
                }
            }

            transform.position = last_position;
            transform.rotation = last_rotation;
        }

        //Debug.Log(string.Format("update - pos:{0} rot:{1}", transform.localPosition, transform.localRotation));

        // 以下、Animatorの各ステート中での処理
        // Locomotion中
        // 現在のベースレイヤーがlocoStateの時
        if (currentBaseState.nameHash == locoState){
            //カーブでコライダ調整をしている時は、念のためにリセットする
            if(useCurves){
                resetCollider();
            }
        }
        // JUMP中の処理
        // 現在のベースレイヤーがjumpStateの時
        else if(currentBaseState.nameHash == jumpState)
        {
            if (itsMe) {
                cameraObject.SendMessage("setCameraPositionJumpView");	// ジャンプ中のカメラに変更
            }

            // ステートがトランジション中でない場合
            if(!anim.IsInTransition(0))
            {

                // 以下、カーブ調整をする場合の処理
                if(useCurves){
                    // 以下JUMP00アニメーションについているカーブJumpHeightとGravityControl
                    // JumpHeight:JUMP00でのジャンプの高さ(0〜1)
                    // GravityControl:1⇒ジャンプ中(重力無効)、0⇒重力有効
                    float jumpHeight = anim.GetFloat("JumpHeight");
                    float gravityControl = anim.GetFloat("GravityControl");
                    if(gravityControl > 0)
                        rb.useGravity = false;	//ジャンプ中の重力の影響を切る

                    // レイキャストをキャラクターのセンターから落とす
                    Ray ray = new Ray(transform.position + Vector3.up, -Vector3.up);
                    RaycastHit hitInfo = new RaycastHit();
                    // 高さが useCurvesHeight 以上ある時のみ、コライダーの高さと中心をJUMP00アニメーションについているカーブで調整する
                    if (Physics.Raycast(ray, out hitInfo))
                    {
                        if (hitInfo.distance > useCurvesHeight)
                        {
                            col.height = orgColHight - jumpHeight;			// 調整されたコライダーの高さ
                            float adjCenterY = orgVectColCenter.y + jumpHeight;
                            col.center = new Vector3(0, adjCenterY, 0);	// 調整されたコライダーのセンター
                        }
                        else{
                            // 閾値よりも低い時には初期値に戻す(念のため)
                            resetCollider();
                        }
                    }
                }
                // Jump bool値をリセットする(ループしないようにする)
                anim.SetBool("Jump", false);
            }
        }
        // IDLE中の処理
        // 現在のベースレイヤーがidleStateの時
        else if (currentBaseState.nameHash == idleState)
        {
            //カーブでコライダ調整をしている時は、念のためにリセットする
            if(useCurves){
                resetCollider();
            }
            // スペースキーを入力したらRest状態になる
            if (last_jump) {
                anim.SetBool("Rest", true);
            }
        }
        // REST中の処理
        // 現在のベースレイヤーがrestStateの時
        else if (currentBaseState.nameHash == restState)
        {
            //cameraObject.SendMessage("setCameraPositionFrontView");		// カメラを正面に切り替える
            // ステートが遷移中でない場合、Rest bool値をリセットする(ループしないようにする)
            if(!anim.IsInTransition(0))
            {
                anim.SetBool("Rest", false);
            }
        }

        last_jump = false;
    }