Así que quiero que mi Enemigo se mueva a un Punto de Ruta y luego aumente una Lista para que pueda moverse al siguiente Punto de Ruta, pero de alguna manera mi Enemigo se mueve al primer Punto de Ruta y luego se queda atascado en esta posición. ¡Un awnser sería un sueño! Aquí está mi código
using System.Collections; using System.Collections.Generic; using UnityEngine; public class EnemyPathing : MonoBehaviour { [SerializeField] List<Transform> waypoints; [SerializeField] float moveSpeed = 2f; int waypointIndex = 0; // Start void Start() { transform.position = waypoints[waypointIndex].transform.position; } // Update void Update() { Move(); } private void Move() { if (waypointIndex <= waypoints.Count - 1) { var targetPosition = waypoints[waypointIndex].transform.position; var movementThisFrame = moveSpeed * Time.deltaTime; transform.position = Vector2.MoveTowards (transform.position, targetPosition, movementThisFrame); if (transform.position == targetPosition) { waypointIndex++; } } else { Destroy(gameObject); } }}
Por cierto. en Console Unity dice: Assets\Scripts\EnemyPathing.cs(7,38):advertencia CS0649: El campo 'EnemyPathing.waypoints' nunca se asigna y siempre tendrá su valor predeterminado nulo
Ahh, conversión automática de tipo, mi viejo némesis.
Aquí hay un código para pensar:
var v2 = new Vector2(21, 22); var v3 = new Vector3(31, 32, 33); v3 = v2; print(v3.z); El código anterior no imprime 33 como cabría esperar. Imprime 0 . La razón de esto es que la tercera línea son en realidad dos operaciones: una conversión de tipo implícita de Vector2 a Vector3 y luego una asignación. Cuando convierte de un vector más pequeño a uno más grande, los componentes adicionales obtienen valores predeterminados de 0 .
Así que cuando vas y haces esto:
transform.position = Vector2.MoveTowards (transform.position, targetPosition, movementThisFrame); .. en realidad estás configurando tranquilamente transform.position.z en 0 . Lo que generalmente estaría bien, excepto:
if (transform.position == targetPosition) .. si targetPosition.z no es 0 , esto nunca será cierto y nunca pasará del primer punto de referencia.
Aquí está la solución más simple que hace que su código haga lo que usted quiere:
if ((Vector2)transform.position == (Vector2)targetPosition) Eso asegurará que solo se comparen x e y .
Sin embargo, tenga en cuenta que su transform.position.z aún se está configurando en 0, por lo que es posible que desee hacer algo al respecto. Aquí hay una solución muy sucia:
var temp = transform.position.z; transform.position = Vector2.MoveTowards (transform.position, targetPosition, movementThisFrame); transform.position.z = temp;