Beispiel #1
0
    public void AvoidWithLeastRotation(Animator animator, ObstacleDetector.ObstacleDetection detection)
    {
        float angleToObstacle = Vector2.SignedAngle(animator.transform.right, detection.relativePosition);

        obstacleDetector.rb.AddTorque(strength * -Mathf.Sign(angleToObstacle));

        float   incomingDistance     = detection.relativePosition.magnitude;
        float   requiredDeceleration = detection.incomingSpeed * Mathf.Max(detection.incomingSpeed, 0) / 2 / incomingDistance;
        Vector2 force = obstacleDetector.rb.mass * requiredDeceleration * -detection.relativePosition.normalized;

        obstacleDetector.rb.AddForce(force);
        if (showForces)
        {
            Debug.DrawLine(obstacleDetector.forcePoint.position, (Vector2)obstacleDetector.forcePoint.position + force, Color.magenta);
        }
    }
Beispiel #2
0
 public virtual void OnDetection(Animator animator, AnimatorStateInfo stateInfo, int layerIndex, ObstacleDetector.ObstacleDetection detection)
 {
     animator.SetFloat(incomingObstacleAngleParameter, detection != null ? Vector2.SignedAngle(animator.transform.right, detection.relativePosition) : 180);
 }
Beispiel #3
0
    override public void OnDetection(Animator animator, AnimatorStateInfo stateInfo, int layerIndex, ObstacleDetector.ObstacleDetection detection)
    {
        base.OnDetection(animator, stateInfo, layerIndex, detection);
        switch (avoidanceMode)
        {
        case AvoidanceStrategy.LEAST_ROTATION:
            if (detection != null)
            {
                AvoidWithLeastRotation(animator, detection);
            }
            else
            {
                avoidanceMode = AvoidanceStrategy.CONTINUE_CURRENT_ROTATION;
                AvoidWithCurrentRotation();
            }
            break;

        case AvoidanceStrategy.CONTINUE_CURRENT_ROTATION:
            AvoidWithCurrentRotation();
            break;
        }
    }