Noticias

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

Una ayudita con mi script?(nivel novato)

Iniciado por arkandius, Noviembre 21, 2016, 08:25:42 PM

Tema anterior - Siguiente tema
Noviembre 22, 2016, 12:21:25 AM #30 Ultima modificación: Noviembre 22, 2016, 12:29:19 AM por kingtrase
1 error es por que no encuentra el gameobject llamado "Registro" o este no tiene incluido el script, comprueba la ortografia a ver,
 
el segundo puede ser por que audiosource no tenga un sonido asignado, miralo a ver
 
 

····>Desarrollando un videojuegos online-arcade para Android.


····>Programador en:C,C#,VB.net,PHP,HTML5,SQL,JS,Ruby.


····>Trabajando en: Desarrollo de paginas web y bushistudios.


                    ๑۩۞۩๑_(▀▄)KINGTRASE()_๑۩۞۩๑ 




Noviembre 22, 2016, 02:42:48 AM #32 Ultima modificación: Noviembre 22, 2016, 02:48:05 AM por lightbug
Cita de: arkandius date=1479773409Aquí os dejo los scripts, el player y las herramientas
   
   
      https://www.dropbox.com/sh/z907uyvv82botqs/AAC4EBvQzBOn4V4XdYZvv6Zxa?dl=0
   


Que scripts pones en que cosa.
 
- Registro.cs va en un gameObject (vacio preferentemente), (create/empty gameobject ) y lo pones ahi, y lo llamas "Registro" (IMPORTANTE)
 
- En el scrpt registro (que pusiste en el objeto "Registro") tenes la opcion de buscar un audioclipy ponerlo en la var publica "sonido" (si no lo haces no tendras sonido)
 
- A las herramientas, (asegurate que tenga un collider) le pones el tag correspondiente  "PickUp" (no es necesario que compruebes col != null, ya que si se metio en trigger hay collider)
 
- Tu recolector(en el player o como desees) debe tener un componente Collider (Box, sphere , lo que quieras) con Trigger (IMPORTANTE)
 
 
 
Si todo esto se cumple tiene que andar
 
Otra cosa, quita todo lo que diga isPla*** o play que no tengas fuera de Registro.cs , acordate que registro reproduce audio NO el recolector
 
 
 
 

Noviembre 22, 2016, 07:39:43 AM #33 Ultima modificación: Noviembre 22, 2016, 07:40:05 AM por iRobb
Un poco guarri ese código eh?. Hecho de memoria, no lo he probado. Aplicando el lazy init:
 

public class Registro : MonoBehaviour
{
private int contador;
public AudioClip sonido;
    private AudioSource _audioSource;
// Use this for initialization
void Start ()
{
   contador = 0;
}
public void SumarContador()
{
   contador++;
   this.audioSource.Play ();
}
    private AudioSource audioSource {
        get {
            if (this._audioSource == null) {
          this._audioSource = this.gameObject.AddComponent<AudioSource> ();
                this._audioSource.loop = false;
                this._audioSource.playOnAwake = false;
                if (this.sonido != null) {
                    this._audioSource.AudioClip = sonido;
                }
            }
            return(this._audioSource);
        }
    }
}

 
 

Noviembre 22, 2016, 01:36:33 PM #34 Ultima modificación: Noviembre 22, 2016, 01:37:12 PM por kingtrase

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
 
public class Recoge_Herramientas : MonoBehaviour
{
public GameObject jugador;
//Sonido
public AudioSource audio;
public AudioClip recogido;
private bool ispla***;
//Puntuación
private Registro registro;
//Recoge componente y pone ispla*** "audio" false.
/*public void Awake()
{
   audio = GetComponent<AudioSource> ();
   ispla*** = false;
}*/
 
public void Start()
{         
               //Registro = GameObject.Find("Registro").GetComponent<Registro>();
               //Estabas asignando el script a un Tipo y no a la variable registro.!!!!!!!!!!!!!!!!!!!!
         registro = GameObject.Find("Registro").GetComponent<Registro>(); //Debes llamar al objeto que tiene el script Registro como "Registro"
}
   
//Que pasa cuando colisiona con el game object
void OnTriggerEnter(Collider col)
{
   //Comprueba que tiene tag "PickUp"
   if (col !=null && col.gameObject.tag == "PickUp")
   {
      /*Si NO se ha reproducido, iniciarlo y colocar ispla*** = true
      if (!ispla***)
      {
         audio.Play();
         ispla*** = true;
      }*/
               registro.SumarContador();
      Destroy (col.gameObject);
      //Suma 1 int a variable MyBoxes de Boxes.cs
      //chr.GetComponent<Boxes>().MyBoxes = chr.GetComponent<Boxes>().MyBoxes +1;    
      //Convierte Boxes_obtained en texto, coge componente de Boxes.cs y convierte a String
      //Boxes_obtained.text = chr.GetComponent<Boxes> ().MyBoxes.ToString ();         
      //Guarda información de la variable MyBoxes de Boxes.cs
      //PlayerPrefs.SetInt ("MyPoints",chr.GetComponent<Boxes>().MyBoxes);
   }
}
 
}

 
En vez de usar la variable "registro" el estaba asignado el valor a "Registro" que es una clase y no una variable, mayusculas minusculas... comprobar siempre ortografia :)
 
mira a ver si te funciona, (Es el mismo script que subiste a dropbox, pero arreglado)

····>Desarrollando un videojuegos online-arcade para Android.


····>Programador en:C,C#,VB.net,PHP,HTML5,SQL,JS,Ruby.


····>Trabajando en: Desarrollo de paginas web y bushistudios.


                    ๑۩۞۩๑_(▀▄)KINGTRASE()_๑۩۞۩๑ 



Muchas gracias por responder chicos, ahora mismo me pongo a ello.
 
Lo siento por todo el lío, pero tened en cuenta que hace apenas un mes programo en C#, y eso de las clases y tal....como que no lo tengo muy por la mano. En seguida os digo que tal me va ^^

A ver chicos, os cuento. 

Tengo las herramientas con el tag "PickUp", un box collider con "Is trigger" activado, su mesh filter y renderer y una animación que hace que rote ehorizontalmente en 360º y un audio source.
 
Después tengo el player con tag "Player", con el script registro, un game object dentro de él con el script registro también (no entendí bien donde tenía que ponerlo), su cámara y sus componentes: Registro.cs, recoge_herramientas.cs, Firstpersoncontroller.cs, un character controller, rigidbody, audiosource y por último un capsule collider con "Is trigger" activado.(Me dijisteis que tenía que tener un collider con trigger, pero el rigidbody no tiene ese check).
 
Tuve que rehacer el player por problemas, igualmente siguen sin desaparecer las herramientas ni hacer ningún sonido....No sé qué estoy haciendo mal, pero estoy por empezar de nuevo este trozo.
 
Mil gracias por vuestra paciencia y ayuda!!!

comparte el proyecto, y el rigidbody no tiene un check para trigger por que no es un colisionador, es un gestor de fisicas.
 
sube tu proyecto tal y como esta.

····>Desarrollando un videojuegos online-arcade para Android.


····>Programador en:C,C#,VB.net,PHP,HTML5,SQL,JS,Ruby.


····>Trabajando en: Desarrollo de paginas web y bushistudios.


                    ๑۩۞۩๑_(▀▄)KINGTRASE()_๑۩۞۩๑ 



Vale, dame un rato para poder eliminar del proyecto assets no utilizados que si no no te lo puedo subir ni en 1 semana xDDD Te enviaré enlace de dropbox

Noviembre 24, 2016, 06:03:44 PM #39 Ultima modificación: Noviembre 24, 2016, 06:15:43 PM por lightbug
Mira para mi te estas enliando en cosas basicas y tratando de dar vueltas y vueltas en casos especificos como el de la herramientas.
 
primero fijate esto, es la biblia de los colliders(sobre todo la tabla de abajo)
 
https://docs.unity3d.com/Manual/CollidersOverview.html
 
O aca la imagen:
 

 
Luego arranca por lo basico asi vas a aprender cualquier situacion, no solamente un caso especifico,
 
- Tenes dos objetos cada uno con un collider (no importa el meshrenderer) sin nada modificado (trigger o No), sumale un script a uno de estos con el void OnTriggerEnter blablabla (ponele este):
 

public class ontriggerenter : MonoBehaviour {
void OnTriggerEnter()
{
   print ("Colisiono ");
}
}

 
Dale play, movelos manualmente en la sceneView como moves cualquier objeto (es lo mismo que cambiar el transform por codigo) y hacelos tocarse uno con otro--> no pasa nada, porque de la tabla que te pase si te fijas estas haciendo colisionar dos static colliders uno con trigger, o los dos con triggers no importa
 

 
Ahora, si a uno le pones un RigidBody con la opcion Kinematic (es decir que no es controlado por el mundo de las fisicas sino por el Transform) deberia funcionar. Proba poneselo a el que tiene el script, poneselo al otro, proba poner a los dos el script, y hace todas las pruebas que quieras DEBE funcionar.
 

 
Una vez que dominas esto podes hacer lo que quieras, todo juego se basa en estas cosas, por eso dominarlo a lo primero es vital por lo menos en Unity
 
de lo especifico de tu post anterior:
 
- Registro lo pones en un objeto cualquiera (que no se vaya a destruir claro). Ponelo en un gameObject vacio. Lo que te importa a vos es instanciar un objeto de esa clase. Por supuesto deberia haber solo un objeto de esa clase, pero a lo primero alcanza con que este simplemente ahi.
 
Podes meter un singleton asi:
 

//dentro de la clase registro
static Registro m_instance;
public static Registro GetInstance(){
   if (!m_instance)
      m_instance = (Registro)FindObjectOfType (typeof(Registro));
   return m_instance;
}
//Si no existe una instancia la crea (si tenes un gameOnject con registro la instancia se creo), si existe (seguramente) te devuelve dicha instancia

 
y desde otro lado lo llamas asi:
 

//desde otro lado
Registro.GetInstance().(cualquierMetodoPublico)
//pro EJ
Registro.GetInstance().sumarContador();

 
- Hace poco me di cuenta que si usas un CharacterController funciona como un Rigidbody Kinematico (viendo la tabla que te puse arriba). En mi proyecto tambien agarro items, antes tenia un CapsuleCollider, luego saque este collider para probar y todo seguia funcionando de maravilla.
 
 
 
Saludos
 
 


Etiquetas: