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