Perspektywa pierwszoosobowa- Cinemachine
Temat dotyczy zastosowania wspomagania kamery sceny wirtualna kamerą dostępną z pakietu Cinemamachine. Zastosowanie Cinemamachine ułatwia stosowanie płynne śledzenia poruszających się obiektów i nie tylko. Szeroki opis właściwości pakietu znajduje się w dostępnej dokumentacji Unity (patrz)
Organizacja prostej sceny
W tej części zbudujemy bardzo prostą scenę z gruntem, kilkoma kostkami i graczem. Tworzymy układ katalogów FBX, Materialy, Scenes (istnieje z automatu), Skrypty. W folderze Materialy tworzymy poglądowy materiał dla gruntu (patrz https://www.afizyka.pl/unity-pierwszy-program-3d). Na scenie umieszczamy obiekt 3D- Plane. Zerujemy pozycję, skalujemy w osiach X, Z i przypisujemy utworzony materiał. Patrz poniższy rysunek.
Tworzymy bohatera sceny. Dodajemy pusty obiekt 3D (Create Empty), zmieniamy nazwę na Bohater. W zakładce inspektora obiektów kontroler postaci (Character Controller)
W celach testowych do obiektu Bohater dodajemy kostkę (Cube), z której usuwamy Box Collider
Główną kamerę (Main Camera) sceny ustawiamy widokiem na bohatera. Do projektu dodajemy narzędzie ułatwiające pracę z kamerami- Cinemachine.
Instalacja pakietu Cinemachine
Wybieramy opcję Window/ Package Manager i instalujemy pakiet rozszerzeń- Cinemachine.
Do sceny podpinamy obiekt Cinemachine w trybie pracy FreeLook Camera.
Cinemachine automatycznie podpina swój mózg do głównej kamery sceny. Patrz poniższa ilustracja.
We właściwościach wirtualnej kamery przypisujemy w opcji Follow i Look At transformację śledzonego bohatera, a w polu Body wybieramy opcję 3rd Person Follow. Patrz poniższa ilustracja.
Dobierz parametry widzenia obiektywu kamery. Zacznij od doboru okręgów najazdów widoku kamery. Bardzo ważne, aby ustawić właściwość wiązania trybu współrzędnych Ciemachine ze współrzędnymi świata sceny. Ustaw Binding Mode na opcję World Space. Opcja ma znaczenie dla przyjętego rozwiązania w skrypcie ruchu postaci.
Parametry położenia ustawisz w funkcjach osi X i Y, w tym obrót za położeniem kursora myszy.
To tyle ze wstępnych ustawień Cinemachine. Dokładniejsze dopasowanie zrobimy z działającym skryptem kontrolera postaci dla gry z planem pierwszoosobowym.
Kontroler postaci z Cinemachine
Tworzymy nowy skrypt o nazwie RuchBohatera. W skrypcie deklarujemy polna na CharacterController ,Transform i float. Patrz poniżej.
Wskazówka:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RuchBohatera : MonoBehaviour
{
public CharacterController kontroler;
public Transform kamera;
//współczynnik prędkości
public float v = 2.5.0f;
public float wygladzenie = 0.1f;
float buforBiezacegoWygladzania;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
}
W hierarchii obiektów sceny zaznaczamy obiekt bohatera i dodajemy komponent Charakter Controller oraz nowo utworzony skrypt. Do skryptu podpinamy odpowiednie obiekty. Patrz poniższa ilustracja.
Skrypt rozbudujemy o możliwość ruchu i obrotu po wybraniu klawiszy strzałek oraz pójścia w stronę patrzenia kamery. Ruchem kamery nie musimy się martwić. W wersji podstawowej obsłuży to mózg Cinemachine.
W skrypcie dodajemy funkcję Ruch(). Kod funkcji przedstawiam poniżej. Cały ruch opiera się na wyznaczeniu kierunku wektora patrzenia z klawiatury i kamery. Na tej podstawie wyznaczony jest wektor prędkości ruchu kontrolera. W pewnym sensie przypomina to zadanie z fizyki dotyczące wektorów prędkości.
Wskazówka:
void Ruch()
{
float poziom = Input.GetAxis("Horizontal");
float pion = Input.GetAxis("Vertical");
Vector3 kierunek = new Vector3(poziom, 0, pion).normalized;
//czy ruch, powiedzmy wiecej niż 5 centymetrów
if (kierunek.magnitude >= 0.05f)
{
//obrót postaci
//zwróc kąt w radianach z płaszczyzny 2D- oś X a Z
//zamien radiany na stopnie
float katPatrzenia = Mathf.Atan2(kierunek.x, kierunek.z)
*Mathf.Rad2Deg
+kamera.eulerAngles.y;
//wygladzaj obrot,
//predkosc wygladzania wyslij do bufora
float kat = Mathf.SmoothDampAngle(
transform.eulerAngles.y,
katPatrzenia,
ref wygladzenie,
buforBiezacegoWygladzania
);
transform.rotation = Quaternion.Euler(0, kat, 0);
Vector3 kierunekRuchu = Quaternion.Euler(0, katPatrzenia, 0)
*Vector3.forward;
kontroler.Move(kierunekRuchu.normalized * v * Time.deltaTime);
}
}
Funkcję wywołamy w metodzie Update().
Pełna postać skryptu poniżej
Wskazówka:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RuchBohatera : MonoBehaviour
{
public CharacterController kontroler;
public Transform kamera;
//współczynnik prędkości
public float v = 5.0f;
public float wygladzenie = 0.1f;
float buforBiezacegoWygladzania;
void Ruch()
{
float poziom = Input.GetAxis("Horizontal");
float pion = Input.GetAxis("Vertical");
Vector3 kierunek = new Vector3(poziom, 0, pion).normalized;
//czy ruch, powiedzmy wiecej niż 5 centymetrów
if (kierunek.magnitude >= 0.05f)
{
//obrót postaci
//zwróc kąt w radianach z płaszczyzny 2D- oś X a Z
//zamien radiany na stopnie
float katPatrzenia = Mathf.Atan2(kierunek.x, kierunek.z)
*Mathf.Rad2Deg+
kamera.eulerAngles.y;
//wygladzaj obrot,
//predkosc wygladzania wyslij do bufora
float kat = Mathf.SmoothDampAngle(
transform.eulerAngles.y,
katPatrzenia,
ref wygladzenie,
buforBiezacegoWygladzania
);
transform.rotation = Quaternion.Euler(0, kat, 0);
Vector3 kierunekRuchu = Quaternion.Euler(0, katPatrzenia, 0)
*Vector3.forward;
kontroler.Move(kierunekRuchu.normalized * v * Time.deltaTime);
}
}
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
Ruch();
}
}
Uruchom scenę i sprawdź efekt działania.
Ruch obiektu jest konsekwencją ułożenia myszki i wciskania klawiszy strzałek lub W, S, A, D.
Ruch za obiektem zasłaniającym widok kamery
Cinemachine ma możliwość ukrywania obiektów sceny, które zasłaniają śledzony obiekt.
Do sceny dodajemy dwa obiekty 3D typu Cube. Odpowiednio je powiększamy i przypisujemy Tag o nazwie Budowle. Patrz poniższa ilustracja.
Na scenie przechodzimy do obiektu Cinemachine i dodajemy rozszerzenie CinemachineCollider
Wskazujemy aby Cinemachine ignorowała obiwkty o wskazanym Tagu (Budowle)
Uruchom scenę i poruszaj się za budowlę. Cinemachine wyłączy widoczność obiektu budowli, ale cień pozostanie. Patrz poniżej.
W tej części to na tyle.