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); }