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




sábado, 8 de enero de 2022

Clonar enemigos con Unity.;Instantiation...;clonaciones;


 

Clonar enemigos con Unity.


Mirando tutoriales e visto como clonar personajes que fluyen continuamente de la nada en una escena de Unity, yo no tengo conocimientos para programar algo así, pero luego estuve pensando, jolín si clono proyectiles y consigo hacer disparos, pues uso el mismo sistema para personajes con movimiento incluido, y lo e conseguido aquí en el video podéis verlo, unos personajes prefabricados, con su rigidbody, ahora e de probar la persecución al player del videojuego…..le e de poner un NavMesh Agent y de preparar el terreno con un…


siguiendo este tema antes de poner un efecto de NavMesh Agent para que los clones persigan al player....... añado ejemplos de scripts sobre clonaciones y de Instantiation...

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

public class clonar2 : MonoBehaviour {


//public class clonar2 : MonoBehaviour {




// using UnityEngine;

//public class InstantiateExample : MonoBehaviour
// {
public GameObject prefab;

void Start()
{
for (int i = 0; i < 10; i++)
Instantiate(prefab, new Vector3(i * 2.0f, 0, 0), Quaternion.identity);
}
}

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

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

public class clonar3 : MonoBehaviour {

    // Use this for initialization
    //void Start () {
        
//    }
    
    // Update is called once per frame
    //void Update () {
        
    //}
//}



//public class Instantiation : MonoBehaviour {

    void Start() {
        for (int y = 0; y < 5; y++) {
            for (int x = 0; x < 5; x++) {
                GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
                cube.AddComponent<Rigidbody>();
            //    cube.transform.position = new Vector3(x, y, 0);

                cube.transform.position = new Vector3 (-31f, -0.127f, -47f);


            }
        }
    }
}
-------------------------------------------------------------------------------------------------------------

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

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

public class clonar4 : MonoBehaviour {

    // Use this for initialization
//    void Start () {
       
//    }
    
    // Update is called once per frame
    //void Update () {
       
//    }
//}


public Transform brick;

void Start() {
    for (int y = 0; y < 5; y++) {
        for (int x = 0; x < 5; x++) {
        //    Instantiate(brick, new Vector3(x, y, 0), Quaternion.identity);

                Instantiate(brick, new Vector3(-31f, -0.127f, -47f), Quaternion.identity);

        }
    }
}
}

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

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

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

public class clonar5 : MonoBehaviour {
    public GameObject prefab;
    public int numberOfObjects = 20;
    public float radius = 5f;
    // Use this for initialization
    void Start () {

        for (int i = 0; 1 < numberOfObjects; i++) {
            float angle = i * Mathf.PI * 2 / numberOfObjects;
            Vector3 pos = new Vector3 (Mathf.Cos (angle), 0, Mathf.Sin (angle)) * radius;
            Instantiate (prefab, pos, Quaternion.identity);

        }
    }
//}
    // Update is called once per frame
//    void Update () {
       
    }
//}

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

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

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

    public class clonar11 : MonoBehaviour
    {


public GameObject prefab;
public int numberOfObjects = 20;
public float radius = 5f;

void Start()
{
    for (int i = 0; i < numberOfObjects; i++)
    {
        float angle = i * Mathf.PI * 2 / numberOfObjects;
        Vector3 pos = new Vector3(Mathf.Cos(angle), 0, Mathf.Sin(angle)) * radius;
        Instantiate(prefab, pos, Quaternion.identity);
    }
}

}
-----------------------------------------------------------------------------------------------------------------

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

Los scripts de la parte inferior del video son los que e utilizado en el ejemplo del mismo video .

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

public class plumadaauno : MonoBehaviour {



        //public GameObject Sphere;
        // Use this for initialization




        public Rigidbody Sphere;
        public float velocidad = 1f;
        void disparador () {
            Rigidbody SphereClon = (Rigidbody) Instantiate (Sphere, transform.position, transform.rotation);
            SphereClon.velocity = transform.up * velocidad;

            //void Start () {

        }

        // Update is called once per frame
        void Update () {


            //    void Update () {
        }

        void OnTriggerEnter(Collider other) {
            //if (other.gameObject.CompareTag ("avismo")){
            //if (other.gameObject.CompareTag ("pepe")){
            if (other.gameObject.CompareTag ("pollo")){


                //if (Input.GetKey (KeyCode.Space)) {
                //Instantiate (Sphere);


                disparador ();///////////////////////////imbento yo


            }}
    }


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

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

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

public class disparadorautomaticocañonenemigo10peroa1 : MonoBehaviour {


        // Use this for initialization
        void Start () {

            //transform.rotation = Quaternion.Euler (0,45, 0);
        }

        // Update is called once per frame
        void Update () {
            // Es la rotacion de Angulos de Euler en grados.
            transform.Rotate (new Vector3 (0 * Time.deltaTime,1.1f, 0), Space.Self);


        }
    }




esta entrada seguirá en construcción a lo largo de esta quincena de enero del 2022.....es muy laboriosa, y ala vez que comento, estoy practicando y aprendiendo, 


algunos datos interesantes a continuación, estoy aprendiendo de este enlace

https://docs.unity3d.com/es/530/Manual/InstantiatingPrefabs.html

y una curiosidad, copiar a mano los scripts me cuesta un montón yo utilizo 



MonoDevelop - Unity 

 para hacer mis scripts, entonces uso la opción de seleccionar los textos de la web de los ejemplos de Unity.... copiar y pegar, y me encuentro que no los pega en el MonoDevelop de Unity, como también tengo y utilizo el

Microsoft Visual Studio para ver los scripts, lo abro pego aquí lo que me interesa y si aquí queda copiado pegado me lo admite..!!!!!......y desde aquí ,desde el visual studio ,buelbo a copiar y a pegar al que utilizo con Unity el MonoDevelop - Unity 

y así e resuelto este fastidioso problema, se que en realidad lo ideal seria copiar a mano los scripts pero es muy entretenido de tiempo y de vez en cuando creo se adelanta mas copiando y pegando...en fin son métodos de aprendizaje que utilizamos cada uno




jueves, 6 de enero de 2022

¿Como destruir enemigos con Unity?;

 

¿Como destruir enemigos con Unity?

Pongo divertido video de YouTube explicando el tema, divertido para mi, por que me estoy de paso promocionando, en plan que estupendo soy lo estoy haciendo todo genial...¡¡¡¡ja ja ja ja ja !!!!

(Se escuchan unos rujidos de fondo, pertenecen al juego cuando se ejecuta, pero no molestan excesivamente para comprender el video, solo duran unos momentos... )



Explico un problema que tenia con colisiones y destrucción de enemigos.

Creo esta resuelto con el siguiente script en C#….

ESCALAR

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

public class ESCALAR : MonoBehaviour {

    // Use this for initialization
    void Start () {
        
    }
    
    // Update is called once per frame
    void Update () {


        if (Input.GetKeyDown(KeyCode.M))// funciona pasito a pasito


        // En los 3 ejes estatico. 
        //transform.localScale = new Vector3 (0.5f * Time.deltaTime, 0.5f, 0.0f); 
        // En los 3 ejes Dinámico.
//    transform.localScale += new Vector3 (0.5f * Time.deltaTime, 0.0f, 0.0f); 
        // En un solo eje Dinámico.
        transform.localScale += Vector3.right * 77* Time.deltaTime;



        if (Input.GetKeyUp(KeyCode.M))// funciona pasito a pasito




            transform.localScale -= Vector3.right *77* Time.deltaTime;

        
    }
}



al apretar la tecla “m” la esfera que tiene el hombre lobo se escala y al tocar el Trigger activado de la victima produce su aniquilación, esta asu vez tiene el script de “activate Trigger” que hace el cambio de personajes de vivo a aniquilado.




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





martes, 4 de enero de 2022

Sobre contenido de videojuegos para + de 18 años.;


Hola parece que en gamejolt.com han cambiado algunas directrices en cuanto a publicar los videojuegos han suprimido el contenido para adultos. 

 

Estaré pendiente de este asunto no sea un mal entendido y cambiare la información si el error es mio...

Esto afecta algunos de mis videojuegos que echo últimamente y que muestro y comento en mi blog, no me afecta demasiado puesto que en /itch.io/ los tengo también publicados.

Quien curiosee en mi blog los podrá jugar y descargar si gustan desde ...


https://tozudo415.itch.io/

aquí el enlace de Game jolt pero solo contenido de menores de 18 años..

https://paco415.gamejolt.io


 Y prueba un poco mi videojuego desde webGL, moverse teclas w-a-s-d y mas cosas......ja ja ja ja!!!!

lunes, 3 de enero de 2022

Modelaje con blender de elementos del videojuego y juego de luces.;

 

Modelaje con blender de elementos del videojuego y juego de luces.


https://youtu.be/Iz7Hd55WsW8


 

añado enlace de video de YouTube sobre las luces de neón e iluminación, este apartado es muy interesante para entender la iluminación de la maquina de refrescos y la marca de vevida que me e inventado para el videojuego.

Añado capturas de pantalla del modelaje para hacer una maquina expendedora de metro de unas vevidas que e inventado yo.

1-Partimos de añadir un cubo. En modo objeto.


 

2-En modo objeto le damos a escalar para darle unas proporciones por el estilo de las maquinas expendedoras que vemos habitualmente por las ciudades.

 


3-En este paso elegimos modo edición.

 



4-Aquí cortar bucle, es importante seguir la imágenes y los pasos.

 


5-De esta manera vamos seleccionando y marcando el cubo con varios cortes, que nos permitirán modelar, borrar secciones del cubo, para dar la forma de una maquina expendedora, la memoria es frágil, y es muy fácil buscar imágenes de maquinas por internet para fijarnos como están echas, y que formas tienen para hacer una a nuestro gusto.


 

6.Seleccionamos como se ve en la captura de pantalla caras, por que vamos a borrar lo que no nos interesa.


 


7- Ver la imagen modelo 8.

 


8- seleccionar… como se ve en la captura 9 hemos seleccionado unas caras que vamos a extrusionar.

 


9- En la captura 10 ver lo marcado y arrastrar con el ratón se forma un hueco en el cubo.

 


10- En la captura 11 vamos hacer unos estantes, seleccionamos, bordes fijarse en la imagen ,bordes seleccionados, no caras.

 



11- Y ahora extruir esos bordes, estiramos y luego corregimos ….

 


12- Buscar unas texturas por internet y aplicarlas al modelo


 

13 – texture paint para poder poner luego en Unity cualquier textura.

14- seguir las imágenes






 

15-detalles de la luz, mirar el video para entenderlo mejor..https://youtu.be/Iz7Hd55WsW8

 


lunes, 27 de diciembre de 2021

Como poner una película en un juego de Unity hecho con webGL,;

Como poner una película en un juego de Unity hecho con webGL, Haciendo un juego de ida y vuelta por animación con 4 o 5 planos que se van cruzando con distintas capturas de imagen dan la ilusión de movimiento....en este blog pongo los pasos y los detalles, lo ideal es hacerlo por programación, pero el ingenio también da algunas soluciones,

 

Es muy sencillo poner una película cuando se compila en Unity para versión de pc, se compila para pc y sale la película espectacular, funciona al poner un archivo en formato mp4 al video player, este ser arrastra a un cubo con forma de pizarra y no hay nada mas que hacer, en un plano a mi no me funciona a de ser una cubo súper aplanado, el problema viene al compilar para webGL, hay no funciona no sale ni a tiros, seguro hay gente sabe solucionarlo, yo de momento para hacer una animación de película muy sencilla me da el pego el poner 4, o 5 o si se quiere trabajar mas el tema ,,,,yo de momento lo e probado con 5 cubos aplanados con una imagen en cada uno de ellos diferente que se van entrecruzando entre ellos, lo e echo por animación de movimiento de estas piezas, algo parecido a cuando se hacen en un blog de papel 10 o 20 dibujos que al solaparlos y darle con el dedo en una esquina dan la impresión de película animada….de momento son pruebas para una nueva versión de mi juego...la tercera parte que quiero hacer de….The wolf man of the underground



domingo, 19 de diciembre de 2021

A jugar; demo;

miércoles, 15 de diciembre de 2021

Dedicacion a la gente que me sigue de una forma u otra; sugerido por youtube que lo aga; y sigo desarrollando;


 

y sigo desarrollando..............................................................................

Siguiendo el videojuego, con su desarrollo, estoy trabajan dome una escena en el interior del vagón que me va a dar mas trabajo que todas las demás, estoy procurando pulir la escena con movimientos personales de cada individuo sentado, y e de modelar o al menos pintar vestidos diferentes para cada uno de ellos, tengo una dificultad con las colisiones y los cambios del personaje que es atacado, el cambio a estar fallecido y decapitado por el zarpazo del hombre lobo,

el cambio del personaje a fallecido lo ocasiona el manotazo que da el hombre lobo, y el problema seque tanto al caminar como al golpear hay la misma distancia cuando toca la cabeza del atacado, y no se nota una diferencia, simplemente al acercarse a la victima por el balanceo de los brazos toca su cabeza y se lo carga y sale el personaje de fallecido,

e intentado corregir este problema poniendo unos topes en el suelo que luego los transparentaría, que impiden se acerque el hombre lobo demasiado alas victimas y las toque y mueran, pero cuando le doy ala tecla “m” que acciona el zarpazo como usa la misma distancia . No toca tampoco a la victima y no funciona…..

ya solo se me ocurría cambiar las animaciones del hombre lobo, hacerlas yo caminando, no me funciona porque no tengo talento o capacidad de trabajo para que resulte realista, así que e buscado animaciones ya echas pero que no hubiese el balanceo de los brazos. Para así cuando se acercase a las victimas no las matase solo por acercarse a ellas, pero no encontré ninguna sin balanceo, lo que si encontré es un giro de 360 grados con los brazos que alarga mas la distancia para poder tocar a las victimas y la estoy probando para que resulte efectivo que las mate al golpear y no solamente por acercarse a ellas y tocarlas sin querer por balanceo de brazos caminando….

Bueno y tengo que hacer mas detalles de sangre salpicada en el vagón, y corregir que las cabezas arrancadas parecen de chicle y están fuera del cuerpo de las victimas pero siguen pegadas a ellas...en fin solo es trabajo se que lo puedo mejorar, trabajando mas y mas tiempo, espero no aborrecer este trabajo y poder publicarlo estas navidades u año nuevo,

también estoy procurando retocar otras escenas, detalles de jugar con la luz la ambientación, y manipular el tiempo de unas y de otras, si es muy corto o muy largo estropea ciertas sensaciones que quiero transmitir, al igual que el jugar con las cámaras, los puntos de vista de estas , es importantísimos enfocar de forma correcta los detalles que deseo transmitir…...bueno solo es trabajo...al ataque que estoy enganchado mas que nunca al tema….(continuara…...)