private IEnumerator WallRun(ParkourEntryPoint entryPoint, float verticalSpeed, float horizontalSpeed) { float elapsedTime = 0f; Vector3 directionVector = Vector3.ProjectOnPlane(transform.forward, entryPoint.Wall.Plane.normal).normalized; while (true) { float currentDeltaX = horizontalSpeed * elapsedTime; float currentDeltaY = verticalSpeed * elapsedTime - _wallRunVerticalAcceleration * Mathf.Pow(elapsedTime, 2f); Vector3 currentPosition = entryPoint.Point + directionVector * currentDeltaX; currentPosition.y = entryPoint.Point.y + currentDeltaY; Vector3 currentPosition0 = currentPosition + entryPoint.Wall.Plane.normal * _playerController.CharacterRadius; Vector3 currentPosition1 = currentPosition + -entryPoint.Wall.Plane.normal * _playerController.CharacterRadius; transform.position = Vector3.Distance(currentPosition0, transform.position) < Vector3.Distance(currentPosition1, transform.position) ? currentPosition0 : currentPosition1; elapsedTime += Time.deltaTime; if (elapsedTime > 0.5f) { RaycastHit hit; if (Physics.Raycast(transform.position, -transform.up, out hit, _playerController.CharacterHeight / 2 + 0.5f, _obstacleMask)) { Debug.Log("StopWallRun"); StopWallRun(); } } yield return(null); } }
private void StartWallRun(ParkourEntryPoint wallRunStartEntry) { float horizontalSpeed = new Vector2(_rigidbody.velocity.x, _rigidbody.velocity.z).magnitude; float verticalSpeed = _rigidbody.velocity.y; _rigidbody.velocity = Vector3.zero; _playerController.enabled = false; _rigidbody.isKinematic = true; _wallRunCoroutine = StartCoroutine(WallRun(wallRunStartEntry, verticalSpeed, horizontalSpeed)); }
ParkourEntryPoint ConvertParkourEntryToNearest(ParkourEntryPoint entry) { var result = new ParkourEntryPoint(entry); Vector3 closestPoint = result.Wall.Plane.ClosestPointOnPlane(transform.position); if (result.ParkourObstacle.Collider.bounds.ClosestPoint(closestPoint) == closestPoint) { result.Point = closestPoint; } return(result); }
private void StartClimbing(ParkourEntryPoint climbingStartEntry) { _isClimbing = true; Plane wallPlane = new Plane(climbingStartEntry.Wall.GetPoint(0), climbingStartEntry.Wall.GetPoint(1), climbingStartEntry.Wall.GetPoint(2)); Vector3 startPostion1 = climbingStartEntry.Point + (wallPlane.normal * _playerController.CharacterRadius * -1); Vector3 startPostion2 = climbingStartEntry.Point + (wallPlane.normal * _playerController.CharacterRadius); Vector3 climbStartPosition = Vector3.Distance(transform.position, startPostion1) < Vector3.Distance(transform.position, startPostion2) ? startPostion1 : startPostion2; Quaternion climbStartRtotation = Quaternion.LookRotation(climbingStartEntry.Point - climbStartPosition, Vector3.up); _velocityBeforeClimb = new Vector2(_rigidbody.velocity.x, _rigidbody.velocity.z).magnitude; _rigidbody.velocity = Vector3.zero; _playerController.enabled = false; _rigidbody.isKinematic = true; _parkourCoroutine = StartCoroutine(Climbing(climbingStartEntry.ParkourObstacle, climbingStartEntry.Wall, climbStartPosition, climbStartRtotation)); }
void CheckParkourStartEntries() { _parkourStartEntries.Clear(); ParkourEntryPoint forwardEntry = CheckParkourStartEntry(transform.forward, true); if (forwardEntry != null) { _parkourStartEntries.Add(forwardEntry); } ParkourEntryPoint rightEntry = CheckParkourStartEntry(transform.right, false); if (rightEntry != null) { _parkourStartEntries.Add(rightEntry); } ParkourEntryPoint leftEntry = CheckParkourStartEntry(transform.right * -1, false); if (leftEntry != null) { _parkourStartEntries.Add(leftEntry); } }