Programação de games

Ia [Peixe com pontos fixos] usando o NavMesh da Unity

07/01/2018 09:19:27
Roberto França Duarte

Dando continuidade a construção da Ia dos peixes do meu game de pesca. Nesse post, quero mostrar como fazer caminhos predefinidos, para que meu peixe ande somente nesse caminho.

Esse é um update do script do post passado: Ia [Peixe bobo] posição randômica usando NavMesh da Unity.

Primeiro passo, é criar um gameObject que terá todos os elementos. Fiz os pontos, no meu script, posso ter infinitos pontos.

Meu peixe,  coloco esses pontos:

Perceba que tenho um "EnumIasCurrent", isso serve para identificar qual tipo de Ia meu peixe pertence:

public EnumIas EnumIasCurrent;

Essa variável usa um tipo de class criada por mim. Que Guarda os tipos de Ias:

using UnityEngine;

using System.Collections;

namespace GamePlay

{

    public enum EnumIas : byte

    {

        SillyFish, // peixe bobo

        FixedRouteFish, // peixes com caminhos pre-definidos

        EscapingFish, // peixe que escapa

        PredatorFish // peixe que come os outros

    }

}

Veja:

E no script principal:

using UnityEngine;

using System.Collections;

using UnityEngine.AI;

using System;

namespace GamePlay

{

    public class UnitRandomIa : MonoBehaviour

    {

        public EnumIas EnumIasCurrent;



        public float wanderRadius = 30;

        public float wanderTimer = 0.8f;

        [SerializeField] private float speed;

       

        private Transform target;

        private NavMeshAgent agent;

        private Vector3 newPos;

        private bool stir = true;



        // ============ FixedRouteFish ===============

        [SerializeField] private Transform[] targetPoositionFixedRouteFish;

        private int idPosFixedRouteFish;



        private void OnEnable()

        {

            agent = GetComponent<NavMeshAgent>();

            agent.speed = speed;

        }



        private void Start()

        {

            StartDefalt();



        }



        private void StartDefalt()

        {

            switch (EnumIasCurrent)

            {

                case EnumIas.SillyFish:

                    StopCoroutine(ControllPositionIa1());

                    StartCoroutine(ControllPositionIa1());

                    break;

                case EnumIas.FixedRouteFish:

                    FixedRouteFishPos(0);

                    StopCoroutine(ControllPositionIa2());

                    StartCoroutine(ControllPositionIa2());

                    break;

                case EnumIas.EscapingFish:

                    break;

                case EnumIas.PredatorFish:

                    break;

            }

        }



        private void LateUpdate()

        {

            agent.SetDestination(newPos);

            print(idPosFixedRouteFish);

        }



        // ========== SillyFish =============

        private IEnumerator ControllPositionIa1()

        {

            while (stir)

            {

                SetPositionIa1();

                yield return new WaitForSeconds(wanderTimer);

                SetPositionIa1();

            }

        }

        private void SetPositionIa1()

        {

            newPos = RandomNavSphere(transform.position, wanderRadius, -1);

        }

        private static Vector3 RandomNavSphere(Vector3 origin, float dist, int layermask)

        {

            Vector3 randDirection = UnityEngine.Random.insideUnitSphere * dist;

            randDirection += origin;

            NavMeshHit navHit;

            NavMesh.SamplePosition(randDirection, out navHit, dist, layermask);

            return navHit.position;

        }

        // ========== SillyFish =============



        // ========== FixedRouteFish =============

       

        private IEnumerator ControllPositionIa2()

        {

            while (stir)

            {

                if (transform.position == targetPoositionFixedRouteFish[idPosFixedRouteFish].position)

                {

                    if (idPosFixedRouteFish < targetPoositionFixedRouteFish.Length - 1)

                    {

                        idPosFixedRouteFish++;

                    }

                    else

                    {

                        idPosFixedRouteFish = 0;

                    }

                       

                    FixedRouteFishPos(idPosFixedRouteFish);

                }

               

                yield return new WaitForSeconds(0.2f);

            }

        }



        private void FixedRouteFishPos(int id)

        {

            newPos = targetPoositionFixedRouteFish[id].position;

        }

        // ========== FixedRouteFish =============

    }

}

Veja o vídeo para ver o resultado.

Games em desenvolvimento:

Conheça meus games em desenvolvimento! Seu apoio faz a diferença para um desenvolvedor de games Indie Brazuca

Scripts Unity 3D / C#

Aqui você tera uma vasta coleção de scripts Unity 3D / c#...

Portfolio de desenvolvimento de games:

Conheça meus games desenvolvimento! Seu apoio faz a diferença para um desenvolvedor de games Indie Brazuca

Mecânica básica jogo carro 2D Unity

Nesse post, quero mostrar uma mecânica básica de jogo carro 2D na Unity. Basicamente ele vai para frente / trás e rotaciona. Usei o WheelJoint2D para usar a física de molas e motor da Unity: No caso usei 2 WheelJoint2D, um para cada roda, e via script fiz emitir força: using UnityEngine; namespace GamePlay { public class […]