Exemplo n.º 1
0
    public void ConstraintMove(ref Vector3 move, Vector3 desiredDirection)
    {
        var ledgeBreakValue = Mathf.Sin(LedgeBreakAngle * Mathf.Deg2Rad);

        var character = CreateCharacterInfo(Vector3.zero);
        var radius    = _characterProperties.Radius * FallThresehold + Margin;

        foreach (var grabInfo in GrabInfos)
        {
            var inputProjection = Vector3.Project(desiredDirection, grabInfo.PerpendicularGrabDirection);
            if (inputProjection.magnitude >= ledgeBreakValue)
            {
                continue;
            }

            var nextPosition = transform.position + move;
            character.Position = nextPosition;

            var nextledgeGrab = new LedgeGrabCalculator(grabInfo.Ledge, character, Margin);

            var overlap = nextledgeGrab.TrueGrabDistance - radius;
            if (overlap < 0F)
            {
                move += nextledgeGrab.TrueGrabDirection.normalized * overlap;
                character.Position = transform.position + move;
            }
        }
    }
Exemplo n.º 2
0
        /// <summary>
        /// Creates a new collision checker
        /// </summary>
        /// <param name="grabInfo">The grab informations</param>
        /// <param name="collisionLayers">The mask used to check the collisions</param>
        /// <param name="maxClimbDownHeight">The maximum height the character can climb down</param>
        public ClimbPositionChecker(LedgeGrabCalculator grabInfo, LayerMask collisionLayers, float maxClimbDownHeight)
        {
            GrabInfo           = grabInfo;
            CollisionLayers    = collisionLayers;
            MaxClimbDownHeight = maxClimbDownHeight;

            CalcFirstChangeTargetPosition();
            CalcFirstChangeFromPosition();
            CalcPositions();
            CalcIsStep();
        }
Exemplo n.º 3
0
    void Update()
    {
        GrabInfos.Clear();

        var character = CreateCharacterInfo(transform.position);

        foreach (var ledge in Ledges)
        {
            var calculator = new LedgeGrabCalculator(ledge, character, Margin);
            var checker    = new ClimbPositionChecker(calculator, CollisionLayers, MaxClimbDownHeight);

            var info = new GrabInfo(ledge, calculator, checker);
            GrabInfos.Add(info);
        }
    }