예제 #1
0
    bool tryToWallRun()
    {
        bool success = false;
        BurinkeruCharacterController characterController = (BurinkeruCharacterController)this.characterController;

        if (characterController == null)
        {
            return(false);
        }

        PlayerWallRunState.WallRunRaycastResult result = PlayerWallRunState.RaycastWalls(characterController.transform);

        if (result.Success)
        {
            if (lastWallRunCollider == null ||
                (lastWallRunCollider != result.Hit.collider) ||
                (lastWallRunCollider == result.Hit.collider && wallRunToLastColliderAllowed))
            {
                lastWallRunCollider = result.Hit.collider;

                Vector3 lookDirection = characterController.GetLookDirection();
                float   dot           = Vector3.Dot(lookDirection, result.Direction);
                success = true;
                Vector3 v   = characterController.GetLookDirection();
                Vector3 n   = result.Hit.normal;
                Vector3 vtn = Vector3.Cross(v, n);
                Vector3 res = Vector3.Cross(n, vtn);
                res.y *= 0.1f;

                result.RunDirection = res;

                wallRunState = new PlayerWallRunState(result);
                wallRunState.Enter(inputManager, characterController, components);
                wallRunState.RequestExit += onExitRequested;

                Debug.DrawRay(result.Hit.point, res * 10, Color.magenta, 1f);
            }
        }

        return(success);
    }