Este es un error bastante extraño. Creé el siguiente script destinado a calcular posiciones para disparar proyectiles en mi juego moviéndome alrededor de una ruta circular y mirando hacia el mouse:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class ProjectileFire : MonoBehaviour { [System.Serializable] public class ButtonDirectionSet { public string button; public float direction; public bool degrees = true; } public GameObject projectile; public Vector2 centerPoint; public float radius = 1.0f; public string fireButton = "Fire1"; public bool followMouse = false; public bool followKeyboard = true; public List<ButtonDirectionSet> buttonDirectionMap = new List<ButtonDirectionSet>(); public bool degrees = true; public float direction; private readonly float maxDirection = 360 * Mathf.Deg2Rad; // Start is called before the first frame update void Start() { foreach (ButtonDirectionSet set in buttonDirectionMap) { if (set.degrees) { set.direction *= Mathf.Deg2Rad; } } if (degrees) { direction *= Mathf.Deg2Rad; } } void Update() { foreach (ButtonDirectionSet set in buttonDirectionMap) { if (Input.GetButtonDown(set.button)) { direction = set.direction; } } if ((followKeyboard && followMouse && Input.GetMouseButton(0)) || !followKeyboard) { Vector3 mouse = Input.mousePosition; mouse.z = transform.position.z - Camera.main.transform.position.z; Vector3 mousePosition = transform.InverseTransformPoint(Camera.main.ScreenToWorldPoint(mouse)); float xPos = mousePosition.x - centerPoint.x; if (Mathf.Abs(xPos) < 0.1f) { xPos = 0.1f * Mathf.Sign(xPos); } float yPos = mousePosition.y - centerPoint.y; if (Mathf.Abs(yPos) < 0.1f) { yPos = 0.1f * Mathf.Sign(yPos); } direction = Mathf.Atan2(yPos, xPos); } if (direction < 0) direction += maxDirection; transform.localPosition = centerPoint + (new Vector2(Mathf.Cos(direction), Mathf.Sin(direction)) * radius); } }Si configura tanto "seguir teclado" como "seguir mouse" en verdadero, el objeto debe colocarse hacia el mouse cuando mantiene presionado el botón izquierdo. En su mayor parte, esto funciona, pero por alguna razón, hay fluctuaciones en el sentido de que el objeto cambia rápidamente entre dos posiciones diferentes durante un período de tiempo, incluso cuando no muevo el mouse en absoluto. Además, el valor de "dirección" cambia a la misma velocidad, incluso si no muevo el mouse en absoluto. Esto no sucede todo el tiempo, pero sucede con bastante frecuencia en momentos que parecen ser aleatorios.
¿Hay algo que pueda hacer para mitigar o eliminar este comportamiento?
Dado que la dirección también se altera, hay algo mal con la forma en que calcula la dirección.
La razón por la que su dirección tiembla es por transform.InverseTransformPoint . Dado que la posición del objeto cambió, la posición del mouse en relación con el objeto también cambió con cada movimiento, por lo que la dirección también cambió.
Aquí hay dos formas de hacerlo:
1:
Vector2 direction; if ((followKeyboard && followMouse && Input.GetMouseButton(0)) || !followKeyboard) { Vector3 mouseOnScreen = Camera.main.ScreenToWorldPoint(Input.mousePosition) - new Vector3(centerPoint.x, centerPoint.y, 0); direction = new Vector2(mouseOnScreen.x, mouseOnScreen.y); } transform.localPosition = centerPoint + (direction.normalized * radius);Esta es una manera simple de hacerlo sin usar ángulos. Obtiene la posición del mouse en la pantalla en el espacio mundial. Luego lo convierte en un vector 2 para que el valor z no lo afecte. Luego, establece la nueva posición al centro más la dirección al mouse con una magnitud del radio
2:
if ((followKeyboard && followMouse && Input.GetMouseButton(0)) || !followKeyboard) { Vector3 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition) - new Vector3(centerPoint.x, centerPoint.y, 0); direction = Mathf.Atan2(mousePosition.y, mousePosition.x); } transform.localPosition = centerPoint + (new Vector2(Mathf.Cos(direction), Mathf.Sin(direction)) * radius); Esta es la misma manera que lo hiciste pero un poco limpiado. En lugar de usar transform.InverseTransformPoint , de esta manera resta el centerPoint. Eso devuelve el vector desde el punto central al mouse, estableciendo el punto central como el origen. Esto también está en la primera solución.