Noticias

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

Temas recientes

C# Estadísticas del personaje

Iniciado por samorente, Mayo 31, 2019, 06:40:19 PM

Tema anterior - Siguiente tema
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 Unit***itor;
 
[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.
 
 

Propiedades GET/SET: si no declaras un SET para tu variable Level, no puedes cambiar su valor, por tanto sólo lectura...
 
Luego, el código que has usado para evaluar si subes de nivel es un poco desastre. Asumo que no sabes apenas de programación, así que te redirijo directamente al manual de C# para operadores, ok?
 
https://docs.microsoft.com/es-es/dotnet/csharp/language-reference/operators/
 
 
 
Te recomiendo muchísimo que antes de ponerte a hacer código sin más, primero te repases bien la documentación y hagas ejemplos de programación de C#, y algún que otro cursillo online, por favor...

Sí, estoy haciendo un curso online y apenas llevo un mes, lo siento si mis dudas son demasiado básicas, me gustaría saber como lo haría una persona con más experiencia para tomar ejemplo.

 
 
Cita de: samorente date=1559394241me gustaría saber como lo haría una persona con más experiencia para tomar ejemplo.
   


Entiendo lo que quieres decir, pero no es una cuestión de experiencia, es irse 5 minutos a ver ejemplos prácticos y sencillos a la web de C# , DotNet Pearls, o a la propia web de Unity3D.com sección Tutoriales y ver el código...
 
 
 
De nada te servirá ver la sintaxis del código de ejemplo, si no entiendes lo que hace cada comando u operador y para qué sirve. Por ejemplo, puedes irte a la siguiente página para estudiar y realizar evaluaciones sobre C#: 
 
https://www.aprendeaprogramar.com/quiz/csharp2015_01.php

@samorente Viendo el código así nomás te pregunto, ¿Cuál es la variable que determina el nivel? es experience (y vos lees el nivel)? o es level (y vos lees la experiencia)? Lo pregunto pero igual sé la respuesta, es más para relacionarlo con ejemplos de juegos reales. En mi opinión no te conviene relacionar tan directamente experiencia con level, más que nada para dejar abierta la posibilidad de que el jugador tenga A xp y que aún si quiere pueda seguir en el nivel B sin forzarlo a subir
 

public class LevelScript : MonoBehaviour
{
    public int experience;
    public int fuerza;
int level;
    public int Level
    {
        get
   {
      return level;
           
        }            
       
       
    }
//aca podés relacionar experience con level, por ej:
    // 0 < xp < 9  --> level 1
    // 10 < xp < 19  --> level 2
    // 20 < xp < 29  --> level 3 ... y así
public bool PuedeLevelear
    {
        get
   {         
      int newLevel = ((float)experience / 10) +1;      
      return newLevel > level;            
        }
    }
    void xpUp( int cantidadXp )
    {
   experience += cantidadXp;            
    }
//Desde afuera o desde este componente das un LevelUp si es que PuedeLevelear = true.
public void LevelUp()
{
   if( !PuedeLevelear)
      retrun;
   level++;
   fuerza++;
}
}

 
... o quizás no querés que esto pase y querés que suba de inmediato, en tal caso tenés que calcular a que nivel vas a subir ua que podés tener de golpe 1 millon de xp (hiciste algun truco o algo) y pasaste de nivel 1 al 80:
 
 
 

public class LevelScript : MonoBehaviour
{
    public int experience;
    public int fuerza;
int level;
    public int Level
    {
        get
   {
      return level;
           
        }            
       
       
    }
//aca podés relacionar experience con level, por ej:
    // 0 < xp < 9  --> level 1
    // 10 < xp < 19  --> level 2
    // 20 < xp < 29  --> level 3 ... y así
public bool PuedeLevelear
    {
        get
   {         
      int newLevel = ((float)experience / 10) +1;      
      return newLevel > level;            
        }
    }
    void xpUp( int cantidadXp )
    {
   experience += cantidadXp;
   
   int newLevel = ((float)experience / 10) +1;      
   
   if( newLevel > level )   //<--- Ahora se ejecuta acá
      GoToLevel( int level );
      
   
    }
//Ahora es Go to Level
public void GoToLevel( int level )
{
        // this para diferenciar el campo de la clase vs la variable local
        int numeroDeNiveles = level - this.level;
   
         this.level = level;
   fuerza += numeroDeNiveles; //siguiendo la lógica de +1 por nivel
}
}

 
Puede haber errores lo hice al vuelo, pero bueno, la idea creo que ta'.

Etiquetas: