Unity Spain

Post Antiguos => General (Antiguo) => Mensaje iniciado por: ramunda en Julio 08, 2015, 09:45:17 PM

Título: non-static member???
Publicado por: ramunda en Julio 08, 2015, 09:45:17 PM
Holaaaa muy buenas!!!
 
tengo una duda que me trae de cabeza.
 
Tengo este script en c#

using UnityEngine;
using System.Collections;
public class disparosyrecargos2 : MonoBehaviour {
public Rigidbody Bala;
float Velocidad = 80;
public float municion = 20;
float municionderecargo = 20;
public float municiontotal = 150;
float Conteo = 0;
public GUIText guimuni;
public GUIText guitotal;
public GameObject destello;
public GameObject manoanim;
//GameObject municionanim;
//AudioClip sonido;
public AudioClip recarga;
public AudioClip gunShot;
public AudioClip vacio;
void Start (){
destello.active = false;
}
void Update (){
guimuni.text = "Balas " + municion.ToString();
guitotal.text = "Total Balas " + municiontotal.ToString();
    if (Input.GetButton("Fire1")){
       
        Conteo = Conteo + 1;
       
    if(Conteo > 20){
    
     Conteo = 0;
}   
    if(Conteo == 20 && municion > 0 && municiontotal >= 0){
          
        //var clona=Instantiate(Bala, transform.position, transform.rotation);
   //clona.velocity = transform.TransformDirection(Vector3(0, 0, Velocidad));
   Rigidbody clone;
   clone=Instantiate(Bala, transform.position, transform.rotation) as Rigidbody;
   clone.velocity = transform.TransformDirection(Vector3.forward * 90);
   municion -= 1;
         Destroy (clone,1.0f);      
   AudioSource.PlayClipAtPoint(gunShot, transform.position, 1);AudioListener.volume = 0.1f;
}
}
if(Input.GetKeyDown("r") && municiontotal > 0 && !Input.GetMouseButton(0) && !Input.GetMouseButton(1)){
    
///GetComponent.<Animation>().Play("Reload");
    municion = 0;
    Invoke ("recargando",2);
    AudioSource.PlayClipAtPoint(recarga, transform.position, 1);
 
}
if(Input.GetMouseButtonDown(0)){
///AudioSource.PlayClipAtPoint(vacio, transform.position, 1);
destello.active = true;
}
else
if(Input.GetMouseButtonUp(0)){
//AudioSource.PlayClipAtPoint(vacio, transform.position, 1);
destello.active = false;
}   
if (municion <= 0){
if(Input.GetMouseButtonUp(0)){
AudioSource.PlayClipAtPoint(vacio, transform.position, 1);
destello.active = false;
}   
}
}
void recargando (){
if(municiontotal > 0){
municiontotal -= municionderecargo;
municion += municionderecargo;
}
if (municion > municionderecargo){
municion = municionderecargo;
}
}

el script en si funciona bien el problema es cuando le agrego a un cubo objeto"cualquiera" este script diminuto para que me añada balas a la municiontotal cuando entre en su triger....bien pues me tira este error.
 
Primero el script tanbien en c#

using UnityEngine;
using System.Collections;
public class recargamunicion2 : MonoBehaviour {
// Use this for initialization
   void OnTriggerEnter (Collider other) {
      if(other.gameObject.name == "Jugador"){
         // Accedo al script de ArmasEstado y actualizo la MunicionActual.
         disparosyrecargos2.municiontotal=100; ////aqui llamo al otro script y intento añadirle..
         // Destruyo el cargador de municion
         Destroy(other.gameObject);
   }
}
}

y el error:
 
recargamunicion2.cs(11,52): error CS0120: An object reference is required to access non-static member `disparosyrecargos2.municiontotal'
 
 
alguna idea porfavor?
 
Gracias!!!!!!!!!!!
 
 
 
 
 
Título: non-static member???
Publicado por: Arthure en Julio 08, 2015, 09:57:09 PM
la idea es que no estas accediendo al componente del gameobject
Título: non-static member???
Publicado por: ramunda en Julio 08, 2015, 10:03:14 PM
Cita de: Arthure date=1436385429la idea es que no estas accediendo al componente del gameobject
 
Hola Arthure, perdona pero no te entiendo. donde tengo other deberia poner el nombre o gametag de el objeto al que colisiona?
 
En este caso una caja de munición.
Título: non-static member???
Publicado por: francoe1 en Julio 08, 2015, 10:46:23 PM
Primero, necesitas generalizar y adaptarte a la programación orientada en GameCenter, esto te ayudara muchísimo.
¿A que me refiero?
Bueno, cuando estas programando un juego necesitas que todos los eventos estén controlados, por ejemplo: "Disparar un Cañón", en principio, necesitas saber si en el lugar y tiempo esta habilitada esta opción, luego tener seleccionado el cañón, y por ultimo la comprobación de disponibilidad de munición dentro del arma.
 
Entonces cuando vamos a crear un armar debes primero empezar por ¿Que tienen todas las armas en común?, entonces te llega a la cabeza lo siguiente, todas las armas de fuego tienen Munición y para esto necesitamos una clase ya que tenemos los mismo parámetros con diferentes valores, Distancia, Cadencia de Fuego, y a la misma vez esta tiene 2 eventos, disparo y recarga.


Bien teniendo analizado el tema, deberíamos crear una clase Madre que la llamaríamos "Weapon" Y una Segunda Llamada "Bullet"

public class Weapon : MonoBehaviour
{
    public int Munition;
    public int MaxMunition;
    public int Ratio;
    public int Distance;
    public Bullet MyBullet;
   
    public virtual void Shoot()
    {
        //Comprobar Municion Disponible
    }
   
    public virtual void Reload()
    {
        //Comprobar que la municion no pase de la Maxima
    }
}
//Crear un nuevo script con este nombre, para poder utilizarlo como componente.
public class Bullet : MonoBehaviour
{
    public int Weight;
    public string Calibre;
}

Bien ahora nos queda armar el arma, quisiéramos que nuestra nueva arma sea una Uzi, creas un nuevo script con el nombre Weapon_Uzi

public class Weapon_Uzi : Weapon
{
    public int Cartridge = 10; // Agregamos un nuevo componente, Cartuchos.
   
    public override void Shoot()
    {
        Base.Shoot();
        //Al Llamar esta funcion se ejecuta primero lo que estadentro de Weapon.Shoot()
    }
   
    public override void Reload()
    {
         Base.Reload();
         //Al Llamar esta funcion se ejecuta primero lo que estadentro de Weapon.Reload()
    }
}

Como vez necesitas crear un Objeto(clase) base, lo mismo pasa con un GameCenter, en el existen referencias estáticas al Jugador entonces el GameCenter ya sabe quien es el Objeto Jugador presente en la escena, de este modo al tocar un Gatillo(Trigger) podrías avisarle al GameCenter que es lo que hace este Trigger, entonces por ejemplo para la munición solo tendrías que decir. GameCenter.Player.SetMunition(Weapon weapon);
 
Un ejemplo simple de como se deben programar los vídeo juegos!
Título: non-static member???
Publicado por: Arthure en Julio 08, 2015, 11:08:47 PM
@francoe1 (http://unityspain.com/profile/18127-francoe1/) seguramente lo haras con buena intencion, pero el problema que exponia no tiene nada que ver con la herencia. ademas, es de locos ver que no tiene idea de programacion y explicarle algo mas avanzado (aunque basico de poo) como es ese tema, asi mas que ayudar lo que vas a hacer es liarle mas.
 
luego a parte de eso, al llamar a la funcion public override void Shoot () {} no se ejecuta el codigo que hay en la clase padre porque estas sobreescribiendola, en todo caso deberias de utilizar ((Weapon)objeto_uzi).Shoot (); desde cualquier parte del codigo si quieres ejecutar el codigo que se encuentra en la funcion de la clase padre, o bien incluir base.Shoot (); dentro de la funcion en la clase hija para que se ejecute siempre los dos codigos. Pero como decia, eso es otro tema que lo unico que hara sera liar mas al pobre chico que ya bastante tiene
Título: non-static member???
Publicado por: ramunda en Julio 08, 2015, 11:20:12 PM
@francoe1 (http://unityspain.com/profile/18127-francoe1/) , ante nada , gracias , por tan extensa y elaborada explicación y maestria. Pero  me he quedado....bueno que me siento una mierda pinchada en un palo...no es que no lo entienda esque me supera y de mucho...
 
 
@Arthure (http://unityspain.com/profile/26665-arthure/), sin palabras.....sin defender a nadie digo que tienes toda la razón soy un 0,0,1 en programación intento aprender todo lo que puedo y cuando me doy por vencido acudo a vosotros, los maestros de esto.Y la explicación de @francoe1 (http://unityspain.com/profile/18127-francoe1/) me viene enorme...no sabria ni por donde empezar....
 
antes yo tenia este script en Javascript...de echo lo estaban los 2, despues de 5 dias los he convertido "solito :P" en C#, me ha costado sangre y cafes pero lo consegui..sin pedir ayudita. Pero claro imaginate ahora que el proncipal...el de disparosyrecargos2 funciona con c# me veo que no me funciona el script enano de añadir munición que antes funcionaba con un simple llamamiento a la variable munición....no se porque ahora en c# se complica tanto...pero si teneis una explicación o solucion para lerdos como yo...os lo agredecia...pero no dejo de ser eso un "lerdo" lerdo=inutil.
 
Espero impaciente aver si podemos solucionarlo.
 
Mil gracias a los dos y a los futuros comentarios!!!
 
Y sobretodo gracias por darme ánimos y dejarme seguir aprendiendo!!!
Título: non-static member???
Publicado por: francoe1 en Julio 08, 2015, 11:23:57 PM
Si, como no lo estoy haciendo con ningún editor ni nada directamente escribiendo en la Web, me eh olvidado del base y es muy básico, un ejemplo escrito en un lenguaje como C# de como en realidad debe ser programada estas cosas, lo hago con la intención de que busquen información y se empapen de ella para aprender y avanzar. 
 
Es cierto, no es algo tan simple de asimilar pero es algo Fundamental en POO, y bien me parece que esto le podría dar un poco de Luz. 
 
De todos modos ¡Gracias por la Corrección, no me había dado cuenta!.
 
¡Suerte!
Título: non-static member???
Publicado por: ramunda en Julio 08, 2015, 11:30:56 PM
Acabo de ver un fallo garrafal que he echo y lo he vsito..y no me lo creo que lo vea yo  , dadme la razon si es cierto...

using UnityEngine;
using System.Collections;
public class recargamunicion2 : MonoBehaviour {
// Use this for initialization
   void OnTriggerEnter (Collider other) {
      if(other.gameObject.tag == "jugador"){
         // Accedo al script de disparosyrecargos2 y actualizo la MunicionActual.
          disparosyrecargos2.municiontotal=100;
          // Destruyo el cargador de municion
         Destroy(other.gameObject);
   }
}
}

si le estoy diciendo:
 
Destroy(other.gameObject); por mis muertos que me estoy cargado al jugador!!!! :PPPP, porque other es el jugador...bueno esto no soluciona mi problema con recargar las balas pero es asi? me lo estoy cargando no?
 
lo cual seria simplemente:
 
Destroy(gameObject);
Título: non-static member???
Publicado por: francoe1 en Julio 08, 2015, 11:33:44 PM
Bien si solo quieres hacer que al entrar al Trigger se añada munición entonces has lo siguiente.
 
El script de tu armar

public class Weapon : MonoBehaviour
{
   public void Recargar(int Value)
   {
       //Funcion donde recargo mi arma
   }
}

Luego desde el Trigger seria de esta manera.

void OnTriggerEnter (Collider Col)
{
if(Col.gameObject.tag == "Player")
{
    Col.gameObject.SendMessage ("Recargar", 10, SendMessageOptions.DontRequireReceiver);
}
}

Acuérdate de Asignar el Tag Player al objeto que contenga el Script Arma.
 
Suerte, si no entiendes te lo explico con ejemplos mucho mas visual!.. Abrazo y perdón por el lío. 
Título: non-static member???
Publicado por: ramunda en Julio 08, 2015, 11:35:09 PM
Cita de: francoe1 date=1436390637Si, como no lo estoy haciendo con ningún editor ni nada directamente escribiendo en la Web, me eh olvidado del base y es muy básico, un ejemplo escrito en un lenguaje como C# de como en realidad debe ser programada estas cosas, lo hago con la intención de que busquen información y se empapen de ella para aprender y avanzar. 
 
Es cierto, no es algo tan simple de asimilar pero es algo Fundamental en POO, y bien me parece que esto le podría dar un poco de Luz. 
 
De todos modos ¡Gracias por la Corrección, no me había dado cuenta!.
 
¡Suerte!
Gracias de nuevo @francoe1 (http://unityspain.com/profile/18127-francoe1/) , pero tienes alguna solución para lerdos?
Título: non-static member???
Publicado por: francoe1 en Julio 08, 2015, 11:41:01 PM
Si, estas destruyendo el objeto que entra dentro del Collider, Tu error inicial es un error de referencia. disparosyrecargos2 es el nombre de tu componente, no puedes directamente acceder los métodos o variables que se encuentren dentro de este excepto que sean estáticos. 
 
En tu script de Munición añade una referencia.
 
public disparosyrecargos2 MyScriptShoot;
 
luego lo asignas desde el Inspector con el Objeto que contenga el script disparosyrecargos2. y seguido a esto haces la modificación en tu código.

using UnityEngine;
using System.Collections;
 
public class recargamunicion2 : MonoBehaviour
{
    public disparosyrecargos2 MyScriptShoot;
void OnTriggerEnter (Collider other)
{
   if(other.gameObject.tag == "jugador")
   {
           // Accedo al script de MyScriptShoot (Referencia de disparosyrecargos2)y actualizo la MunicionActual.
          MyScriptShoot.municiontotal=100;
          // Destruyo el cargador de municion
          Destroy(this.gameObject);
    }
}
}
Título: non-static member???
Publicado por: ramunda en Julio 08, 2015, 11:42:16 PM
SEÑORES!!!!  lo consegui!!!!!!!!!!!!!!!!!!!!!!!!!!
 
ya funciona!!!!!
 
@Arthure, mira mira era una ...tonteriaaaaaaaaaaaaaa, pero que escondida estaba!!!!!!
 
esta linea, esta maldita linea era la causante...se me ocurrio que los scripts se comunican con variables estaticas...i como no dejaba de quejarse de las estatics....pues probe esto:

public static float municiontotal = 150;

yyyyyyyyyyyyy walaaaaaaaaaa no mas error!!! ya se añaden las balas a la muni total!!! que feliz que soy!!!!!!!!!!!
 
 
mil gracias a todos de verdad sois los mejores sin vosotros perdería esta motivación de intentar superar estas cosas!!!
 
 
y de paso ayudo a los que vengan detrás que seguro que les ayudara de una manera u otra!!!
 
Hasta muy prontooo que seguro que meto un post en breve hahahha.
 
Un abrazo!!!!!!!!!!
 
 
Título: non-static member???
Publicado por: francoe1 en Julio 08, 2015, 11:45:18 PM
Es una Solución, pero no es la mas viable por que si tienes 3 armas con el mismo código se modifican las 3, dependiendo de que se trata puedes utilizar variables estáticas, en este caso no te lo recomiendo.
Título: non-static member???
Publicado por: ramunda en Julio 08, 2015, 11:50:40 PM
Cita de: francoe1 date=1436391918Es una Solución, pero no es la mas viable por que si tienes 3 armas con el mismo código se modifican las 3, dependiendo de que se trata puedes utilizar variables estáticas, en este caso no te lo recomiendo.
 
Y te doy toda la razon!!! @francoe1, veeees estoy aprendiendo mas en 20 minutos que en una semana!!!
 
y respecto a las demas respuestas que me has puesto!! gracias!!!! por supuesto que las entiendo mucho mejor que antes , mañana me pongo a aplicarlas una por una!!!
 
hoy ya estoy exausto !! lol
 
Gracias de nuevo por todo! una brazo y muy buenas noches!!!,
 
P.D mañana dare mas guerra
Título: non-static member???
Publicado por: ramunda en Julio 09, 2015, 03:13:51 PM
@francoe1 (http://unityspain.com/profile/18127-francoe1/), te escribo para decirte que ya he aplicado las modificaciones que me enseñaste y funciona perfectamente .
 
Muchas gracias.
 
Un abrazo!!
Título: non-static member???
Publicado por: francoe1 en Julio 09, 2015, 07:00:04 PM
Genial, acuérdate que existen muchísimo videos de programacion orientada a objetos en YT.