Aprende a configurar NPCs (Non-Player Character) en Unity con un flujo sencillo y efectivo. Reutiliza sprites, configura colisiones y física, y programa un movimiento errático aleatorio con pausas para simular vida en un RPG. Sin animaciones adicionales y con pocas líneas de código, obtendrás resultados claros y escalables.
¿Cómo crear un NPC en Unity con movimiento aleatorio?
Coloca en escena un sprite existente y distínguelo del personaje con un tinte de color. La idea es reutilizar gráficos (por ejemplo, un conejo) y evitar animaciones: el NPC no rota ni anima, solo se desplaza en cuatro direcciones.
Reutiliza el sprite del personaje y aplica un color distinto para identificar al NPC.
Nómbralo de forma genérica (por ejemplo, “NPC”) para crear luego un prefab reutilizable.
El movimiento será aleatorio en 4 direcciones (sin diagonales) y con pausas intercaladas.
¿Cómo definir variables clave para el movimiento?
Gestiona velocidad, estados y tiempos con contadores. Usa Vector2 para las direcciones.
Velocidad: public float speed = 1.5f;.
Estado: public bool isWalking para saber si camina o espera.
Tiempos: public float walkTime; public float waitTime = 3f;.
using System.Collections;using System.Collections.Generic;using UnityEngine;publicclassNPCMovement:MonoBehaviour{/**** Variables. ****/public float npcSpeed =1.5f;public bool isWalking;public float walkTime =1.5f;public float waitTime =3.0f;private float waitTimeCounter;private float walkCounter;private int currentDirection;/**** Components. ****/privateVector2[] walkingDirections ={//Definimos las diferentes direcciones que tomará nuestro npc.newVector2(1,0),newVector2(0,1),newVector2(-1,0),newVector2(0,-1)};privateRigidbody2D npcRigidbody;/**** Metudus. ****/// Start is called before the first frame updatevoidStart(){ npcRigidbody =GetComponent<Rigidbody2D>(); waitTimeCounter = waitTime; walkCounter = walkTime;}// Update is called once per framevoidUpdate(){if(isWalking){ npcRigidbody.velocity= walkingDirections[currentDirection]* npcSpeed; walkCounter -=Time.deltaTime;if(walkCounter <0){StopWalking();}}else{ npcRigidbody.velocity=Vector2.zero; waitTimeCounter -=Time.deltaTime;if(waitTimeCounter <0){StartWalking();}}}privatevoidStartWalking(){ isWalking =true; currentDirection =Random.Range(0,4); walkCounter = walkTime;}privatevoidStopWalking(){ isWalking =false; waitTimeCounter = waitTime; npcRigidbody.velocity=Vector2.zero;}}
Va quedando genial!! le añadí las animaciones de ataque al enemigo y que cuando te acerques te mire y ataque
pasa el code rey
Nombre alternativo xd:
"Clase para hacer algo que podemos sacar de enemy"
Genial
Algun ejemplo de como hacer que no se mueva el npc que no sea aumentar la masa?
Claro, ve al componente de rigidbody 2d y en la opcion de Body type selecciona Kinematic, esto evitara que el objeto sea afectado por colisiones, fuerzas y cualquier otra cosa en cuanto a físicas externas, sera tomado como si fuera una simple animación o modificación del componente Transform del GameObject.
(Esto no evita que el objeto aplique todo lo que te dije a los demas objetos)