Jak zakodować kontroler postaci oparty na fizyce w Unity3D

Jak zakodować kontroler postaci oparty na fizyce w Unity3D

Kontroler postaci może pomóc Ci zaimplementować prostą fizykę ruchu w Twojej grze.

Do kontrolerów postaci Unity3D można podejść pod kilkoma kątami. Jeśli używasz biblioteki z potężnymi klasami i funkcjami, stworzenie kontrolera postaci opartego na fizyce może być fajnym miejscem do rozpoczęcia tworzenia gry.

Krok 1: Utwórz scenę z graczami i obiektami terenowymi

kontroler postaci jedności przestrzeń 3d

Po otwarciu Unity i utworzeniu nowego projektu możesz zacząć od dodania kilku obiektów do swojej sceny. Możesz tworzyć te obiekty w dowolnej kolejności, ale uważaj, aby upewnić się, że używasz właściwych ustawień. Chociaż ten projekt jest prosty, jest to świetny sposób na rozpoczęcie pracy z aparatem Unity.

Obiekt płaszczyzny 3D dla terenu

Pierwszym obiektem, który należy dodać do sceny, jest samolot. Kliknij prawym przyciskiem myszy wewnątrz panelu hierarchii, najedź kursorem na Obiekt 3D i wybierz Płaszczyzna z listy. Możesz dostosować rozmiar samolotu, aby zapewnić większy obszar testowy, ale nie musisz nic więcej z tym robić.

Model odtwarzacza z obiektami typu Cube

Następnie nadszedł czas, aby dodać kostkę do sceny, która będzie działać jako model gracza. Kliknij prawym przyciskiem myszy wewnątrz panelu hierarchii, najedź kursorem na Obiekt 3D i wybierz Sześcian z menu rozwijanego. Umieść nowy sześcian tak, aby znajdował się nad dodaną płaszczyzną. Musisz także dodać komponent sztywnego ciała, aby sześcian stał się obiektem fizycznym.

Wybierz kostkę i przejdź do Inspektora. Kliknij Dodaj komponent na dole panelu, wyszukaj sztywne ciało i wybierz sztywne ciało z listy, gdy się pojawi. Zaznacz pole wyboru Użyj grawitacji i pozostaw pozostałe ustawienia bez zmian.

Możesz znaleźć darmowe zasoby Unity online, aby ulepszyć swój projekt.

Kamera trzecioosobowa

Twoja scena powinna już mieć kamerę, której możesz użyć jako kamery trzeciej osoby. Ustaw kamerę tak, aby znajdowała się w wygodnej pozycji trzeciej osoby nad kostką. Przejdź do panelu hierarchii przed przeciągnięciem i upuszczeniem kamery na kostkę, aby utworzyć relację rodzic-dziecko. Po wykonaniu tej czynności kamera automatycznie podąży za kostką.

Szybki test

Chociaż twoja scena nie ma jeszcze żadnego kodu, możesz przetestować pracę, którą wykonałeś do tej pory. Kliknij przycisk Graj u góry ekranu, aby załadować grę. Powinieneś zobaczyć, jak sześcian spada i ląduje na samolocie, a kamera powinna śledzić spadający sześcian.

Krok 2: Skonfiguruj plik C#

Teraz czas na utworzenie pliku C#, abyś mógł zacząć programować jakiś ruch. Przejdź do sekcji Projekt, kliknij prawym przyciskiem myszy, najedź kursorem na Utwórz i wybierz z listy Folder. Nazwij folder Skrypty lub coś podobnego.

Przejdź do nowego folderu i powtórz proces, ale wybierz z listy opcję Skrypt języka C#. Możesz nadać temu plikowi dowolną nazwę, ale będzie to również nazwa głównej funkcji w nim zawartej. Upewnij się, że Twój nowy język C# wygląda tak.

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

public class Character_Control: MonoBehaviour {
    void Start() {
    }


    void Update() {
    }
}

Krok 3: Użyj C#, aby utworzyć ruch do przodu i do tyłu z prędkością

Przed dodaniem do funkcji w pliku skryptu zadeklaruj kilka zmiennych publicznych. Najpierw jest Rigidbody do przechowywania modelu gracza. Zadeklaruj również pływak, aby śledzić prędkość ruchu. Te zmienne znajdują się w klasie głównej, poza funkcjami.

public Rigidbody rigidbody;
public float speed;

Następnie nadszedł czas, aby dodać pojedynczą linię kodu do funkcji Start. Wykorzystuje to deklarację GetComponent do przypisania komponentu sztywnego ciała kostki do utworzonej zmiennej sztywnego ciała.

void Start() {
    rigidbody = GetComponent < Rigidbody > ();
}

Teraz możesz dodać kod, który sprawi, że Twój model gracza będzie się poruszał. Ten kod jest ładny i prosty; potrzebujesz tylko dwóch instrukcji if, jednej do ruchu do przodu i jednej do cofania się. Możesz użyć Input.GetKey, aby określić, kiedy klawisz jest naciskany. W tym przypadku szukasz naciśnięć klawiszy W i S.

Naciśnięcie któregokolwiek z tych klawiszy dodaje siłę do sztywnego ciała sześcianu za pomocą sztywnego ciała.AddForce. Możesz obliczyć kierunek i prędkość dodanej siły, mnożąc jej położenie w osi Z (transform.forward) przez zmienną prędkości. Nie ma klasy transform.backward, której można by użyć do ruchu wstecz, ale można to osiągnąć, mnożąc transform.forward przez -1.

if (Input.GetKey("w")) {
    rigidbody.AddForce(transform.forward * speed);
}

if (Input.GetKey("s")) {
    rigidbody.AddForce((transform.forward * -1) * speed);
}

Zapisz plik C# i przejdź z powrotem do aparatu Unity. Znajdź skrypt w panelu projektu i przeciągnij go i upuść na model postaci Cube wewnątrz hierarchii, aby przypisać skrypt do tego obiektu. Po wybraniu kostki powinieneś zobaczyć skrypt jako komponent w okienku inspektora. Kliknij wewnątrz pola zmiennego ciała sztywnego i wybierz ciało sztywne sześcianu.

Możesz teraz użyć przycisku Graj, aby uruchomić grę i przetestować swój kod. Ale poczekaj! Jest pewien problem; Twoja kostka będzie się toczyć, zamiast poruszać się prosto do przodu. Wróć do inspektora Cube, znajdź komponent Rigidbody i zaznacz pola wyboru Freeze Rotation na osiach X i Z przed ponownym uruchomieniem gry. Teraz powinno działać.

Krok 4: Użyj C#, aby stworzyć skręt w lewo i w prawo z momentem obrotowym

W przeciwieństwie do poruszania się do tyłu i do przodu, obracanie modelu odtwarzacza Cube wymaga siły zwanej momentem obrotowym. Potrzebujesz do tego innej zmiennej: publicznego pływaka do przypisania wartości momentu obrotowego.

public float torque;

Kod skrętu w lewo i prawo w tym skrypcie jest bardzo podobny do kodu używanego do poruszania się do przodu i do tyłu. Istnieje instrukcja if dla każdego kierunku, która szuka naciśnięć klawisza D (skręt w prawo) lub klawisza A (skręt w lewo).

Pierwszym krokiem w każdej instrukcji if jest określenie kierunku skrętu za pomocą metody Input.GetAxis i przypisanie wyniku do zmiennej typu float. Następnie użyj sztywnego ciała.AddTorque, aby zastosować siłę obrotową do modelu postaci Sześcianu, mnożąc moment obrotowy, obrót i oś Z sześcianu.

if (Input.GetKey("d")) {
    float turn = Input.GetAxis("Horizontal");
    rigidbody.AddTorque(transform.up * torque * turn);
}

if (Input.GetKey("a")) {
    float turn = Input.GetAxis("Horizontal");
    rigidbody.AddTorque(transform.up * torque * turn);
}

Zapisz swój kod i wróć do Unity, aby go przetestować. Możesz dostosować prędkość i czas przyspieszania rotacji modelu odtwarzacza, wybierając kostkę i edytując zmienne masy, oporu i momentu obrotowego sztywnego ciała w swoim skrypcie. Ten przykładowy projekt opiera się na 1 masie, 1 oporze i 2 momentach obrotowych.

Krok 5: Użyj C# do programowania skoków

Jako ostatni element tego kontrolera postaci Unity nadszedł czas, aby stworzyć swój skok. Tworzenie skoku jest bardziej złożone niż inne podstawowe elementy sterujące, nad którymi pracowałeś, biorąc pod uwagę, że skok musi mieć ograniczoną wysokość. Zacznij od dodania prywatnej zmiennej boolowskiej, aby śledzić, czy gracz skacze.

private bool isJumping = false;

Ta zmienna nie zrobi nic bez instrukcji, aby ją przetestować. W takim przypadku podstawowa instrukcja if sprawdzająca, czy zmienna jest fałszywa, załatwi sprawę. Dodanie tego samego warunku do innych ruchów, jeśli stwierdzenia powstrzymają gracza przed poruszaniem się podczas skoków.

if (!isJumping) {
}

Dodanie tego samego warunku do innych ruchów, jeśli stwierdzenia powstrzymają gracza przed poruszaniem się podczas skoków.

if (Input.GetKey("w") &&! isJumping) {
    rigidbody.AddForce(transform.forward * speed);
}

w ciągu! isJumping instrukcja if, potrzebujesz kolejnej instrukcji if, tym razem do sprawdzenia naciśnięcia klawisza przycisku skoku. Nadanie zmiennej isJumping wartości true jest pierwszą rzeczą do zrobienia w tej instrukcji if, po której następuje deklaracja sztywnego ciała.angularVelocity w celu usunięcia sił aktualnie działających na sześcian.

Teraz możesz użyć deklaracji sztywnego ciała.AddForce, aby dodać siłę do sześcianu na jego osi Z, tworząc ruch skokowy w górę. Na koniec nadszedł czas, aby użyć deklaracji invoke do wywołania innej funkcji po 0,8 sekundy.

if (!isJumping) {
    if (Input.GetKeyDown("space")) {
        isJumping = true;
        rigidbody.AddForce(transform.up * speed * 120);
        rigidbody.angularVelocity = Vector3.zero;
        Invoke("Move_Setter", 0.8 f);
    }
}

Ta funkcja ustawia zmienną isJumping z powrotem na false, dzięki czemu ruch/skakanie jest ponownie możliwe, a 0,8-sekundowe opóźnienie zapobiega zbyt szybkiemu uruchomieniu.

void Move_Setter() {
    isJumping = false;
}

Krok 6: Przetestuj swój kod kontrolera postaci

Zapisz plik i wróć do Unity, aby przetestować napisany kod. Podobnie jak większość kompilatorów, Unity dostarcza informacji o błędach i innych problemach z twoim kodem, aby ułatwić zobaczenie, co może wymagać zmian. Możesz zobaczyć pełny kod tego projektu na naszej stronie GitHub.

Tworzenie kontrolerów postaci Unity

Możesz wybierać spośród wielu różnych podejść podczas tworzenia kontrolera postaci w Unity. Korzystanie z fizyki jest jedną z opcji, ale jeśli chcesz, możesz także użyć wbudowanego systemu kontrolerów postaci.

Odkrywanie różnych opcji, takich jak ta, to świetny sposób na poznanie narzędzi takich jak Unity.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *