// Use this for initialization
        public void Init(ClimbingSystem system)
        {
            // 掴んでいる地形
            Debug.Assert(system.grippablePoint != null, "掴み位置を保持していない");

            // 体を制御 -----
            grippingJoint = system.gripAnchar.GetComponent <CharacterJoint>();
            forwardHand   = system.rightHand; backHand = system.leftHand;

            //Vector3[] handsPos = ClimberMethod.GetHandsPosition(forwardHand, backHand);
            system.grippablePoint.SetHandPosition(forwardHand, system.grippingCollider);           // 仮
            system.grippablePoint.SetHandPosition(backHand, system.grippingCollider);              // 仮
        }
        private void CloseHand(Vector3 inputMovement, ClimbingSystem system)
        {
            float magnitudeHandToHand = ClimberMethod.CalcHandToHandMagnitude(system.rightHand, system.leftHand);

            var inputMovementMagni = inputMovement.magnitude;
            var moveVec            = Vector3.zero;

            var level = system.level;

            if (system.isChange)
            {
                float step       = system.grippablePoint.SetHandPosition(backHand, system.grippingCollider, 0.01f);
                bool  isFinished = 0.000001f > step;
                if (isFinished)
                {
                    system.grippablePoint.SetHandPosition(backHand, system.grippingCollider, 1f);
                    system.isChange = false;
                }
                ;
            }

            // 移動入力値が存在する
            bool isInputMovement = inputMovementMagni > Mathf.Epsilon;

            if (isInputMovement)
            {
                // 後ろの手を前の手に限界まで近づけたら遷移
                if (level.minHandToHand > magnitudeHandToHand)
                {
                    system.handMovementMode = HandMovementMode.Advance;
                    return;
                }
            }

            // 後方の手を近づける
            if (level.minHandToHand < magnitudeHandToHand)
            {
                moveVec = forwardHand.transform.position - backHand.transform.position;

                float limit  = -level.minHandToHand / 2;
                var   result = ClimberMethod.CalcLerpTranslation(
                    moveVec.normalized,
                    magnitudeHandToHand - limit,
                    system.level.handMovementSpdFactor);
                backHand.transform.Translate(result, Space.World);
            }
            return;
        }
        public void Update(ClimbingSystem system)
        {
            //var inputMovement = ClimberMethod.GetInputMovement3D();
            //if (Input.GetKeyDown(KeyCode.Space))
            //{
            //    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);
            //    ClimberMethod.Jump(jumpDir, system.rigid, ref system.grippablePoint, jumpPower);
            //    system.ChangeState(new AirState());
            //}

            foreach (var normal in system.wallNormals)
            {
                system.rigid.AddForce(normal * system.level.wallPower, ForceMode.VelocityChange);
            }
        }
        public void FixedUpdate(ClimbingSystem system)
        {
            // 体を制御 -----
            var handsPos = ClimberMethod.GetHandsPosition(system.rightHand, system.leftHand);

            // 崖つかまり時の アンカー設定
            var        ancharRigid = system.gripAncharBase.GetComponent <Rigidbody>();
            Quaternion rotation    = ClimberMethod.CalcRotationXZ(handsPos[0], handsPos[1]);

            //ClimberMethod.SetGrippingAnchar(ancharRigid, (handsPos[0] + handsPos[1]) / 2, rotation);
            ClimberMethod.SetGrippingAnchar(ancharRigid
                                            , ancharRigid.transform.position
                                            , Quaternion.Lerp(ancharRigid.transform.rotation, rotation, 1f));

            // アンカーの状態を反映する
            ClimberMethod.ApplyGrippingAnchar(system.rigid, system.gripAnchar.GetComponent <Rigidbody>(), system.level.gripPosOffset);
        }
예제 #5
0
 void Start()
 {
     charControl = GetComponent <CharacterController>();
     climbSystem = GetComponent <ClimbingSystem>();
 }
        private void AdvaneHand(Vector3 inputMovement, ClimbingSystem system)
        {
            float magnitudeHandToHand = ClimberMethod.CalcHandToHandMagnitude(system.rightHand, system.leftHand);

            var inputMovementMagni = inputMovement.magnitude;
            var moveVec            = Vector3.zero;

            var level = system.level;

            if (system.isChange)
            {
                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.Close;
                    //system.handMovementMode = HandMovementMode.Advance;
                }
            }

            // 移動方向を求める
            if (inputMovementMagni > Mathf.Epsilon)
            {
                var edge = system.grippablePoint.GetEdgeFromDirection(inputMovement);
                ClimberMethod.SetHandForwardAndBack(ref forwardHand, ref backHand, edge);
                moveVec = system.grippablePoint.CalcMoveDirction(inputMovement);
            }
            else
            {
                // 入力なしで後方の手を近づける
                system.handMovementMode = HandMovementMode.Close;
                return;
            }

            bool canMoving = Vector3.Dot(moveVec, inputMovement) > level.ableInputMovementLimitCos;

            if (canMoving == false)
            {
                return;
            }

            // 手同士の距離が最大を超えた時 後方の手を近づける状態に遷移
            if (level.maxHandToHand < magnitudeHandToHand)
            {
                system.handMovementMode = HandMovementMode.Close;
                return;
            }

            // 前方の手を進める
            if (level.maxHandToHand > magnitudeHandToHand)
            {
                var movement = ClimberMethod.CalcLerpTranslation(
                    moveVec.normalized,
                    Mathf.Max(magnitudeHandToHand, 1f),
                    system.level.handMovementSpdFactor);
                movement = system.grippablePoint.ClampHandsMovement(forwardHand.transform.position, movement);
                if (movement.sqrMagnitude <= 0)
                {
                    var nearGripColi = ClimberMethod.CheckGripPoint(inputMovement, system.nearGrippable, system.level.ableInputGrippingLimitCos);

                    if (nearGripColi != null)
                    {
                        system.grippingCollider = ClimberMethod.ChangeGrippablePoint(ref system.grippablePoint, nearGripColi);
                        //system.handMovementMode = HandMovementMode.Catch;
                        system.isChange = true;
                    }
                }
                forwardHand.transform.Translate(movement, Space.World);
            }
            return;
        }
        // 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);
            }
        }
        float jumpHoge = 0.0f;  // 仮の滞空中制御

        public void Init(ClimbingSystem system)
        {
            system.canCatch = false;
        }
 // Update is called once per frame
 virtual protected void Update(ClimbingSystem system)
 {
 }
 // Use this for initialization
 virtual protected void Start(ClimbingSystem system)
 {
 }