Unity 3D: GameObject seguir caminho pré-definido

Construímos uma inteligência artificial que caminha através de pontos pré-definidos na cena.

Podemos construir de várias formas um sistema de caminho na qual os GameObjects vão seguir, sendo assim, nesse artigo você vai conferir uma das várias possibilidades. Em resumo, definimos alguns pontos através de GameObjects.

São necessários três scripts, cada um com uma responsabilidade única, pois assim conseguimos diminuir o acoplamento e por consequência, a complexidade de implantação. Temos um script para o GameObject que vai andar pelo caminho, nele definimos a velocidade de movimentação e rotação. Outros dois scripts servem para monitorar e informar ao GameObject qual a próxima posição, quanto o outro, serve para definir o caminho.

Confira as nossas três aulas abaixo.

Aula 01

 

Aula 02

 

Aula 03

Abaixo estão as três classes criadas em aula.

PathAgent.cs

using UnityEngine;

public class PathAgent : MonoBehaviour
{
	[Range(0.0f, 100.0f)]
	public float moveSpeed;

	[Range(0.0f, 100.0f)]
	public float rotateSpeed = 20.0f;


	private Transform nextDestination;


	void Update()
	{
		if (nextDestination == null)
			return;

		transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);

		Vector3 pos = nextDestination.position;
		pos.y = transform.position.y;

		transform.rotation = Quaternion.Lerp(
			transform.rotation,
			Quaternion.LookRotation(pos - transform.position),
			rotateSpeed * Time.deltaTime
			);
	}

	private void OnTriggerEnter(Collider col)
	{
		if (col.CompareTag("Path"))
		{
			nextDestination = col.GetComponent<PathStatic>().NextDestination;
		}
	}
}

PathController.cs

using UnityEngine;

public class PathController : MonoBehaviour
{

	public Transform parentPath;

	private void Awake()
	{
		if (!parentPath)
			parentPath = this.gameObject.transform;

		setDestination();
	}

	private void setDestination()
	{
		//i = 0; i < 8; i = i + 1
		for (int i = 0; i < parentPath.childCount; i++)
		{
			Transform path = parentPath.GetChild(i);


			if ((i + 1) < parentPath.childCount)
			{
				path.GetComponent<PathStatic>().NextDestination = parentPath.GetChild(i + 1);
				path.name = string.Format("Path_t_{0}_{1}", i, (i + 1));

				continue;
			}

			path.name = string.Format("Path_t_{0}_n", (i));

		}
	}
}

PathStatic.cs

using UnityEngine;

public class PathStatic : MonoBehaviour
{
    public Color sphereColor;
    public new SphereCollider collider;

    private Transform nextDestination;

	public Transform NextDestination { get => nextDestination; set => nextDestination = value; }

	private void OnDrawGizmos()
	{
        Gizmos.color = sphereColor;

        Gizmos.DrawWireSphere(transform.position, collider.radius); 
	}
}