Пример #1
0
    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);
        }
    }
Пример #2
0
    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));
    }
Пример #3
0
    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);
    }
Пример #4
0
    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));
    }
Пример #5
0
    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);
        }
    }