viernes, 25 de septiembre de 2015

Utilizar SQLite con Unity Parte 2


Saludos amigos.

Hoy os traigo un ejemplo de como crear una base de datos con SQLite, crear el código necesario en un texto y como escribirlo en un archivo binario.





#pragma strict
#pragma downcast


import System;
import System.Data;
import Mono.Data.Sqlite;

import System.IO;
import System.Reflection;

class Data_Ficha_ProgresoJugador extends System.Object {
 
 var vidaMax : int = 100;
 var vidaActual : int = 100;
 var cansancioMax : int = 100;
 var cansancioActual : int = 100;
 var hambreMax : int = 100;
 var hambreActual : int = 100;
 var manaMax : int = 100;
 var manaActual : int = 100;
 var estaminaMax : int = 100;
 var estaminaActual : int = 100;
 var sedMax : int = 100;
 var sedActual : int = 100;
 
}

////////////////////////////////////

private var conexion : IDbConnection;
private var comando : IDbCommand;
private var reader : IDataReader;

////////////////////////////////////

function Awake () {
 
 DontDestroyOnLoad (this);
 
}

////////////////////////////////////

var log : boolean = true;

var nombreJugador : String = "NombreIni";
var nombrePartida : String = "000";

function OnGUI () {
 
 if (GUI.Button(Rect(10,10,200,20),"CreaDB_Partida")){
  CreaDB_Partida (nombreJugador, nombrePartida, 0, 0, null);
 }
 
 if (GUI.Button(Rect(10,40,200,20),"codigoSQL Data Lineal")){
  Log_Crea_CodigoSQL_Lineal (false);
 }
 if (GUI.Button(Rect(10,60,200,20),"codigoSQL Data")){
  Nueva_DataDb_Partida (""+nombreJugador, 0, 0, null);
 }
 
 if (GUI.Button(Rect(10,90,200,20),"LogCreaDb_bin")){
  Log_CreaDB_bin ();
 }
 if (GUI.Button(Rect(10,110,200,20),"Log_LeeDB_bin")){
  Log_LeeDB_bin ();
 }
 
 if (GUI.Button(Rect(10,140,200,20),"Log_Crea_Txt_DB")){
  Log_Crea_Txt_DB ();
 }
 
 if (GUI.Button(Rect(10,170,200,20),"Borra_Jugador")){
  Borra_Jugador (nombreJugador);
 }
 if (GUI.Button(Rect(10,190,200,20),"BorraDB_Partida")){
  BorraDB_Partida (nombreJugador, nombrePartida);
 }
 
}

function Start () {
 
 if(log){Debug.Log("persistentDataPath --> " + Application. persistentDataPath);}
 if(log){Debug.Log("dataPath --> " + Application. dataPath);}
 
 CreaCarpetas ();
 
}

function Update () {
 
 
}

function CreaCarpetas () {
 
 if (!Directory.Exists (Application.persistentDataPath + "/SaveGame")) {
  Directory.CreateDirectory (Application.persistentDataPath + "/SaveGame");
 }
 if (!Directory.Exists (Application.persistentDataPath + "/Temp")) {
  Directory.CreateDirectory (Application.persistentDataPath + "/Temp");
 }
 if (!Directory.Exists (Application.persistentDataPath + "/Resources")) {
  Directory.CreateDirectory (Application.persistentDataPath + "/Resources");
 }
 
}

////////////////////////////////////

////////////////////////////////////

var codigoSQL : String[];
var codigoSQL_bin : String[];
var codigoSQL_Lineal : String;

function Log_Crea_CodigoSQL_Lineal (bol:boolean){
    
 // Rellena codigoSQL
    Nueva_DataDb_Partida (""+nombreJugador, 0, 0, null);
 // RESET codigoSQL_Lineal
 codigoSQL_Lineal = "";
 
 for(var i : int = 0;i< codigoSQL.Length;i++){
  if(codigoSQL[i] != ""){
   codigoSQL_Lineal += codigoSQL[i];
   if(bol){
    codigoSQL_Lineal += "\r\n";
   }
  }
 }
 
}

/////////////// bin //////////////////

// BIN --> CreaDB
function Log_CreaDB_bin (){
    
 var _ruta : String = Application.persistentDataPath+"/SaveGame/";
 
 var fs : FileStream;
 var w : BinaryWriter;
 if (File.Exists(_ruta+"LogCreaDb_bin.dat")){
  fs = new FileStream(_ruta+"LogCreaDb_bin.dat", FileMode.Truncate);
 }else{
     fs = new FileStream(_ruta+"LogCreaDb_bin.dat", FileMode.Create);
    }
 w = new BinaryWriter(fs);
 
 Log_Crea_CodigoSQL_Lineal (false);
 
 w.Write(codigoSQL_Lineal);
 
 w.Close();
 fs.Close();
 
}

// BIN --> LeeDB
var readerReadByte : int = 0;

function Log_LeeDB_bin (){
    
 var lineArray = new Array();
 var _ruta : String = Application.persistentDataPath+"/SaveGame/";
 
 if (File.Exists(_ruta+"LogCreaDb_bin.dat")){
  
  var fs : FileStream = new FileStream(_ruta+"LogCreaDb_bin.dat", FileMode.Open, FileAccess.Read);
  var reader : BinaryReader = new BinaryReader(fs);
  
  reader.BaseStream.Position = 0x00000000;
  var _bytes : byte[]= reader.ReadBytes(readerReadByte);
  
  lineArray.Add(reader.ReadString());
  
  fs.Close();
 }
 
 codigoSQL_bin = lineArray.ToBuiltin(String) as String[];
 
}

/////////////// Txt //////////////////

// Txt --> CreaDB
function Log_Crea_Txt_DB (){
    
 if (!Directory.Exists (Application.persistentDataPath + "/SaveGame/")) {
  Directory.CreateDirectory (Application.persistentDataPath + "/SaveGame/");
 }
 
 Nueva_DataDb_Partida (""+nombreJugador, 0, 0, null);
 
 var _ruta : String = Application.persistentDataPath+"/SaveGame/";
 
 var sw : StreamWriter = new StreamWriter(_ruta+"LogCreaDb.txt", true);
 
 for(var i : int = 0;i< codigoSQL.Length;i++){
  sw.WriteLine(codigoSQL[i]);
 }
 sw.Close();
 
}

/////////////// Borra DataBase (Partida) //////////////////

function BorraDB_Partida (jugador : String, partida : String){
    
    var dirData : String = Application.persistentDataPath + "/SaveGame/" + jugador;
 var ruta : String = Application.persistentDataPath + "/SaveGame/" + jugador + "/" + partida;
 
 if (Directory.Exists (dirData)) {
  var dirInfo : DirectoryInfo = new DirectoryInfo(dirData);
  for(var file : FileInfo in dirInfo.GetFiles() ){
   file.Delete();
  }
 }
 
}

/////////////// Borra Carpeta (Jugador) //////////////////

function Borra_Jugador (jugador : String){
    
    var dirData : String = Application.persistentDataPath + "/SaveGame/" + jugador;
 
 if (Directory.Exists (dirData)) {
  Directory.Delete(dirData,true);
 }
 
}

/////////////// Crea DataBase (Partida) //////////////////

function CreaDB_Partida (jugador : String, partida : String, Tipo : int, Id : int, 
       progresoData : Data_Ficha_ProgresoJugador){
    
 if (!Directory.Exists (Application.persistentDataPath + "/SaveGame/" + jugador)) {
  Directory.CreateDirectory (Application.persistentDataPath + "/SaveGame/" + jugador);
 }
 
 Nueva_DataDb_Partida (""+jugador, Tipo, Id, progresoData);
 
    RutaToURI();
 _URI = "URI=file:" + rutaURI + "SaveGame" + "\\" + "\\" + jugador + "\\" + "\\" + partida;
    if(log){Debug.Log("_URI --> " + _URI);}
    
    try {
     conexion = new SqliteConnection(_URI);
  conexion.Open();
  Log_Crea_CodigoSQL_Lineal (false);
  if(codigoSQL_Lineal != ""){
   EjecutaCodigoSQL(codigoSQL_Lineal);
  }
  
  CierraDB();
 }catch(e){
        Debug.Log(":::Error::: CreaDB_Partida ()");
        Debug.Log(e);
    }
    
}

function Nueva_DataDb_Partida (Nombre : String, Tipo : int, Id : int,progresoData : Data_Ficha_ProgresoJugador){
 var pun : int = 0;
 codigoSQL = new String[4];
 
 codigoSQL[0] = "CREATE TABLE Jugador (Nombre Text, Tipo INT, Id INT);";
 codigoSQL[1] = "INSERT INTO Jugador VALUES('"+Nombre+"', "+Tipo+", "+Id+");";
 codigoSQL[2] = "CREATE TABLE Progreso (Nombre Text, Valor INT, Id INT);";
 
 var _PD : Data_Ficha_ProgresoJugador = new Data_Ficha_ProgresoJugador();
 if(progresoData != null){
  _PD = progresoData;
 }
 pun = codigoSQL.Length-1;
 var Type_PD : Type = typeof(Data_Ficha_ProgresoJugador);
 var fields_PD : FieldInfo[] = Type_PD.GetFields(BindingFlags.Public 
                        | BindingFlags.Instance);
 codigoSQL = AjustaLengthArray(codigoSQL, fields_PD.Length);
 for(var i : int = 0; i < fields_PD.Length; i++){
  var nombre : String = fields_PD[i].Name;
  var valor : int = fields_PD[i].GetValue(_PD);
  codigoSQL[pun+i] = "INSERT INTO Progreso VALUES('"+nombre+"', "+valor+", "+i+");";
  
 }
 
}

function AjustaLengthArray(_codigoSQL : String[], lenPlus:int){
 
 var query : String[] = _codigoSQL; 
 var queryTemp : String[] = new String[query.Length+lenPlus]; 
 if (lenPlus > 0) {
  if (query.Length > 0) {
   for(var i : int = 0; i < query.Length; i++){
    queryTemp[i] = query[i];
   }
  }else{
   queryTemp = new String[lenPlus];
  }
  return queryTemp;
 }else{
  return query;
 }
 
}

////////////////////////////////////

function EjecutaCodigoSQL(codigoSQL : String){
 
 var query : String;
 query = "" + codigoSQL; 
 comando = conexion.CreateCommand();
 comando.CommandText = query; 
 reader = comando.ExecuteReader();

}

function CierraDB(){
 reader.Close();
 reader = null; 
 comando.Dispose(); 
 comando = null; 
 conexion.Close(); 
 conexion = null; 
}

////////////////////////////////////

var rutaURI : String;
var _URI : String;

function RutaToURI(){
    //Uniform Resource Identifier or URI
    rutaURI = "";
    var dataURI : String [];
    var ruta : String = Application. persistentDataPath;
    dataURI = ruta.Split(char.Parse("/"));
    for(var i : int = 0;i< dataURI.Length;i++){
  rutaURI += dataURI[i] + "\\" + "\\";
 }
 if(log){Debug.Log("rutaURI --> " + rutaURI);}
 
}


////////////////////////////////////

/*

https://www.sqlite.org/inmemorydb.html


https://msdn.microsoft.com/es-es/library/system.io.filesysteminfo(v=vs.110).aspx

https://msdn.microsoft.com/es-es/library/system.io.directoryinfo(v=vs.110).aspx

https://msdn.microsoft.com/es-es/library/system.reflection.fieldinfo(v=vs.80).aspx

https://msdn.microsoft.com/es-es/library/system.io.binaryreader(v=vs.110).aspx

https://msdn.microsoft.com/es-es/library/system.io.filestream(v=vs.110).aspx

https://msdn.microsoft.com/es-es/library/ms404377(v=vs.110).aspx

*/

////////////////////////////////////

sábado, 23 de noviembre de 2013

Efectos de escala en la GUI de Unity3D.

Saludos amigos.

En esta ocasión os traigo un ejemplo de como crear efectos de escalado en los botones de la GUI.


sábado, 5 de octubre de 2013

viernes, 19 de julio de 2013

Prismáticos o mira telescópica en Unity 3d.


Saludos amigos, en esta ocasión os traigo un ejemplo de como crear unos prismáticos o mira telescópica para un arma.



sábado, 1 de junio de 2013

Como crear un menú de armas deslizable con planos en Unity GameEngine - Parte 4


Saludos amigos.

Continuamos con la cuarta parte del vídeo de como crear un menú deslizable con unos planos, en este caso, para un menú de armas pero aplicable a cualquier tipo de menú.

En este cuarto vídeo, veremos como deslizar las texturas con los botones del ratón y como añadir una transparencia a las texturas no seleccionables.

Como crear un menú de armas deslizable con planos en Unity GameEngine - Parte 3





Saludos amigos.

Continuamos con la tercera parte del vídeo de como crear un menú deslizable con unos planos, en este caso, para un menú de armas pero aplicable a cualquier tipo de menú.

En este tercer vídeo, veremos como esta creada la GUI y añadiremos un marco para resaltar el arma seleccionable.
Veremos como incluir un script en cada uno de los planos y como pasar parámetros a ese script.

jueves, 23 de mayo de 2013

Como crear un menú de armas deslizable con planos en Unity GameEngine - Parte 2




Saludos amigos.

Continuamos con la segunda parte del videotutorial de como crear un menú deslizable con unos plano, en este caso, para un menú de armas pero aplicable a cualquier tipo de menú.

En este segundo vídeo, veremos como funcionan internamente los scripts.