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.

budowa sceny Unity

Tworzymy bohatera sceny. Dodajemy pusty obiekt 3D (Create Empty), zmieniamy nazwę na Bohater. W zakładce inspektora obiektów kontroler postaci (Character Controller)

bohater sceny Unity

W celach testowych do obiektu Bohater dodajemy kostkę (Cube), z której usuwamy Box Collider

cube Unity

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.

Instalacja pakietu Cinemachine Unity

Do sceny podpinamy obiekt Cinemachine w trybie pracy FreeLook Camera.

FreeLook Camera Unity

Cinemachine automatycznie podpina swój mózg do głównej kamery sceny. Patrz poniższa ilustracja.

Cinemachine FreeLook Camera Unity

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.

Cinemachine Follow i Look At Unity

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.

obrót Cinemachine Unity

Parametry położenia ustawisz w funkcjach osi X i Y, w tym obrót za położeniem kursora myszy.

x y obrót Cinemachine Unity

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.

Charakter Controller Cinemachine Unity

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.

Cinemachine Unity

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.

tag Unity

Na scenie przechodzimy do obiektu Cinemachine i dodajemy rozszerzenie CinemachineCollider

CinemachineCollider Unity

Wskazujemy aby Cinemachine ignorowała obiwkty o wskazanym Tagu (Budowle)

CinemachineCollider Unity

Uruchom scenę i poruszaj się za budowlę. Cinemachine wyłączy widoczność obiektu budowli, ale cień pozostanie. Patrz poniżej.

CinemachineCollider Unity

W tej części to na tyle.

Alkomat- wirtualny test

Alkomat- darmowa aplikacja na Androida

Pobierz ze sklepu Google Play
Olinowanie stałe- kalkulator średnic

Olinowanie stałe- darmowa aplikacja na Androida

Pobierz ze sklepu Google Play
przepis na gogfry

Przepis na gofry

zobacz
przepis na bitą śmietanę

Przepis na bitą śmietanę

zobacz