jairogarcíarincón
29/07/2018
Contenidos
- Desde dentro de la carpeta Models de la Project Window, arrastra el modelo Tank a la Hierarchy Window.
- En la Inspector Window del Tank, escoge la Layer Players y, cuando te pregunte si quieres que se lo aplique a todos sus elementos hijos, pulsa en No, this object only.
- Añade un Rigidbody Component al Tank.
- Expande Constraints y selecciona Freeze position para el eje Y y Freeze rotation para los ejes X y Z.
- Añade un Box Collider Component al Tank.
- Cambia el Center a XYZ 0, 0.85, 0 y el Size a XYZ 1.5, 1.7, 1.6.
- Añade un Audio Source Component al Tank.
- En AudioClip, haz clic en el circulo selector y selecciona EngineIdle de la lista.
- Activa la opción Loop.
- Añade otro Audio Source Component al Tank.
- Desactiva la opción Play on Awake (reproducir al arrancar).
- Selecciona la carpeta Prefabs de Project Window y arrastra el Tank de la Hierarchy Window a dicha carpeta (para guardar los cambios en el Prefab).
- Guarda la escena
Las acciones a realizar son:
- Capturar la entrada
- Configurar el audio
- Configurar el movimiento adelante y atrás
- Configurar el giro
Para ello:
- Desde dentro de la carpeta Prefabs de la Project window, arrastra el prefab DustTrail al Tank de la Hierarchy window.
- Duplica ese DustTrail.
- Renombra uno como LeftDustTrail y cambia la Position a XYZ -0.5, 0, -0.75.
- Renombra el otro como RightDustTrail y cambia la Position a XYZ 0.5, 0, -0.75.
- Desde dentro de la carpeta Scripts/Tank de la Project Window, arrastra el archivo TankMovement al Tank de la Hierarchy window
- Abre el archivo TankMovement, y modifica el código para que sea similar al expuesto más abajo (e intenta comprenderlo fijándote en los comentarios)
- En la Inspector window de Tank, arrastra el primer Audio Source a la casilla del Tank Movement Script correspondiente a Movement Audio.
- Para la variable Engine Idling del Tank Movement Script, haz clic en el circulo selector y escoge EngineIdle.
- Para la variable Engine Driving del Tank Movement Script, haz clic en el circulo selector y escoge EngineDriving.
- El resultado debe ser similar al de la figura siguiente.
- En la parte superior de la Inspector window, haz clic en Apply para aplicar los cambios al Prefab.
- Guarda la escena y prueba a mover el tanque pulsando Play y usando los controles WASD.
using UnityEngine;
public class TankMovement : MonoBehaviour
{
public int m_PlayerNumber = 1; // Utilizado para identificar qué tanque es de cada jugador. Configurado por el tank's manager.
public float m_Speed = 12f; // Rapidez con la que el tanque se mueve alante y atrás.
public float m_TurnSpeed = 180f; // Rapidez de giro del tanque en grados por segundo.
public AudioSource m_MovementAudio; // Referencia al audio del motor del tanque (diferente del de disparo).
public AudioClip m_EngineIdling; // Audio a reproducir cuando el tanque no se mueve.
public AudioClip m_EngineDriving; // Audio a reproducir cuando el tanque se está moviendo.
public float m_PitchRange = 0.2f; // Cantidad de variación de afinación del audio del motor (para que sea más real).
private string m_MovementAxisName; // Nombre del eje para moerse alante y atrás.
private string m_TurnAxisName; // Nombre del eje para girar.
private Rigidbody m_Rigidbody; // Referencia del componente para mover el tanque.
private float m_MovementInputValue; // Valor actual de entrada para el movimiento.
private float m_TurnInputValue; // Valor actual de entrada para el giro.
private float m_OriginalPitch; // Valor del pitch de la fuente de audio al inicio.
private void Awake ()
{
m_Rigidbody = GetComponent ();
}
private void OnEnable ()
{
// Al arrancar/habilitar el tanque, deshabilitamos la kinemática del tanque para que se pueda mover.
m_Rigidbody.isKinematic = false;
// Reseteamos los valores de entrada.
m_MovementInputValue = 0f;
m_TurnInputValue = 0f;
}
private void OnDisable ()
{
// Al parar/deshabilitar el tanque, habilitamos la kinemática del tanque para que se pare.
m_Rigidbody.isKinematic = true;
}
private void Start ()
{
// NOmbres de los ejes según el número de jugador.
m_MovementAxisName = "Vertical" + m_PlayerNumber;
m_TurnAxisName = "Horizontal" + m_PlayerNumber;
// Almaceno la afinación original del audio del motor.
m_OriginalPitch = m_MovementAudio.pitch;
}
private void Update ()
{
// Almaceno los valores de entrada.
m_MovementInputValue = Input.GetAxis (m_MovementAxisName);
m_TurnInputValue = Input.GetAxis (m_TurnAxisName);
//Llamo a la función que gestiona el audio del motor
EngineAudio ();
}
private void EngineAudio ()
{
// Si no hay entrada, es que está quieto...
if (Mathf.Abs (m_MovementInputValue) < 0.1f && Mathf.Abs (m_TurnInputValue) < 0.1f)
{
// ... y si estaba reproduciendo el audio de moverse...
if (m_MovementAudio.clip == m_EngineDriving)
{
// ... cambio el audio al de estar parado y lo reproduzco.
m_MovementAudio.clip = m_EngineIdling;
m_MovementAudio.pitch = Random.Range (m_OriginalPitch - m_PitchRange, m_OriginalPitch + m_PitchRange);
m_MovementAudio.Play ();
}
}
else
{
//Si hay entrada es que se está moviendo. Si estaba reproduciendo eld e estar parado...
if (m_MovementAudio.clip == m_EngineIdling)
{
// ... cambio el audio al de moverse y lo reproduzco.
m_MovementAudio.clip = m_EngineDriving;
m_MovementAudio.pitch = Random.Range(m_OriginalPitch - m_PitchRange, m_OriginalPitch + m_PitchRange);
m_MovementAudio.Play();
}
}
}
private void FixedUpdate ()
{
// Ajusto la posición y rotación.
Move ();
Turn ();
}
private void Move ()
{
// Creo un vector en la dirección en la que apunta el tanque, con una magnitud basada en la entrada, la velocidad y el tiempo entre frames.
Vector3 movement = transform.forward * m_MovementInputValue * m_Speed * Time.deltaTime;
// Aplico ese vector de movimiento al rigidbody del tanque.
m_Rigidbody.MovePosition(m_Rigidbody.position + movement);
}
private void Turn ()
{
// Calculo el número de grados de rotación basandome en la entrada, la velocidad y el tiempo entre frames.
float turn = m_TurnInputValue * m_TurnSpeed * Time.deltaTime;
// Convierto ese número en una rotación en el eje Y.
Quaternion turnRotation = Quaternion.Euler (0f, turn, 0f);
// AAplico esa rotación al rigidbody del tanque.
m_Rigidbody.MoveRotation (m_Rigidbody.rotation * turnRotation);
}
}
Publicado el 30 de Enero de 2025
Unity2dortográfico