En este momento estás viendo ¿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?

 – Unity

¿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? – Unity

¿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

Deja una respuesta