Unity 3D: GameObject seguir caminho pré-definido

Unity 3D: GameObject seguir caminho pré-definido

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

Publicado em

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); 
	}
}

 

Gunnar Correa
Gunnar Correa

Autodidata, Graduado em Desenvolvimento Web, Especialista em Tecnologias na Educação e Pós-graduando em Segurança da Informação. Começou seus estudos na área de programação quando era criança, e atualmente, está estudando desenvolvimento de jogos. Fundador da SatellaSoft, criado em 2009 com o intuito de compartilhar conhecimento de forma gratuita e inédita.

Deixe um comentário
Aguarde...