Jump to content
UnitySpain

Aceptamos donaciones vía Paypal.

UnitySpain.com es un servicio gratuito, pero mantener la Comunidad conlleva una serie de gastos.

Fondo Anual Unityspain: Donados 15,00€ de 150,00€

  • Servidor: Dominio.com y Hosting Web
  • Mantenimiento de los Foros
  • Contenido y Servicios Extras
  • Mantenimiento para Redes Sociales

samorente

Registrados
  • Content Count

    6
  • Joined

  • Last visited

  • Days Won

    1

Posts posted by samorente


  1. Hola a todos, he creado el siguiente código

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class LevelScript : MonoBehaviour {
    
        public int experience;
        public int fuerza;
        public int Level
        {
            get {
                return experience / 750;
            }            
           
            
        }
    
        void levelUp()
        {
           if (Level = Level ++)
            {
                fuerza = fuerza++;
            }
        }
    
    }

    La variable experience está "anclada" a este otro script pero creo que para mi duda no es importante, aún así lo pongo por si acaso.

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEditor;
    
    
    [CustomEditor(typeof(LevelScript))]
    public class LevelScriptEditor : Editor
    {
        public override void OnInspectorGUI()
        {
            LevelScript myTarget = (LevelScript)target;
    
            myTarget.experience = EditorGUILayout.IntField("Experience", myTarget.experience);
            EditorGUILayout.LabelField("Level", myTarget.Level.ToString());
        }
    }


    Mi duda es: quiero que cuando la variable Level se incremente, que también lo haga la variable fuerza.

    Al poner el primer código me dice que la variable Level es de solo lectura y por lo tanto no me deja añadirla al if

    ¿Existe alguna forma de cambiar los permisos de la variable Level para que tenga permisos de escritura?

    No se si mi dedución es correcta o si hay alguna otra manera mas óptima de hacer lo mismo (que seguramente la haya)

    Muchas Gracias.

     


  2. On 5/23/2019 at 4:34 PM, lightbug said:

    Y como es que sabés que "en teoría" funciona si no te sale nada en consola (en realidad en teoría es poco probable que se cumpla). Yo tenía un amigo que cada vez que poniamos un break en código él quería hacer una variable para comprobar que en realidad X cosa pasara porque por alguna razón u otra sospecha que el lenguaje de programación lo podía estar traicionando :8_laughing:, como que era algo maleable y dependía del clima... aca pasa algo similar pero con el Debug.Log, el lenguaje es así y si no ves lo que imprime en memoria pasa una de las dos:

    1. No tenés habilitado la impresión o el log de mensajes (que ojo! puede ser, me ha pasado), lo habilitas con el boton dentro de la consola (al lado de los errores)
    2. No se  cumple la condición del if (probablemente sea esta).

    Osea que volviste al punto inicial :43_slight_frown:, Lee de vuelta esto:

    Estás usando = en vez de == (no se si es así en tu código o pasa acá)  -->  Usar == para float's no es recomendable usá Mathf.Approximately  ---> Aun así verificar igualdad no queda lindo en este caso (aclaro que no se como es que el objeto se mueve), la matemática de punto flotante tiene errores, que un objeto se mueva libremente, tenga la posición <x,y,z> y que vos termines por verificar eso en un if y sea correcto es muy poco pobrable, ah no ser que antes hayas impuesto que ese valor sea <x,y,z> en un momento dado, cosa que no se si estás haciendo.

    Osea, si querés verificar la posición asegurate que el objeto que vas a mover llegue a la posición (no más o menos, sino que lo haga --> =), para esto podés usar vector3.MoveTowards o verificar si está cerca de la posición con Vector3.Distance (la cercanía la elegís vos).

    ---> Un error que tuve anteriormente, puse que uses Mathf.Aproximately, para floats está bien, pero para vectores el mismo operador "==" hace uso de esto! (Vector3.Equals no lo hace)... ups!

    https://docs.unity3d.com/ScriptReference/Vector3-operator_eq.html

     

    No cometas el típico error de la soberbia de programación, lo digo porque es extremadamente común si arrancás a programar pensar de la siguiente manera "No importa lo que haga, esto tiene que andar y si no anda el problema no es lo que yo hice, el problema tiene que ser esto otro (Debug.Log en tu caso)". Trata de evitar esos valores super exactos de posición que nunca se van a dar, probá métodos como Vector3.distance, incluso si  desde afuera del script especificas la posición exacta para el objeto en cuestión "Vector3(-114.15f, 2.04f, -95.61f)" intenta reemplazar eso por un transform que haga de posicion objetivo (por supuesto asegurandote que al final al objeto lo movés a esa posición objetivo), el if te quedaría así:

    
    if (evento.transform.position == objetivo.transform.position )
            {
                Debug.Log("Evento");
            }

     

    Saludos!

    Hola perdón por la espera xD, ya lo solucioné para que se cumpliera la condición si o si lo que hice fué establecer la posición del objeto con anterioridad. 

    Pero gracias de todas formas ahora entiendo que si quiero que pase algo (por ejemplo: si el personaje llega a un sitio que salte una cinemática) es mejor seleccionar un rango que poner medidas exactas, lo que no se si es mejor hacerlo como me dijistes con vector3.Distance o que si el personaje entra en contacto con un collider que salte la cinemática.


  3. Muchas gracias por la respuesta.

    Esto era solamente de prueba, ya que tuve curiosidad (asi que al no ser un proyecto real no tuve cuidado con el orden). Llegué a la conclusión de que es mejor usar los colliders si quiero que al llegar a un sitio pase algo. Lo que he estado haciendo con el anterior código (el que escribi en el foro) es poner manualmente en Unity los valores x, y, z que especifico en el script.

    Pero ahora probé otra vez hacerlo con if (evento.transform.position == new Vector3(-114.15f, 2.04f, -95.61f)) especificando otra vez los valores manualmente en Unity y en teoría siempre se cumple la condición pero no imprime el mensaje por la consola, dejo otra vez el código por aquí


     

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class NewBehaviourScript : MonoBehaviour
    {
    
        private Transform evento;
    
        // Use this for initialization.
    
        void Start()
        {
            objeto();
    
        }
    
        // Update is called once per frame
        void Update()
        {
    
        }
    
        void objeto()
        {
            evento = GetComponent<Transform>();
    
    
            if (evento.transform.position == new Vector3(-114.15f, 2.04f, -95.61f))
            {
                Debug.Log("Evento");
            }
        }
    
    }
    
    
    

     


  4. Hola a todos, tengo una duda

    Me gustaría hacer una cosa: cuando un objeto llegue hasta una posicion que suceda algo.

    Lo he intentado hacer pero tengo error de sintaxis en la siguiente línea:

    if (evento.position = new Vector3(-114.15f, 2.04f, -95.61f))


       

     private Transform evento;
         void objeto()
            {
                
                evento = GetComponent<Transform>();
                
                if (evento.position = new Vector3(-114.15f, 2.04f, -95.61f))
                {
                    Debug.Log("Evento");
                }
            }

    Muchas Gracias.

×
×
  • Create New...