Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Temas recientes

Script cierra unity

Iniciado por MotoSierraProducciones, Enero 20, 2019, 04:57:35 PM

Tema anterior - Siguiente tema
Hola, estaba haciendo una ia y al hacer este script unity se cierra, no me deja añadirlo a ningun objeto, al añadirlo se cierra automaticamente.
 
no le veo nada fuera de lo comun y es un par de lineas, y este es el script del error, con ningun otro me hace eso
 

#pragma strict
var agent: NavMeshAgent = GetComponent.<NavMeshAgent>();
var Salud = 100;
var Meta : Transform;
var Patrullar = true;
var Puntos [] : Transform;
function Update() {
Meta = GameObject.FindGameObjectWithTag("Enemigo").transform;
agent.destination = Meta.position;
   
if (Salud <= 0) {
   Destroy (this.gameObject);
}
}
function OnTriggerEnter (otro : Collider) {

if (otro.tag == "Enemigo") {
   Salud --;
}
}

 
 

Enero 21, 2019, 08:03:08 AM #1 Ultima modificación: Enero 21, 2019, 08:03:59 AM por leocub58

Meta = GameObject.FindGameObjectWithTag("Enemigo").transform;

 
Pásalo al Start, de todas maneras no le veo sentido a que se cierre, ¿tienes buena máquina? Y sino reinstalate el unity.
 
Por cierto, que unity es? Veo que utiliza unityscript

Hola, Esta en el UpDate por que esa "Meta" al ser destruida debe de cambiar de objeto, si no se queda como null, la version es 5.0.0.f4
 
Te hago una pregunta, como puedo lograr que un objeto localice varios objetivos automaticamente?
 
 
 

function Objetivos () {
    var Obj : Transform[];
     obj = GameObject.FindGameObjectsWhitTag("Enemigo").transform;
}

 
Esto es lo que he encontrado pero me tira error, no es una propiedad .transform

Enero 24, 2019, 04:38:08 PM #3 Ultima modificación: Enero 24, 2019, 04:46:36 PM por francoe1
Te recomiendo algo para que lo tomes muy encerio y lo apliques desde el momento que lees este comentario.
 
1 - No deberias usar UnityScripts, ya se encuentra descontinuado y es un pseudo lenguaje donde confunde muchas características de la programación orientada a objeto. Desde este momento empieza por utilizar C#, todo te sera mucho mas simple y a medida que avances podrás resolver problemáticas complejas que UnityScripts no puede.
 
2 - El foro recomiendo una versión estable de Unity y esta es la que deberias de tener, con más razón si estás aprendiendo.
 
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 
Cuando empieces a programar con C# necesitarás practicar la abstracción de los problemas para poder reflejarlos dentro del código.
 
Te dejo el código que publicaste en C# y comentado-
 

//Using sirve para incluir [NameSpace (Nombres de espacio)] al codigo librerias de tercero, por ejemplo,
//System contiene clases como Action que se utiliza para representar un evento. UnityEngine contiene a MonoBeahviour, Transform, Vector3,2, etc.
using System;
using System.Collections; // NameSpace que contiene IEnumerator.
using UnityEngine;
   
[RequireComponent(typeof(NavMeshAgent))] // Atributo que indica que el componente NombreScripts requiere que el Objeto donde esta asignado contenga NavMeshAgent, Si no lo contiene lo agrega automaticamente.
public class NombreScripts : MonoBehaviour // <<< Todos los componente en Unity requiere Heredar de esta clase para que funcionen. Existen otros tipos de componentes que mas adelante podras ir descubriendo.
{
private NavMeshAgent m_navMeshAgent {get; set;}   // Componente NavMeshAgent usado como CACHE
private Transform m_meta {get; set;} // Variable Transform usado como CACHE

[SerializeField]
private int m_salud = 100; // Variable de Tipo Entero, utilizada para la SALUD
[SerializeField]
private bool m_patrullar = false; // Variable de Tipo Booleano, ¿utilizada como BANDERA (Flag)?
[SerializeField]
private Transform[] Puntos = null; // Variable de Tipo Arreglo de Transform, ¿Utilizada para el recorrido (WayPoints)?
[SerializeField]
private Action m_eventDead;    // Evento, al ser invocado se llaman todos los delegados (Funciones) asignado.

public bool IsAvailableMeta { get { return  m_meta != null; } } // Propiedad que nos returna con un Booleano si la Variable m_meta es NULL.

private void Awake()
{
   m_navMeshAgent = GetComponent<NavMeshAgent>(); // Obtenemos el componente NavMeshAgent y lo asignamos a m_navMeshAgent.

   m_eventDead += () =>  //Asignamos un delegado Anonimo al evento m_eventDead, este delegedo Destruye el objeto cuando muere.
   {
      Destroy(gameObject);
   };
   
   StartCorrutine(YieldUpdate()); // Iniciamos una corrutina para evitar buscar en cada ciclo del Update. Esto lo hago para que entiendas como funcionan estas cosas en C#.
}

private IEnumarator YieldUpdate() // Las Corrutinas son delegados que retornan un object IEnumerator, no es complejo de comprender pero en este momento te podria complicar bastante.
{
   while(true)  // Ciclo infinito
   {
      if(IsAvailableMeta) // Comprobar si m_meta esta asignado, si es asi, entonces que espere 1 segundo y vuelva a repetir el bucle.
      {
         yield return new WaitForSeconds(1);
         continue;
      }
      
      // si la condición anterior es falsa, entonces se llama a la función FindMeta, si se encuentra una meta se vuelve a dar 5 segundo antes de repetir el ciclo nuevamente, de lo contrario solo 1 segundo.
      
      if(FindMeta())
         yield return new WaitForSeconds(5);         
      else
         yield return new WaitForSeconds(1);         
   }
}

private void Update()
{
   if(IsAvailableMeta) // Si m_meta esta asignado entonces creas la logica requerida.
   {
   
   }
}

private bool FindMeta() // Metodo que nos devuelve un booleano para saber si se entontro o no una meta
{
   GameObject go = GameObject.FindGameObjectWithTag("Enemigo"); // Buscamos un GameObject que contenga el TAg Enemigo y lo asignamos a go (Variable Local)
   if(go != null) // Si go es diferente a NULL tomamos el componente transform y lo asignamos a m_meta, a la misma vez cortamos la ejecución de la función retornando un valor verdadero.
   {
      m_meta = go.transform;
      return true;
   }
   else // Si go es NULL entonces se cota la ejecución de la función retornando un valor falso.
   {
      return false;
   }
}

private void OnTriggerEnter(Collider col)
{
   if(col.gameObject.CompareTag("Enemigo")) // Utiliza CompareTag para verificar si el objeto colisionado tiene como TAG "Enemigo"
      TakeDamage(1); // Si es asi aplicar Daño de 1.
}

public void TakeDamage(int amount) // Función que aplica daño modificando la variable m_salud con el valor enviado a través del parametro amount.
{
   m_salud -= amount; // se decrementa m_salud con el valor de amount.
   if(m_salud <= 0 && m_eventDead != null) // se comprueba si m_salud es menor o igual a cero y si m_eventDead es diferente a null. m_eventDead es null cuando no se le asigna ningun delegado.
      m_eventDead.Invoke(); // si la condición anterior se cumple entonces invocamos m_eventDead.
}
}

 
 

Cita de: francoe1 date=15483442881 - No deberias usar UnityScripts, ya se encuentra descontinuado y es un pseudo lenguaje donde confunde muchas características de la programación orientada a objeto. Desde este momento empieza por utilizar C#, todo te sera mucho mas simple y a medida que avances podrás resolver problemáticas complejas que UnityScripts no puede.
   


Ese debería ser el mensaje de bienvenida al foro cuando te registrás  ...
 
Bienvenido a la comunidad nuevo usuario! ... Primero dejanos decirte alto muy importante: No deberias usar UnityScript, ya se encuentra descontinuado y es un pseudo lenguaje donde confunde muchas características de la programación orientada a objeto. Desde este momento empieza por utilizar C#, todo te sera mucho mas simple y a medida que avances podrás resolver problemáticas complejas que UnityScript no puede ... en fin, bienvenido a la comunidad !      El Admin :)      
 
 
 
Cita de: MotoSierraProducciones date=1548305331Hola, Esta en el UpDate por que esa "Meta" al ser destruida debe de cambiar de objeto, si no se queda como null, la version es 5.0.0.f4
   


Ningun "find" en update, es la regla de oro de la programación en Unity. Tampoco ningun Camera.main (que es similar) y evitar a toda costa reiterados GetComponent's. Seguramente exista una forma de arreglarlo, siempre la hay (o casi siempre). Por ejemplo, podrías primero (en start por ej) buscar las referencias a todos los enemigos para luego  (en update) empezar a laburar sobre el transform y definir la "meta", algo muy distinto que andar frame a frame buscando a todos los enemigos.

Cita de: francoe1 date=1548344288Te recomiendo algo para que lo tomes muy encerio y lo apliques desde el momento que lees este comentario.
   
   
      1 - No deberias usar UnityScripts, ya se encuentra descontinuado y es un pseudo lenguaje donde confunde muchas características de la programación orientada a objeto. Desde este momento empieza por utilizar C#, todo te sera mucho mas simple y a medida que avances podrás resolver problemáticas complejas que UnityScripts no puede.
   
   
      2 - El foro recomiendo una versión estable de Unity y esta es la que deberias de tener, con más razón si estás aprendiendo.
   
   
      ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   
   
      Cuando empieces a programar con C# necesitarás practicar la abstracción de los problemas para poder reflejarlos dentro del código.
   
   
      Te dejo el código que publicaste en C# y comentado-
   
   

//Using sirve para incluir [NameSpace (Nombres de espacio)] al codigo librerias de tercero, por ejemplo,
//System contiene clases como Action que se utiliza para representar un evento. UnityEngine contiene a MonoBeahviour, Transform, Vector3,2, etc.
using System;
using System.Collections; // NameSpace que contiene IEnumerator.
using UnityEngine;
   
[RequireComponent(typeof(NavMeshAgent))] // Atributo que indica que el componente NombreScripts requiere que el Objeto donde esta asignado contenga NavMeshAgent, Si no lo contiene lo agrega automaticamente.
public class NombreScripts : MonoBehaviour // <<< Todos los componente en Unity requiere Heredar de esta clase para que funcionen. Existen otros tipos de componentes que mas adelante podras ir descubriendo.
{
private NavMeshAgent m_navMeshAgent {get; set;}   // Componente NavMeshAgent usado como CACHE
private Transform m_meta {get; set;} // Variable Transform usado como CACHE

[SerializeField]
private int m_salud = 100; // Variable de Tipo Entero, utilizada para la SALUD
[SerializeField]
private bool m_patrullar = false; // Variable de Tipo Booleano, ¿utilizada como BANDERA (Flag)?
[SerializeField]
private Transform[] Puntos = null; // Variable de Tipo Arreglo de Transform, ¿Utilizada para el recorrido (WayPoints)?
[SerializeField]
private Action m_eventDead;    // Evento, al ser invocado se llaman todos los delegados (Funciones) asignado.

public bool IsAvailableMeta { get { return  m_meta != null; } } // Propiedad que nos returna con un Booleano si la Variable m_meta es NULL.

private void Awake()
{
   m_navMeshAgent = GetComponent<NavMeshAgent>(); // Obtenemos el componente NavMeshAgent y lo asignamos a m_navMeshAgent.

   m_eventDead += () =>  //Asignamos un delegado Anonimo al evento m_eventDead, este delegedo Destruye el objeto cuando muere.
   {
      Destroy(gameObject);
   };
   
   StartCorrutine(YieldUpdate()); // Iniciamos una corrutina para evitar buscar en cada ciclo del Update. Esto lo hago para que entiendas como funcionan estas cosas en C#.
}

private IEnumarator YieldUpdate() // Las Corrutinas son delegados que retornan un object IEnumerator, no es complejo de comprender pero en este momento te podria complicar bastante.
{
   while(true)  // Ciclo infinito
   {
      if(IsAvailableMeta) // Comprobar si m_meta esta asignado, si es asi, entonces que espere 1 segundo y vuelva a repetir el bucle.
      {
         yield return new WaitForSeconds(1);
         continue;
      }
      
      // si la condición anterior es falsa, entonces se llama a la función FindMeta, si se encuentra una meta se vuelve a dar 5 segundo antes de repetir el ciclo nuevamente, de lo contrario solo 1 segundo.
      
      if(FindMeta())
         yield return new WaitForSeconds(5);         
      else
         yield return new WaitForSeconds(1);         
   }
}

private void Update()
{
   if(IsAvailableMeta) // Si m_meta esta asignado entonces creas la logica requerida.
   {
   
   }
}

private bool FindMeta() // Metodo que nos devuelve un booleano para saber si se entontro o no una meta
{
   GameObject go = GameObject.FindGameObjectWithTag("Enemigo"); // Buscamos un GameObject que contenga el TAg Enemigo y lo asignamos a go (Variable Local)
   if(go != null) // Si go es diferente a NULL tomamos el componente transform y lo asignamos a m_meta, a la misma vez cortamos la ejecución de la función retornando un valor verdadero.
   {
      m_meta = go.transform;
      return true;
   }
   else // Si go es NULL entonces se cota la ejecución de la función retornando un valor falso.
   {
      return false;
   }
}

private void OnTriggerEnter(Collider col)
{
   if(col.gameObject.CompareTag("Enemigo")) // Utiliza CompareTag para verificar si el objeto colisionado tiene como TAG "Enemigo"
      TakeDamage(1); // Si es asi aplicar Daño de 1.
}

public void TakeDamage(int amount) // Función que aplica daño modificando la variable m_salud con el valor enviado a través del parametro amount.
{
   m_salud -= amount; // se decrementa m_salud con el valor de amount.
   if(m_salud <= 0 && m_eventDead != null) // se comprueba si m_salud es menor o igual a cero y si m_eventDead es diferente a null. m_eventDead es null cuando no se le asigna ningun delegado.
      m_eventDead.Invoke(); // si la condición anterior se cumple entonces invocamos m_eventDead.
}
}

   
       
   


Agunas cosas si las entendi, pero se me complica muchisimo entender en C#, desde que inicie fue con JS, tratare de segir el consejo, espero me puedas hechar la mano de vez en cuando si me llego a atorar con algunas lineas, un saludo y gracias por tomarte la molestia de responder, aprecio el apoyo brindado!

Etiquetas: