Controlador de nave espacial en Unity

En este tutorial, mostraré cómo hacer un controlador de nave espacial en Unity.

¡Vamos a empezar!

Pasos

  • Crea un nuevo GameObject, llámalo "Spaceship"
  • Mueva el modelo de nave espacial dentro del objeto "Spaceship" y cambie su posición a (0, 0, 0)
  • Crea un nuevo script, llámalo "SC_SpaceshipController" y pega el siguiente código dentro:

SC_SpaceshipController.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[RequireComponent(typeof(Rigidbody))]

public class SC_SpaceshipController : MonoBehaviour
{
    public float normalSpeed = 25f;
    public float accelerationSpeed = 45f;
    public Transform cameraPosition;
    public Camera mainCamera;
    public Transform spaceshipRoot;
    public float rotationSpeed = 2.0f;
    public float cameraSmooth = 4f;
    public RectTransform crosshairTexture;

    float speed;
    Rigidbody r;
    Quaternion lookRotation;
    float rotationZ = 0;
    float mouseXSmooth = 0;
    float mouseYSmooth = 0;
    Vector3 defaultShipRotation;

    // Start is called before the first frame update
    void Start()
    {
        r = GetComponent<Rigidbody>();
        r.useGravity = false;
        lookRotation = transform.rotation;
        defaultShipRotation = spaceshipRoot.localEulerAngles;
        rotationZ = defaultShipRotation.z;

        Cursor.lockState = CursorLockMode.Locked;
        Cursor.visible = false;
    }

    void FixedUpdate()
    {
        //Press Right Mouse Button to accelerate
        if (Input.GetMouseButton(1))
        {
            speed = Mathf.Lerp(speed, accelerationSpeed, Time.deltaTime * 3);
        }
        else
        {
            speed = Mathf.Lerp(speed, normalSpeed, Time.deltaTime * 10);
        }

        //Set moveDirection to the vertical axis (up and down keys) * speed
        Vector3 moveDirection = new Vector3(0, 0, speed);
        //Transform the vector3 to local space
        moveDirection = transform.TransformDirection(moveDirection);
        //Set the velocity, so you can move
        r.velocity = new Vector3(moveDirection.x, moveDirection.y, moveDirection.z);

        //Camera follow
        mainCamera.transform.position = Vector3.Lerp(mainCamera.transform.position, cameraPosition.position, Time.deltaTime * cameraSmooth);
        mainCamera.transform.rotation = Quaternion.Lerp(mainCamera.transform.rotation, cameraPosition.rotation, Time.deltaTime * cameraSmooth);

        //Rotation
        float rotationZTmp = 0;
        if (Input.GetKey(KeyCode.A))
        {
            rotationZTmp = 1;
        }
        else if (Input.GetKey(KeyCode.D))
        {
            rotationZTmp = -1;
        }
        mouseXSmooth = Mathf.Lerp(mouseXSmooth, Input.GetAxis("Mouse X") * rotationSpeed, Time.deltaTime * cameraSmooth);
        mouseYSmooth = Mathf.Lerp(mouseYSmooth, Input.GetAxis("Mouse Y") * rotationSpeed, Time.deltaTime * cameraSmooth);
        Quaternion localRotation = Quaternion.Euler(-mouseYSmooth, mouseXSmooth, rotationZTmp * rotationSpeed);
        lookRotation = lookRotation * localRotation;
        transform.rotation = lookRotation;
        rotationZ -= mouseXSmooth;
        rotationZ = Mathf.Clamp(rotationZ, -45, 45);
        spaceshipRoot.transform.localEulerAngles = new Vector3(defaultShipRotation.x, defaultShipRotation.y, rotationZ);
        rotationZ = Mathf.Lerp(rotationZ, defaultShipRotation.z, Time.deltaTime * cameraSmooth);

        //Update crosshair texture
        if (crosshairTexture)
        {
            crosshairTexture.position = mainCamera.WorldToScreenPoint(transform.position + transform.forward * 100);
        }
    }
}
  • Adjunte el script SC_SpaceshipController al objeto "Spaceship"
  • Cree un nuevo GameObject, llámelo "CameraPosition" y muévalo dentro del objeto "Spaceship"
  • Mueva la cámara principal dentro del objeto "CameraPosition" y cambie su posición a (0, 0, 0)
  • Modifique la posición del objeto "CameraPosition" hasta que esté satisfecho con el resultado

  • Mueva la cámara principal fuera del objeto "Spaceship"
  • En SC_SpaceshipController, asigne las variables Posición de la cámara, Cámara principal y Raíz de la nave espacial (esto debería ser una transformación de un modelo de nave espacial)

  • Cree un nuevo lienzo de interfaz de usuario (GameObject -> UI -> Canvas)
  • Haga clic con el botón derecho en el objeto Canvas -> UI -> Imagen
  • Cambiar la alineación de una nueva imagen a la parte superior izquierda

  • Asigna el sprite de abajo a la imagen.

punto de mira de ciencia ficción

  • Finalmente, asigne la imagen recién creada a Crosshair Texture en SC_SpaceshipController

El controlador de la nave espacial está listo. Usa el mouse para mirar alrededor, A/D para rotar a lo largo del eje Z y el botón derecho del mouse para acelerar.

Artículos sugeridos
Controlador de helicóptero para Unity
Agregar soporte de doble salto a un controlador de personajes de plataformas 2D en Unity
Cómo hacer control de grúa en Unity
Controlador de coche para Unity
Controlador de personajes Cómo agregar la capacidad de empujar cuerpos rígidos en Unity
Controlador de avión para Unity
Implementación del sistema Parkour en Unity