Contrôleur de vaisseau spatial dans Unity

Dans ce didacticiel, je vais montrer comment créer un contrôleur de vaisseau spatial en Unity.

Commençons!

Pas

  • Créez un nouveau GameObject, appelez-le "Spaceship"
  • Déplacez le modèle de vaisseau spatial à l'intérieur de l'objet "Spaceship" et changez sa position en (0, 0, 0)
  • Créez un nouveau script, appelez-le "SC_SpaceshipController" et collez-y le code ci-dessous:

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);
        }
    }
}
  • Attachez le script SC_SpaceshipController à l'objet "Spaceship"
  • Créez un nouveau GameObject, appelez-le "CameraPosition" et déplacez-le dans l'objet "Spaceship"
  • Déplacez la caméra principale à l'intérieur de l'objet "CameraPosition" et changez sa position en (0, 0, 0)
  • Ajustez la position de l'objet "CameraPosition" jusqu'à ce que vous soyez satisfait du résultat

  • Déplacez la caméra principale en dehors de l'objet "Spaceship"
  • Dans SC_SpaceshipController, attribuez les variables Position de la caméra, Caméra principale et Racine du vaisseau spatial (il devrait s'agir d'une transformation d'un modèle de vaisseau spatial)

  • Créez un nouveau canevas d'interface utilisateur (GameObject -> UI -> Canvas)
  • Faites un clic droit sur l'objet Canvas -> UI -> Image
  • Changer l'alignement d'une nouvelle image en haut à gauche

  • Attribuez le sprite ci-dessous à l'image

réticule de science-fiction

  • Enfin, attribuez l'image nouvellement créée à Crosshair Texture dans SC_SpaceshipController

Le contrôleur du vaisseau spatial est prêt. Utilisez la souris pour regarder autour de vous, A/D pour faire pivoter le long de l'axe Z et le bouton droit de la souris pour accélérer.

Articles suggérés
Contrôleur de personnage Comment ajouter la possibilité de pousser des corps rigides dans Unity
Ajout de la prise en charge du double saut à un contrôleur de personnage de plateforme 2D dans Unity
Contrôleur d'avion pour Unity
Implémentation du système Parkour dans Unity
Ajout de Crouching au lecteur FPS dans Unity
Tutoriel sur le contrôleur de ver 3D pour Unity
Comment ajouter la prise en charge de la plate-forme mobile au contrôleur de personnage dans Unity