This is an old revision of the document!
Pentru a programa inamici sau agenti NPC (Non-Playable Character) se poate folosi aceeasi functionalitate de navigare automata (NavMesh) si componenta de tip NavMeshAgent, pentru navigatie, similar cu sectiunea de Navigare automata din laboratorul precedent.
Diferenta este ca acesti agenti vor raspunde automat la anumite evenimente:
Astfel, pentru inamici putem defini un controller cu un radius de actiune, si un gizmos pentru vizualizare usoara a acestuia in editor.
public class EnemyController : MonoBehaviour { public float radius = 2; void OnDrawGizmosSelected() { Gizmos.color = Color.red; Gizmos.DrawWireSphere(transform.position, radius); } }
Pentru ca un inamic sa se miste spre player, atunci cand player-ul intra in raza de actiune putem folosi componenta de NavMeshAgent
void Update() { //calculam distanta intre player si inamic float distance = Vector3.Distance(target.position, transform.position); if(distance <= radius) { //misca agentul pana la player agent.SetDestination(hit.point); //in momentul in care intra in raza de atac, ataca } else { // agentul se misca in treaba lui / patruleaza etc. }
Mai departe, se poate folosi o alta distanta, pentru a determina raza de atac. Un inamic poate avea atac melee (de aproape) sau de la o anumita distanta.
public float attackRadius = 1; void Update() { //calculam distanta intre player si inamic float distance = Vector3.Distance(target.position, transform.position); if(distance <= radius) { //misca agentul pana la player agent.SetDestination(hit.point); //in momentul in care intra in raza de atac, ataca if(distance <= attack) { //ataca } }
O problema in activitatea agentilor este detectarea player-ului, in sensul de referinta. Astfel, avem mai multe variante:
public class PlayerManager : MonoBehaviour { public static PlayerManager instance; public GameObject player; void Awake() { instance = this; } }
Folosind varianta simpla cu singleton, putem lua pozitia player-ului de inters, similar cu laboratorul precedent:
target = PlayerManager.instance.player.transform;