Fantasy World Offline


Vive en este RPG las aventuras de Leonidas, un guerrero en busca de gloria, que deberá completar su entrenamiento bajo la surpevisión de varias aldeas para finalmente, enfrentarse a su destino contra Infinitus Maximus.
¡Ataca, esquiva, recolecta, bebe pociones y cambia de indumentaria según lo requiera la situación!


Información del proyecto

Plataforma

Motor

Lenguajes

C# y Unity Javascript

Finalizado

21/03/2012

Descarga

Fantasy World Offline

Equipo

Diseño:
Cristian Soriano Crespo
Arte 3D:
José Miguel Barros Reche
Unity Asset Store
http://tf3dm.com/
Programación:
Cristian Soriano Crespo
Assets incorporados:
Cull Layers de Julian Oliden
Credit de Lemo Dev
Efectos de sonido:
Nota: Debido a que en un futuro alguno de mis proyectos podría no estar disponible en los lugares de publicación, añado una versión descargable para que sea posible probarlo. Así mismo también añado un apartado de capturas de pantalla y gameplays por si en un futuro no pudiesen ejecutarse en los sistemas en rigor.
Ejemplo de código

//Este script se utiliza para hacer desaparecer gradualmente al personaje cuando la cámara
//se acerca al mismo.

using UnityEngine;
using System.Collections;

//Grupo de variables que marcarán todas las partes renderizables del player.
//Se toma la medida de crear un grupo variable ya que algunos personajes pueden estar creados con multiples objetos 3d separados.
[System.Serializable]
public class Renderers{
  public Renderer renderer;  
}

public class CloseCameraFade : MonoBehaviour
{
  //Cámara que renderiza al personaje.
  new public Camera camera;
  //Player al que va atachada la cámara.
  public Transform playerTarget;
  //Distancia en la que empieza a ocultarse al personaje y distancia en la que se oculta del todo al personaje.
  public float fadeDistance = 2.0f, hideDistance = 1.0f;
  //Shaders estandar y de transparencia.
  private Shader[] originalShader;
  public Shader transparentShader;
  //Variable auxiliar para recorrer el array de shaders originales.
  private int count = 0;
  //Corrección de altura por si el modelo no tiene la refencia en el centro del mismo.
  //El script de control de la cámara y este deben tener el mismo valor para un buen
  //resultado.
  public float heightCorrection = 1.0f;
  
  //Todos los objetos 3d que componen al personaje.
  public Renderers[] renderers;
  
  //Variable para ver si tenemos que ocultar el player.
  public static bool mostrar = true;

  
  //Función que vuelve a cargar todo como en un inicio.
  void Reset (){
    Setup ();
  }
  
  
  //Función que hace la carga inicial de la clase.
  void Setup (){
    //Se cargan las variables en caso de estar vacias.
    if (playerTarget == null){
      playerTarget = GetComponent ();
    }
    
    //Se inicializa el array de Shaders origianles que traia el modelo 3d.
    originalShader = new Shader[renderers.Length];
    
    foreach (Renderers iterator in renderers){
      if (iterator.renderer == null){
        iterator.renderer = GetComponent ();
      }
      //Se guarda el Shader que tuviese el primer renderer.
      originalShader[count] = Shader.Find(iterator.renderer.material.shader.name);
      count++;
    }
    
    
    if (camera == null){
      camera = Camera.main;
    }
  }
  
  
  //Creación de la clase y control de errores.
  void Start (){
    Setup ();
    
    if (playerTarget == null){
      Debug.LogError ("No camera target assigned. Please correct and restart.");
      enabled = false;
      return;
    }
    
    foreach (Renderers iterator in renderers){
      if (iterator.renderer == null){
        Debug.LogError ("No renderer assigned. Please correct and restart.");
        enabled = false;
        return;
      }
    }
    
    if (camera == null){
      Debug.LogError ("No camera assigned. Please correct and restart.");
      enabled = false;
      return;
    }
  }
  
  
  //Función de actualización en cada frame.
  void Update (){  
    //Corrección de altura.
    Vector3 correction = new Vector3(
     playerTarget.transform.position.x, 
     playerTarget.transform.position.y + heightCorrection,
     playerTarget.transform.position.z
    );
    //Distancia entre el player y la cámara.
    float distance = (correction - camera.transform.position).magnitude;
    
    //Si la distancia es menor que la distancia en la que debe ocultarse el player, lo escondemos.
    if (distance < hideDistance || !mostrar){
      foreach (Renderers iterator in renderers){
        iterator.renderer.enabled = false;
      }
    }
    //Si la distancia es menor que la distancia en la que debe empezar a ocultarse el player, cambiamos el valor de su color alpha.
    else if (distance < fadeDistance){
      //Recalculamos el alpha en función de la distancia a la que estemos del player.
      float alpha = 1.0f - (fadeDistance - distance) / (fadeDistance - hideDistance);
      //Aplicamos este nuevo alpha a todos los objetos 3D del player.
      foreach(Renderers iterator in renderers){
        iterator.renderer.enabled = true;
        if (iterator.renderer.material.color.a != alpha){
          //Si necesitamos cambiar el valor del alpha, cambiamos también el shader
          //del material para poner uno que se haga transparente correctamente.
          iterator.renderer.material.shader = transparentShader;          
          iterator.renderer.material.color = new Color (
            iterator.renderer.material.color.r, 
            iterator.renderer.material.color.g, 
            iterator.renderer.material.color.b, 
            alpha
          );
        }
      }
    }
    //Al estar la cámara más lejos que la distancia en la que empezar a desaparecer y a la distancia de desaparecer del todo.
    else{
      count = 0;
      //Activamos y devolvemos el alpha a 1 de todos los objetos 3d del player.
      foreach(Renderers iterator in renderers){
        iterator.renderer.enabled = true;
        if (iterator.renderer.material.color.a != 1.0f){
          //Si hay que volver a dejar la visibilidad completa del player
          //reestablecemos también los shaders originales del mismo.
          iterator.renderer.material.shader = originalShader[count];
          iterator.renderer.material.color = new Color (
            iterator.renderer.material.color.r, 
            iterator.renderer.material.color.g, 
            iterator.renderer.material.color.b, 
            1.0f
          );
        }
        count ++;
      }
    }
  }
}
Vídeos
Capturas de pantalla
Fantasy World Offline Póster
Fantasy World Offline Menú principal
Fantasy World Offline Control transparencia con cámara
Fantasy World Offline Hablar con NPCs
Fantasy World Offline GUI
Fantasy World Offline Enemigo
Fantasy World Offline Drop
Fantasy World Offline Combate
Fantasy World Offline Muerte ahogado
Fantasy World Offline Fuentes
Fantasy World Offline Capa de ataque
Fantasy World Offline Capa de defensa
Fantasy World Offline Uso de habilidades