martes, 6 de agosto de 2013

Guardar y Cargar datos en Unity 3D

Hola Amigos, he estado un poco ausente, pero he estado muy atento a sus comentarios, es por esto que les traigo un nuevo vídeo, esta vez en respuesta a timacuas.

En este vídeo se muestra como guardar datos en unity utilizando la clase PlayerPrefbs que es el método mas sencillo.



Para guardar existen tres funciones:
- SetInt( string llave, int dato)
- SetFloat( string llave, float dato)
- SetString( string llave, string dato)


Igualmente para cargar las mismas funciones:

- GetInt( string llave)
- GetFloat( string llave)
- GetString( string llave)

*Antes de guardar es mejor revisar si la llave existe, para esto se utiliza la función HasKey( string llave)

Aqui algunos ejemplos:

Script  en C# para guardar el nombre del jugador:

string nombre = "";

void OnGUI(){
    nombre = GUI.TextField(new Rect(0,0,200,40), nombre);
    if(GUI.Button(new Rect(200,0,100,30), "Guardar")){
        PlayerPrefbs.SetString("nombre", nombre);
    }
}

Script  en JS para guardar el nombre del jugador:

var nombre = "";

function OnGUI(){
    nombre = GUI.TextField(new Rect(0,0,200,40), nombre);
    if(GUI.Button(Rect(200,0,100,30), "Guardar")){
        PlayerPrefbs.SetString("nombre", nombre);
    }
}

Scripts del video:

Lenguaje C#
Script de movimiento del personaje
var nombre = "";

using UnityEngine;
using System.Collections;

public class Movimiento : MonoBehaviour {
 
 int vidas = 3;
 int salud = 100;
 
    public float speed = 6.0F;
    public float jumpSpeed = 8.0F;
    public float gravity = 20.0F;
    private Vector3 moveDirection = Vector3.zero;
 
 void Update() {
        CharacterController controller = GetComponent();
        if (controller.isGrounded) {
            moveDirection = new Vector3(Input.GetAxis("Horizontal"), 
            0, Input.GetAxis("Vertical"));
            moveDirection = transform.TransformDirection(moveDirection);
            moveDirection *= speed;
            if (Input.GetButton("Jump"))
                moveDirection.y = jumpSpeed;
            
        }
        moveDirection.y -= gravity * Time.deltaTime;
        controller.Move(moveDirection * Time.deltaTime);
    }
 
 void OnTriggerEnter(Collider otro){
  
  if(otro.tag == "checkpoint"){
   PlayerPrefs.SetFloat("posX", otro.transform.position.x);
   PlayerPrefs.SetFloat("posY", otro.transform.position.y);
   PlayerPrefs.SetFloat("posZ", otro.transform.position.z);
   PlayerPrefs.SetInt("salud", salud);
   PlayerPrefs.SetInt("vidas", vidas);
   
   Debug.Log("Guardo!!");
  }
 }
 
}

Script de guardado con interfaz grafica

string nombre = "";

using UnityEngine;
using System.Collections;

public class GuardarDatos : MonoBehaviour {
 
 string nombre = "";
 
 // Use this for initialization
 void Start () {
  if(PlayerPrefs.HasKey("dato1")){
   Debug.Log("El nombre del jugador es: "+PlayerPrefs.GetString("dato1"));
   nombre = PlayerPrefs.GetString("dato1");
  }
 }
 
 // Update is called once per frame
 void Update () {
  if(Input.GetKeyDown("q")){
   PlayerPrefs.SetString("dato1",nombre);
   Debug.Log("Guardo!!");
  }
  if(Input.GetKeyDown("w")){
   if(PlayerPrefs.HasKey("dato1")){
    string info = PlayerPrefs.GetString("dato1");
    Debug.Log("Guardado: "+info);
   }
  }
 }
 
 void OnGUI(){
  nombre = GUI.TextField(new Rect(0,0,200,30), nombre);
 }
}

Lenguaje JS
Script de movimiento del personaje

vidas = 3;
salud = 100;
 
public speed = 6.0F;
public jumpSpeed = 8.0F;
public gravity = 20.0F;
private moveDirection : Vector3 = Vector3.zero;
 
function Update() {
       controller : CharacterController = GetComponent();
       if (controller.isGrounded) {
           moveDirection = Vector3(Input.GetAxis("Horizontal"), 
           0, Input.GetAxis("Vertical"));
           moveDirection = transform.TransformDirection(moveDirection);
           moveDirection *= speed;
           if (Input.GetButton("Jump"))
               moveDirection.y = jumpSpeed;           
       }
       moveDirection.y -= gravity * Time.deltaTime;
       controller.Move(moveDirection * Time.deltaTime);
   }
 
function OnTriggerEnter(otro : Collider){
  
 if(otro.tag == "checkpoint"){
  PlayerPrefs.SetFloat("posX", otro.transform.position.x);
  PlayerPrefs.SetFloat("posY", otro.transform.position.y);
  PlayerPrefs.SetFloat("posZ", otro.transform.position.z);
  PlayerPrefs.SetInt("salud", salud);
  PlayerPrefs.SetInt("vidas", vidas);
  
  Debug.Log("Guardo!!");
 }
}

Script de guardado con interfaz grafica

var nombre = "";
 
// Use this for initialization
function Start () {
 if(PlayerPrefs.HasKey("dato1")){
  Debug.Log("El nombre del jugador es: "+PlayerPrefs.GetString("dato1"));
  nombre = PlayerPrefs.GetString("dato1");
 }
}
 
// Update is called once per frame
function Update () {
 if(Input.GetKeyDown("q")){
  PlayerPrefs.SetString("dato1",nombre);
  Debug.Log("Guardo!!");
 }
 if(Input.GetKeyDown("w")){
  if(PlayerPrefs.HasKey("dato1")){
   string info = PlayerPrefs.GetString("dato1");
   Debug.Log("Guardado: "+info);
  }
 }
}

function OnGUI(){
 nombre = GUI.TextField(Rect(0,0,200,30), nombre);
}

4 comentarios:

  1. Una pregunta, cuando renderice el proyecto y lo convierta en un juego, pasará lo mismo que en el video?
    (si cuando en el proyecto le de a "q" para guardar y "w" para cargar pasará lo mismo cuando ya sea un juego el proyecto y me aparecerá la carpeta de checkpoints que yo haya guardado)

    ResponderEliminar
  2. donde se encuentra el archivo de forma fisica en el directorio ?? :s o no se puede visualizar :s

    ResponderEliminar