martes, 11 de enero de 2022

IA inteligencia artificial persecución de los enemigos;

 

IA inteligencia artificial persecución de los enemigos


 

Voy avanzando mi blog con lo que estoy haciendo en la clonación de enemigos que me persiguen y destruyo de un zarpazo, el resultado es medio satisfactorio, falta pulir mucho, pero voy contando en el blog, en el video se ven imágenes de unos personajes medio trabajados que arian de vigilantes de seguridad y que irían persiguiendo al hombre lobo, este a su vez da unos zarpazos y les va arrancando la cabeza, también hay una mujer a la que se le acerca y de un zarpazo le arranca la cabeza.



1-el primer paso a sido poner un origen de las clonaciones de los personajes guardias de seguridad,

se van creando continuamente y les e puesto un Nav Mesh Agent.

2-E preparado el terreno, en este caso es un cubo que hace de suelo modelado con esa forma y desde el que puse la navegation...ver imagen


 

creí solo se podía hacer esto en un terreno típico de Unity pero yo lo echo partiendo de un cubo.

3- Un dato importante, los guardias no parten de base de las clonaciones, la base es un cubo que hace de padre sobre el que va el personaje de hijo el mismo guardia de seguridad en si mismo, e tenido que hacerlo así por que cuando iban apareciendo en cadena uno de tras del otro se auto destruían y aparecía el mismo personaje que no tiene cabeza y esta decapitado, porque los guardias tienen el script del actibate trigger que produce este cambio, e probado cambiar la velocidad de su Nav Mesh Agent. Para que no se tocasen entre si al ir clonándose pero no me funciono,




 



En la imagen se ven los personajes que están en prefabricado, la cabeza suelta, el cuerpo decapitado son los que aparecen con el script de ActivateTrigger, al colisionar el zarpazo en la parte de la cabeza del guardia, como se ve en el video de YouTube, desde luego aun falta muchísimo trabajo y muchísima practica del tema y aprendizaje...pero empiezo a construir unos personajes que me persiguen amenazadoramente, a esto e de añadirle un sistema de puntuación pero lo explicare mas adelante ademas de un sistema de vidas que valla perdiendo el hombre lobo si le atacan los guardias…..

.....................scripts ............................................


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class persecuciondeenmigoasiento2 : MonoBehaviour {


        Transform player;

        UnityEngine.AI.NavMeshAgent nav;


        void Awake ()
        {


            player = GameObject.FindGameObjectWithTag ("asiento2").transform;


            nav = GetComponent <UnityEngine.AI.NavMeshAgent> ();
        }


        void Update ()
        {

            nav.SetDestination (player.position);
    
        }
    }

----------------------------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------

para que no se ralentice el videojuego y liberar memoria el script de abajo

-------------------------------------------------------------------------------------------------------



using System;
using UnityEngine;

namespace UnityStandardAssets.Utility
{
    public class TimedObjectDestructor : MonoBehaviour
    {
        [SerializeField] private float m_TimeOut = 1.0f;
        [SerializeField] private bool m_DetachChildren = false;


        private void Awake()
        {
            Invoke("DestroyNow", m_TimeOut);
        }


        private void DestroyNow()
        {
            if (m_DetachChildren)
            {
                transform.DetachChildren();
            }
            DestroyObject(gameObject);
        }
    }
}

----------------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------------------------------

using System;
using UnityEngine;
using Object = UnityEngine.Object;

namespace UnityStandardAssets.Utility
{
    public class ActivateTrigger : MonoBehaviour
    {
        // A multi-purpose script which causes an action to occur when
        // a trigger collider is entered.
        public enum Mode
        {
            Trigger = 0,    // Just broadcast the action on to the target
            Replace = 1,    // replace target with source
            Activate = 2,   // Activate the target GameObject
            Enable = 3,     // Enable a component
            Animate = 4,    // Start animation on target
            Deactivate = 5  // Decativate target GameObject
        }

        public Mode action = Mode.Activate;         // The action to accomplish
        public Object target;                       // The game object to affect. If none, the trigger work on this game object
        public GameObject source;
        public int triggerCount = 1;
        public bool repeatTrigger = false;


        private void DoActivateTrigger()
        {
            triggerCount--;

            if (triggerCount == 0 || repeatTrigger)
            {
                Object currentTarget = target ?? gameObject;
                Behaviour targetBehaviour = currentTarget as Behaviour;
                GameObject targetGameObject = currentTarget as GameObject;
                if (targetBehaviour != null)
                {
                    targetGameObject = targetBehaviour.gameObject;
                }

                switch (action)
                {
                    case Mode.Trigger:
                        if (targetGameObject != null)
                        {
                            targetGameObject.BroadcastMessage("DoActivateTrigger");
                        }
                        break;
                    case Mode.Replace:
                        if (source != null)
                        {
                            if (targetGameObject != null)
                            {
                                Instantiate(source, targetGameObject.transform.position,
                                            targetGameObject.transform.rotation);
                                DestroyObject(targetGameObject);
                            }
                        }
                        break;
                    case Mode.Activate:
                        if (targetGameObject != null)
                        {
                            targetGameObject.SetActive(true);
                        }
                        break;
                    case Mode.Enable:
                        if (targetBehaviour != null)
                        {
                            targetBehaviour.enabled = true;
                        }
                        break;
                    case Mode.Animate:
                        if (targetGameObject != null)
                        {
                            targetGameObject.GetComponent<Animation>().Play();
                        }
                        break;
                    case Mode.Deactivate:
                        if (targetGameObject != null)
                        {
                            targetGameObject.SetActive(false);
                        }
                        break;
                }
            }
        }


        private void OnTriggerEnter(Collider other)
        {
            DoActivateTrigger();
        }
    }
}