// Update is called once per frame
        public void Update(ClimbingSystem system)
        {
            if (ClimberMethod.GetInputCatch() == false)
            {
                system.ChangeState(new AirState());
                return;
            }

            /*
             * X = 手の長さ * 2 * 調整値, Y = X - 移動距離
             * それぞれの状態に遷移する距離として近づける距離をXとして進める距離をYとして X > 移動距離 > Y
             * 進む方向の手を進める   ・・・ 入力直後はこれからスタート または 距離がY以上で遷移
             * 反対の手を近づける    ・・・ 距離がX以上で遷移 または 入力が無いときに遷移
             */
            //canAdvanceStep = magnitudeHandToHand < handMovement;
            var inputMovement      = ClimberMethod.GetInputMovement3D();
            var inputMovementMagni = inputMovement.magnitude;

            DebugVisualizeVector3.visualize = inputMovement;

            // 掴んだ状態で移動できる範囲
            system.callInOnDrawGizmos.Add(() =>
            {
                //Gizmos.DrawWireSphere(system.nearGrippable.transform.position);
            });

            if (ClimberMethod.GetInputJumpTrigger())
            {
                float jumpPower = ClimberMethod.CalcJumpPower(1f, 1f, system.level.maxJumpPowerFactor, system.level.baseJumpPower);
                var   jumpDir   = ClimberMethod.CalcJumpDir(system.level.jumpingDirction, inputMovement, system.level.shotControlFactor, system.grippablePoint.GetWallDirection() * Vector3.forward);
                jumpDir = Vector3.up;
                //var farGripColi = ClimberMethod.CheckGripPoint(inputMovement, system.farGrippable, system.level.ableInputGrippingLimitCos);
                //if (farGripColi != null)
                //{
                //    var closePos = farGripColi.ClosestPoint(system.gripAncharBase.transform.position);
                //    var dir = closePos - system.rigid.transform.position;


                //    dir.y = 1f;
                //    dir.Normalize();

                //    jumpDir = dir;
                //}
                //}

                //jumpDir =
                ClimberMethod.Jump(jumpDir, system.rigid, ref system.grippablePoint, jumpPower);
                //system.UnenableCollider(0.2f);
                system.audio.PlayOneShot(system.audioClip[0]);
                system.ChangeState(new AirState());

                return;
            }

            Vector3 moveVec = Vector3.zero;

            //GameObject forwardHand = null;

            // 移動方向を求める
            if (inputMovementMagni > Mathf.Epsilon)
            {
                var edge = system.grippablePoint.GetEdgeFromDirection(inputMovement);
                moveVec = system.grippablePoint.CalcMoveDirction(inputMovement);
            }
            bool canMoving = Vector3.Dot(moveVec, inputMovement) > system.level.ableInputMovementLimitCos;

            if (canMoving == false)
            {
                return;
            }


            var movement = ClimberMethod.CalcLerpTranslation(
                moveVec.normalized,
                1f,
                system.level.handMovementSpdFactor);

            movement = system.grippablePoint.ClampHandsMovement(system.gripAncharBase.transform.position, movement);
            //if (movement.sqrMagnitude <= 0)
            //{
            var nearGripColi = ClimberMethod.CheckGripPoint(inputMovement, system.nearGrippable, system.level.ableInputGrippingLimitCos);

            if (nearGripColi != null)
            {
                var closePos = nearGripColi.ClosestPoint(system.gripAncharBase.transform.position);
                if ((closePos - system.gripAncharBase.transform.position).sqrMagnitude <= 0.04f)
                {
                    system.grippingCollider = ClimberMethod.ChangeGrippablePoint(ref system.grippablePoint, nearGripColi);
                    //system.handMovementMode = HandMovementMode.Catch;
                    //system.isChange = true;
                }
            }
            //}
            system.gripAncharBase.transform.Translate(movement);

            //switch (system.handMovementMode)
            //{
            //    //case HandMovementMode.Catch:
            //    //    float step = system.grippablePoint.SetHandPosition(forwardHand, system.grippingCollider, 0.5f);
            //    //    bool isFinished = 0.000001f > step;
            //    //    if (isFinished)
            //    //    {
            //    //        system.grippablePoint.SetHandPosition(forwardHand, system.grippingCollider);
            //    //        //system.handMovementMode = HandMovementMode.Advance;
            //    //        system.isChange = false;
            //    //    }
            //    //    break;

            //    //case HandMovementMode.Advance:
            //    //    AdvaneHand(inputMovement, system);
            //    //    break;

            //    //case HandMovementMode.Close:
            //    //    CloseHand(inputMovement, system);
            //    //    break;

            //    //default:
            //    //    // 通らないはず
            //    //    Debug.Log("HandMovementMode == None");
            //    //    break;
            //}
        }
        public void FixedUpdate(ClimbingSystem system)
        {
            if (jumpHoge >= 0f && jumpHoge <= 1.0f)
            {
                if (Input.GetKey("joystick button 0"))
                {
                    jumpHoge += Time.deltaTime;
                    system.rigid.AddForce(Vector3.up * 5, ForceMode.Impulse);
                }
                else
                {
                    jumpHoge = -1.0f;
                }
            }

            // 空中移動
            var inputMovement = ClimberMethod.GetInputMovement3D();

            inputMovement.z = 0f;
            ClimberMethod.Swap(ref inputMovement.y, ref inputMovement.z);
            if (inputMovement.sqrMagnitude > Mathf.Epsilon)
            {
                system.rigid.AddForce(inputMovement * system.level.airControlVelocity, ForceMode.VelocityChange);
            }

            //{
            //    //! デバッグ用 舞空術
            //    if (Input.GetKey(KeyCode.LeftShift) && Input.GetKey(KeyCode.Space))
            //    {
            //        system.rigid.AddForce(Vector3.up * 0.8f, ForceMode.VelocityChange);
            //    }
            //}

            var nearGripColi = ClimberMethod.CheckGripPoint(
                system.rigid.velocity.normalized,
                system.nearGrippable,
                system.level.ableInputGrippingLimitCos);

            if (nearGripColi != null)
            {
                var temp = nearGripColi.gameObject.GetComponent <GrippablePoint2>();
            }

            if (ClimberMethod.GetInputCatch() == false)
            {
                system.canCatch = true;
                return;
            }
            if (system.canCatch == false)
            {
                return;
            }

            if (nearGripColi != null)
            {
                system.audio.PlayOneShot(system.audioClip[1]);
                //system.grippablePoint = system.nearGrippable.GetComponent<GrippablePoint2>();
                system.grippingCollider = ClimberMethod.ChangeGrippablePoint(ref system.grippablePoint, nearGripColi);
                var        ancharRigid = system.gripAncharBase.GetComponent <Rigidbody>();
                Quaternion rotation    = Quaternion.FromToRotation(Vector3.forward, nearGripColi.GetComponent <GrippablePoint2>().GetEdgeDirection());
                ClimberMethod.SetGrippingAnchar(ancharRigid, nearGripColi.ClosestPoint(system.rigid.position), rotation);
                system.ChangeState(new GrippingWallState());
            }
            else
            {
                system.gripAncharBase.transform.GetComponent <Rigidbody>().position = Vector3.Lerp(system.gripAncharBase.transform.GetComponent <Rigidbody>().position, system.rigid.position, 0.5f);
            }
        }