Controler de navă spațială în Unity

În acest tutorial, voi arăta cum să faci un controler de navă spațială în Unity.

Sa incepem!

Pași

  • Creați un nou GameObject, apelați-l "Spaceship"
  • Mutați modelul navei spațiale în interiorul obiectului "Spaceship" și schimbați-i poziția în (0, 0, 0)
  • Creați un nou script, numiți-l "SC_SpaceshipController" și inserați codul de mai jos în el:

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);
        }
    }
}
  • Atașați scriptul SC_SpaceshipController la obiectul "Spaceship"
  • Creați un nou GameObject, numiți-l "CameraPosition" și mutați-l în interiorul obiectului "Spaceship"
  • Mutați camera principală în interiorul obiectului "CameraPosition" și schimbați-i poziția în (0, 0, 0)
  • Modificați poziția obiectului "CameraPosition" până când sunteți mulțumit de rezultat

  • Mutați camera principală în afara obiectului "Spaceship"
  • În SC_SpaceshipController, atribuiți variabilele Poziția camerei, Camera principală și Rădăcina navei spațiale (aceasta ar trebui să fie o transformare a unui model de navă spațială)

  • Creați o nouă UI Canvas (GameObject -> UI -> Canvas)
  • Faceți clic dreapta pe obiect Canvas -> UI -> Imagine
  • Schimbați alinierea unei noi imagini în partea din stânga sus

  • Atribuiți sprite-ul de mai jos imaginii

cruce științifico-fantastică

  • În cele din urmă, atribuiți imaginea nou creată texturii Crosshair în SC_SpaceshipController

Controlerul navei spațiale este gata. Folosiți mouse-ul pentru a privi în jur, A/D pentru a roti de-a lungul axei Z și butonul din dreapta al mouse-ului pentru a accelera.

Articole sugerate
Adăugarea suportului pentru salt dublu la un controler de caractere 2D platformer în Unity
Controler de caractere Cum să adăugați capacitatea de a împinge corpuri rigide în Unity
Controler de avion pentru Unity
Implementarea sistemului Parkour în Unity
Controler de jucător planetar bazat pe corp rigid pentru Unity
Controler de caractere 2D pentru Unity
Controler Unity FPS