Jump to content
UnitySpain
samorente

C# Estadísticas del personaje

Recommended Posts

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.

 

Share this post


Link to post
Share on other sites

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...

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

 

On 6/1/2019 at 3:04 PM, samorente said:

me 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

Share this post


Link to post
Share on other sites

@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'.

Share this post


Link to post
Share on other sites

×