Este documento describe varias herramientas y funciones en Unity, incluyendo el Stumpy Shader Editor para crear shaders avanzados sin código, la herramienta Physics Cloth para simular telas, herramientas avanzadas de terreno como Road & Path Tool y River Tool, y cómo mapear controles de Xbox para juegos, así como cómo guardar y cargar valores de escena usando PlayerPrefs para guardar el progreso del jugador.
2. 2
www.3dboxweb.com
INDICE DINAMICO – IMPLEMENTACÓN.
MENU:
1. STRUMPY SHADER EDITOR.
2. PHYSICS CLOTH.
3.1 ROAD & PATH TOOL.
3.2 RIVER TOOL.
3.3 TERRAIN TOOL KIT.
4. GAMEPAD CONTROLLER.
5. SAVE SCENE.
6. RAGDOLLS.
Nota: Si quieres regresar al Índice haz click sobre el Cubo en la parte superior derecha de cada página.
4. 4
www.3dboxweb.com
Stumpy Shader Editor:
Este editor permite generar shader complejos estilo UDK, sin tener que programar una línea de código se pueden generar shaders
avanzados para next-gen, animados o efectos especiales.
MASTER: Contenedor de todos los canales para la generación de shaders.
Albedo: Canal para asignar Color / Diffuse.
Normal: Canal pa ra crear el relieve de detalle del Normal Map.
Emission: Canal para hacer iluminar el shader.
Specular: Canal para controlar el tamaño de la absorción de luz.
Gloss: Canal para controlar el poder del specular.
Alpha: Canal para controlar la transparencia del shader.
Clip: Canal para asignar transparencia cutout.
Node: Comentarios que se pueden dejar en los nodos y atributos/valores,
Inputs: Permite agregar, mover (arriba/abajo) inputs, que se podrán controlar desde el inspector modificar sus valores.
Settings: Permite cambiar las características generales del material: Pixel shader, backface culling, fog, lightmaps, sombras, etc.
Nodes: Estos son los nodos que podemos usar como método grafico para programar los shaaders, estos se dividen en varias categorías:
Constant: Permite agregar nodos Convertir valores float Constan, float3 a constant, one, zero, etc.
Operation: Permite agregar funciones matemáticas para valores como add, multiplay, divide, min, max substrac, invertir, etc.
Functions: Permite agregar funciones entre nodos para agregar Mask, Normalize, Parallax, fresnel, Lerp, unpackNormal, etc.
Properties: Permite agregar nodos color, float, range, texturas2d, TexturasCubo, float
Inputs: Permite agregar nodos Screen Depth, Position, SinTime, Time
5. 5
www.3dboxweb.com
Color: Nodo para cargar un Color desde el Inspector.
Text2D: Nodo con atributos de RGBA + UVS para conectar a un Sampler2D.
Sampler2d: Nodo para conectar una textura (sampler) y control de sus UVs.
SamplerCube: Nodo para cargar una textura desde el Inspector.
TextCube: Nodo para conectar una textura (Sampler) de cubo y control de Normal (vista).
Range: Nodo para crear un Slider en el inspector con un mínimo y máximo de valor.
Float: Nodo para crear un Campo de Texto en el inspector para poner valores.
Multiply: Nodo que permite multiplicar dos valores (nodos).
Add: Nodo que permite sumar (valores) o sobreponer (tex2d).
Lerp: Nodo que permite mezclar 2 Nodos A / B un Alpha.
Invert: Nodo para invertir el valor o textura.
UnpackNormal: Nodo que permite a un Tex2D se convierta en normalmap y tenga calidad como NormalMap (después de add/multiply)
Tex2dNormal: Nodo que permite automáticamente a un Sampler2D convertirse en NormalMap y mantener su calidad.
Substract: Nodo que permite hacer una resta entre dos valores o entre imágenes (Alpha en Clip).
Fresnel: Nodo que permite crear efecto de Fresnel con componente de View, para efecto 0 a 1 (Color 1 a Color 2).
ViewDirection: Nodo que se usa internamente para el nodo de Fresnel (View), para crear también efectos de reflejo en TexCube.
Splat: Separa canales o puede combinar todos los canales RGB.
9. 9
www.3dboxweb.com
MATERIALES ANIMADOS: Visualizar: Versión PRO PREVIEW / Probar: Se debe de exportar como shader y ponerlo en un material.
MOVER: UV Pan permite mover las uvs en las opciones de x,y,z.
APAGAR/PRENDER: Sine permitira osilar entre los valores del LERP (RGB) y usamos Splat par conectar el Sine en canal Alpha.
11. 11
www.3dboxweb.com
Cloth:
Permite crear dinámicas con telas, para simular banderas, telas, redes y cuerpos suaves (Softbodies), se pueden crear de dos maneras:
1. GameObject> Create Other> Cloth: creara un plano que podemos usar como Cloth.
2. GameObject> Create Empty, Component>Physics>Interactive Cloth & Cloth Render. De esta manera podemos
seleccionar cualquier mesh que es dentro del Project y usarlo como Cloth.
Permite anclar al cloth a cualquier objeto dentro de la escena para que quede colgado.
Tip: Al objeto a anclar debe de estar lo suficientemente cerca para poder anclarlo.
Bending: Permite simular mayor espesor en la tela.
Streching: Permite que la tela se arrugue mas al doblarse.
Damping: Permite que la tela brinque de acuerdo a las fuerzas aplicadas.
Thickness: Permite trasladar la posición de la que se encuentra anclada el Cloth.
Gravity: Aplicar fuerza constante de gravedad.
Self Collision: Permitir en que entre el mismo cloth pueda colisionar.
External: es una aceleración de una fuerza constante directa al Cloth.
Random: es una aceleración de una fuerza aleatoria al Cloth.
Mesh: asignar un mesh como interactive cloth (Empty Objects).
Frction: cantidad de friccion del cloth, esto evita demasiado rebote o movimiento.
Density: la densidad del objeto para hacerlo más pesado.
Pressure: hace que los Mesh-Cloth (softbodies) se inflen o desinflen al colisionar.
Collision Response: Fuerza con la que hará rebotar a los objetos que le colisionen.
A. Tear Factor: Cuan lejos tiene que estar pegado el rigidbody para romperse.
A. Response: Cuanta fuerza debe de aplicarse al los rigidbodies pegados.
Tear Factor: Permite hacer que el cloth se pueda romper
13. 13
www.3dboxweb.com
Road & Path Tool:
Permite crear caminos sobre un terreno aplanando donde este la ruta, así como poder pintar la ruta sobre la cual se trazo sobre el
terreno.
Pasos:
1. Click en: "New Path" para crear un nuevo “path Game Object”, en el panel de jerarquías, y lo seleccionamos.
2. Click en: "Add Path Node". Damos click sobre la ventana del editor para tener activa la ventana y presionamos la
tecla P y damos click sobre el terreno.
3. Continuamente se puede agregar un nuevo nodo al presionar “P” y click sobre el terreno hasta terminar el camino.
4. Click en: "Finalize Path" para terminar el camino y se deforme el terreno de acuerdo al camino creado.
5. Click en: "Smooth Path" para suvizar el terreno donde se encuentra el camino, esto es hata terminar el camino.
6. Click en: "Smooth Path Slope" para suavizar el terreno sobre los daldos, esto es hasta terminar.
7. Al terminar borramos el “Script”, y solo se deja el mesh creado.
14. 14
www.3dboxweb.com
River Tool:
Permite crear caminos para generar ríos sobre un terreno, haciendo huecos hacia abajo del terreno, para después aplicar mesh de agua.
Pasos:
1. Click en: "New River" para crear un nuevo “river Game Object “- 'River' – y lo seleccionas.
2. Click en: "Add River Node". Y vamos a la ventana del “Editor” y presionamos la tecla “R” y damos click sobre el
terreno para iniciar el agregar nodos.
3. Continuamente se pueden agregar mas nodos con solo estar presionando la misma tecla y dar click cobre el terreno.
4. Click en: "Finalize River" para finalizar el rio y se deforme el terreno.
5. Click en: "Smooth River" para suavizar el terreno a los lados de la creación del rio.
6. Si la orilla del rio esta sobre saliente damos click en "Close River" para corregirlo, esto es solo hasta finalizar el rio.
7. Al finalizar eliminamos el script del rio.
15. 15
www.3dboxweb.com
Terrain Tool kit:
Permite crear más variaciones sobre terrenos de manera más profesional y sencillo en pocos minutos de trabajo.
CREATE:
FRACTAL:
PERLIN: TEXTURE: EROSION :
18. 18
www.3dboxweb.com
GamePad Controller:
Se puede usar GamePad de Xbox para poder controlar las acciones de nuestro juego re mapeando los botones del control y sustituirlos
por el uso del teclado y mouse, generando juegos con orientación a consolas o PC NextGen. Edit>Project Settings>Inputs.
BOTONES: (La sensibilidad deberá estar a 1000).
A = joystick 1 button 0
B = joystick 1 button 1
X = joystick 1 button 2
Y = joystick 1 button 3
[LB] = joystick 1 button 4
[RB] = joystick 1 button 5
Back = joystick 1 button 6
Start = joystick 1 button 7
Stick Izq Botón = joystick 1 button 8
Stick Der Botón = joystick 1 button 9
Nota: Estos son los valores de “Type y Aixs” para esta categoría.
AXIS (Sensibilidad deberá de estar en 1 y digital 1000).
Stick Izq X Axis (Horizontal) = X Axis
Stick Izq Y Axis (Vertical) = Y Axis
Stick Der 4th
Axis (Vertical) = 4th axis (Joystick)
Stick Der 5th
Axis (Horizontal) = 5th axis (Joystick)
Triggers = 3rd Axis (joystick & Scrollwheel).
D-Pad (Horizontal) = 6th Axis (Joystick)
D-Pad (Vertical) = 7th Axis (Joystick)
Nota: Los triggers (3rd Axis), aunque son análogos, Unity los detecta en
forma Digital (-1 a 0 a 1).
20. 20
www.3dboxweb.com
Save Game (PlayerPrefs):
Para poder crear la opción de guardar una escena de un juego sobre la partida en la que estamos jugando, necesitamos usar una función
llamada PlayerPrefs, la cual nos permite guardar solamente variables del juego, en donde estas serán variables con información
de lo que queremos guardar como: posición del personaje, vida, sangre, ítems, checkpoint u opciones activadas del juego.
1. General: Se quiere que el personaje cuando pase por el ultimo Checkpoint activado y se use la opción de Salvar escena, este lo
haga a partir del último Checkpoint activado, así al reiniciar el juego el personaje inicie en la posición del Checkpoint Salvado.
2. Cargamos el paquete “Save_Scene_Start”, en data en Prefabs esta “Character_Prefab”, este lo insertamos en la escena.
3. En Data>Checkpoint_Prefab crearemos y asignaremos un script llamado “AI_CheckPoint”, así todos los prefab de este
tendrán el script dentro de la escena y no se tendrá que asignar de uno por uno el Script.
AI_CheckPoint
//Variable para saber que Checkpoint ha sido activado
var vCheckPoint : String;
//Variable para cargar el objeto a donde mandaremos la info del CP activado.
var Script_Salvar : AI_Save_Load;
function OnTriggerEnter () {
// Mandar al gameObject Esfera el CP activado a su variable para guardar
Script_Salvar.Salvar_CP = vCheckPoint;
print ("Checkpoint >"+vCheckPoint+"< Activado");
}
4. Ahora lo que haremos es que cada CheckPoint en su script (escena) le
asignaremos una letra de identificación: vCheckPoint “A a D”.
21. 21
www.3dboxweb.com
5. Creamos “2 Inptus” “Salvar” (Click Izq) y “Cargar” (Click Der).
6. Creamos un script llamado “AI_Save_Load” y lo asignamos a la esfera de arriba que servirá para mandarle información de
cuando se active cada Checkpoint.
AI_Save_Load
//Variable que indica que Checkpoint se guardara
var Salvar_CP : String = "A";
//Variable para insertar al personaje para después moverlo a otro CP.
var Character : GameObject;
function Update () {
//SAVE - Click Izquierdo, creamos Info para ahí almacenar la info
if (Input.GetButtonDown ("Salvar")) {
PlayerPrefs.SetString("info", Salvar_CP);
print ("CheckPoint: "+Salvar_CP+" Salvado");
}
//LOAD - Click Derecho, ReCargamos la escena
if (Input.GetButtonDown ("Cargar")) {
Application.LoadLevel ("Escena");
}
}
7. La Variable de Salvar_CP, le asignamos “A”, ya cuando inicie la
escena por primera vez será a partir de este CheckPoint.
8. En la variable “Character” cargamos al personaje de la escena,
para después mover esta variable a cada CP activado.
9. Ahora que esta creado el Script “AI_Save_Load”, haremos que
cada CheckPoint (A, B, C, D) en su variable de “Script_Salvar”
carguen al script de la Esfera: “AI_Save_Load”.
//Extra: Permite NO destruir el objeto al iniciar la escena (funcion de Awake)
DontDestroyOnLoad (); / DontDestroyOnLoad (transform.gameObject);
22. 22
www.3dboxweb.com
10. Al iniciar la escena ejecutamos una función que ira por la variable almacenada en Windows, y dependiendo el CP se moverá al personaje al CP.
function Start (){
CharacterMove (); Ó CharacterInstance ();
}
OPCION A: CHARACTERMOVE MOVER AL PERSONAJE QUE YA ESTA CREADO EN LA ESCENA
function CharacterMove (){
var Save_Load : String = PlayerPrefs.GetString("info");
print ("Check Point Cargado: " + Save_Load);
if (Save_Load == "A"){
Character.transform.position = Vector3 (0,0,0);
}
else if (Save_Load == "B"){
Character.transform.position = Vector3 (0,0,11);
}
else if (Save_Load == "C"){
Character.transform.position = Vector3 (0,0,24);
}
else if (Save_Load == "D"){
Character.transform.position = Vector3 (0,0,38);
}
}
OPCION B: CHARACTERINSTANCE CREAR PERSONAJE DINAMICAMENTE Y MOVERLO
function CharacterInstance (){
var Save_Load : String = PlayerPrefs.GetString("info");
print ("Check Point Cargado: " + Save_Load);
if (Save_Load == "A"){
Instantiate (Character, Vector3 (0,0,0), transform.rotation);
}
else if (Save_Load == "B"){
Instantiate (Character, Vector3 (0,0,11), transform.rotation);
}
else if (Save_Load == "C"){
Instantiate (Character, Vector3 (0,0,24), transform.rotation);
}
else if (Save_Load == "D"){
Instantiate (Character, Vector3 (0,0,38), transform.rotation);
}
}
25. 25
www.3dboxweb.com
Ragdoll – Animation to Ragdoll:
Para hacer que un personaje cuando muera se sustituya por un ragdoll, y este tenga la misma posición de rotación de cada uno de los
joints se hace lo siguiente:
1. Cargamos el paquete Ragdoll, dentro del paquete tenemos un mesh, un ragdoll y una animación de “Run”.
2. Creamos un script “AI_Ragdoll” y lo asignamos al personaje:
AI_Ragdoll
//Variable para cargar el RagDoll
var vRagdoll : Transform;
function Start (){
//Reproducción de animación
animation.Play ("run");
// Esperar
yield WaitForSeconds (1.5);
//Destruir Mesh animado
Destroy(gameObject);
// Instancia para cambiar por ragdoll
var InstanceRagdoll : Transform = Instantiate(vRagdoll, transform.position, transform.rotation);
// Ejecutar la función y mandarle la posición del ragdoll de cada Joint.
ActivarRagdoll (transform, InstanceRagdoll);
}
// Funcion que contiene la posición del personaje animado y la de ragdoll creado.
function ActivarRagdoll (Character : Transform, RagdolLoad : Transform) {
RagdolLoad.position = Character.position;
RagdolLoad.rotation = Character.rotation;
// Igualar los valores de "transform" que tienen el mismo nombre.
for (var child : Transform in RagdolLoad) {
var JointTransforms = Character.Find(child.name);
ActivarRagdoll (JointTransforms, child);
}
}