¿Cómo puedo hacer que NPC se mueva solo vertical y horizontalmente y no en diagonal con Vector2/3.MoveTowards y cómo puedo hacer que NPC se mueva solo por mosaico?
– UnityAssets3Free
buenas , me llamo Juan y para hoy os traigo
esta pregunta
Así que estaba tratando de hacer un juego solo por diversión y aprendizaje para uso futuro. Así que me encontré con este problema al crear un NPC enemigo. Quiero que me siga o me persiga, pero quiero que el NPC se mueva solo horizontal y verticalmente y quiero que el NPC se mueva pieza por pieza al igual que mi jugador.
aqui el video de como queda
https://www.youtube.com/watch?v=CB_vdt1Z3nA
y aquí está el guión NPC
public class ChaseScript : MonoBehaviour
public float speed;
private GameObject player;
private Transform player_transform;
void Start()
player = GameObject.Find("Player");
void Update()
player_transform = player.GetComponent<Transform>();
transform.position = Vector3.MoveTowards(transform.position, player_transform.position, speed * Time.deltaTime);
Aquí está mi controlador de jugador
public void InputMove()
if (!isMoving)
input.x = Input.GetAxisRaw("Horizontal");
input.y = Input.GetAxisRaw("Vertical");
if (input.x != 0) input.y = 0;
if (input != Vector2.zero)
playerAnimation.SetParameterValue(animator);
var movePos = transform.position;
movePos.x += input.x;
movePos.y += input.y;
FacingForward.transform.position = movePos;
if (IsWalkable(movePos))
StartCoroutine(Move(movePos));
playerAnimation.SetParameterValueisMoving(animator);
if (Input.GetKey(KeyCode.LeftShift))
moveSpeed = 6f;
animator.speed = 1.5f;
else
moveSpeed = 4f;
animator.speed = 1f;
IEnumerator Move(Vector3 movePos)
isMoving = true;
while ((movePos - transform.position).sqrMagnitude > Mathf.Epsilon)
transform.position = Vector3.MoveTowards(transform.position, movePos, moveSpeed * Time.deltaTime);
yield return null;
transform.position = movePos;
isMoving = false;
private bool IsWalkable(Vector3 movePos)
NPC) != null)
return false;
return true;
Lo que hice en mi Player para mover por mosaico es simplemente agregar 1 para transformar, por lo que será un movimiento constante, pero no sé cómo aplicarlo al NPC con Vector3.MoveTowards, pero si no es posible hacerlo, está bien.
1 respuesta 1
Comprueba si esto puede funcionar (puedes adaptarlo a tu caso 2D)
using UnityEngine;
public class ChaseOrthoScript : MonoBehaviour
public float speed;
private GameObject player;
private Transform player_transform;
bool isMoving = false;
void Start()
player = GameObject.Find("Player");
player_transform = player.GetComponent<Transform>();
transform.LookAt(player_transform.position);
void Update()
if (transform.InverseTransformPoint(player_transform.position).z > 0)
transform.position += transform.forward * speed * Time.deltaTime;
isMoving = true;
else
if (isMoving)
float angle = Vector3.Angle(transform.forward, player_transform.position - transform.position);
transform.Rotate(Vector3.up, Mathf.Sign(angle) * 90);
isMoving = false;
else if (transform.InverseTransformPoint(player_transform.position).z <= 0) //player is back
transform.Rotate(Vector3.up, 180);
tenga en cuenta que el player_transform = player.GetComponent<Transform>();
se mueve a Start()
. normalmente no quieres GetComponents
en una actualización, ya que solo necesita obtenerlo una vez. También es mucho más limpio tener un public GameObject player;
variable en el script y adjunte la referencia en el editor que el player = GameObject.Find("Player");
. Normalmente, no desea que los elementos de la escena se encuentren mediante un valor mágico codificado en su código.
Espero que ayude.
nota: si aun no se resuelve tu pregunta por favor dejar un comentario y pronto lo podremos de nuevo , muchas gracias
sin mas,espero que te halla servido