Marek Winiarski

Unity3d QuickTip #35 – Jak zrobić cykl dnia i nocy

Unity3d QuickTip – czyli szybkie porady, rozwiązania częstych problemów i sztuczki w Unity3d!

Dzisiejszy odcinek: Jak zrobić cykl dnia i nocy

Uwaga! Jest to poradnik typu QuickTip. Zatem skupia się on na osiągnięciu założonego celu. Zatem zakładamy że użytkownik zna na tyle program Unity3d, aby samodzielnie wykonać najprostsze czynności, jak np. dodanie modelu kostki do sceny czy dodanie modelowi jakiegoś komponentu. Jeżeli brakuje Ci tej podstawowej wiedzy, zapraszam do tutoriala:
Unity Tutorial – Podstawy

Poniższy tutorial jest pracą konkursową, a jej autorem jest: Paweł Jamroziak. 

Teoria

Stworzymy dziś cykl dnia i nocy który może przydać się nam przy tworzeniu rasowego RPG -a. Będą bardzo proste operacje na obiektach, oraz skrypt który zrozumie go nawet najbardziej początkujący.

Co nam będzie potrzebne? W zasadzie nic oprócz Unity oraz standardowych Assetów :) Wszystko mamy już podane razem z Unity.

Wykorzystane Assety ( Unity 5 ):

Budujemy fundamenty

Gdy mamy utworzony projekt, oraz zaimportowane Assety możemy przystąpić do budowania fundamentów naszego projektu.

Na potrzeby poradnika zbudowałem prostą scenę.
Na potrzeby poradnika zbudowałem prostą scenę.

Dodałem FPSController i usunąłem MainCamera (nie jest potrzebna, oraz dublowała Audio Listener przez co czasem nie było słychać odgłosów kroków lub skoku).

Zmieniłem również nazwy obiektów (dla własnej wygody) :

Niech stanie się światłość!

Następnym krokiem jest zmodyfikowanie naszego Słońca. Na razie wygląda tak:

Zwykły efekt słońca przed dodaniem flary.
Efekt słońca po dodaniu flary.

Wybieramy obiekt Słońce i przechodzimy do zakładki Inspector.

Panel Inspector dla obiektu słońce.

Zmieniamy parametry tak jak podałem na zdjęciu:

Uwaga! Światło na scenie powinno zmienić się na żółte. (Wyjaśnienie w “Ruszmy tym słońcem!”)

Testujemy efekt naszej pracy.. ale zaraz… Nasze słońce nie zmieniło wyglądu! Stało się tak, ponieważ prefab FPSController -a nie posiada ważnego komponentu odpowiedzialnego za wyświetlanie “Flar”.

Wybieramy nasz prefab, rozwijamy listę “dzieci” (naciskamy na strzałkę obok niego) i wybieramy FirstPersonCharacter. W zakładce Inspector dodajemy komponent Flare Layer ( Add Component -> Rendering -> Flare Layer ). Teraz powinno wszystko działać :)

Ruszmy tym słońcem!

W typie oświetlenia Directional Light zaimplementowano prostą funkcję, dzięki której stworzenie cyklu dnia i nocy jest banalne. Położenie samego słońca (Nie obiektu!) na scenie zależne jest od kąta nachylenia obiektu. Zwiększając, lub zmniejszając wartości parametru osi X możemy uzyskać pełny cykl (od wchodzu do zachodu, wliczając noc).

Tworzymy nowy skrypt (Create -> C# Script) o dowolnej nazwie (ja nazwałem go DNCycle) i otwieramy go w dowolnym edytorze (domyślnie MonoDevelop).

using UnityEngine;  
using System.Collections;                                            //  --1--

public class DNCycle : MonoBehaviour {

	public float speed = 1; 
	private float mn;                                            // --2--

	void Update () {                                             // --3--
		mn = speed * Time.deltaTime;                         // --4--
		transform.Rotate (Vector3.right * mn);               // --5--
	}
}
  1. “using” służy do dołączania bibliotek zawierających klasy, obiekty, funkcję które wykorzstujemy podczas pisania skryptu (np. transform.Rotate). Unity generuje nam tą część automatycznie.
  2. Tworzymy dwie zmienne typu zmiennoprzecinkowego (float):  speed i mn. Zmiennej speed nadajemy wartość 1 (to od niej będzie zależna prędkość naszego słońca). (Jesteś ciekaw co oznaczają dopiski public i private? Poczytaj o tym tutaj!)
  3. Wybrałem funkcję Update, ponieważ szybkość wykonywanie instrukcji w niej zawartych zależna jest od szybkości działania naszego procesora.
  4. Podstawiamy pod zmienną mn wynik mnożenia zmiennej speed i funkcji Time.deltaTime ( odmierza realne sekundy w grze ). 
  5. Zaczynamy od wybory naszego komponentu do którego się odwołujemy, w tym przypadku tansform. Następnie odnosimy się Rotation, a na końcu do jego parametrów (Vector3 to nic innego jak położenie 3D: X, Y, Z). My chcemy aby przemieszczało się w prawą stronę o czym świadczy dopisek .right.
    Mnożymy oś X z wartością zawartą w zmiennej mn. Dzięki temu zabiegowi nasze słońce będzie płynnie zmieniać swoje położenie na scenie.

Zapisujemy nasz skrypt i dodajemy go do obiektu Słońce. Testujemy czy wszystko działa. Nasze słońce jest za wolne lub za szybkie? Wystarczy że zmienisz wartość zmiennej “speed”.

Kto ukradł księżyc?!

Co to za noc bez księżyca! Stworzymy jeden prosty model w Unity i pobawimy się nim trochę tak, aby uzyskać miły dla oka efekt :)

Tworzymy nowy obiekt, sfere (GameObject -> 3D Object -> Sphere) i zmieniamy jej nazwę na np. Księżyc. Przechodzimy do zakładki Inspector:

Panel Inspector dla obiektu księżyc.

Jest to ustawienie mojego księżyca. Na moją mapę jest odpowiednie, ale radzę dopasować go do własnych potrzeb. Specjalnie nie dodałem żadnych efektów świetlnych, ponieważ są zbędne.

Następne co musimy zrobić to ustawić Księżyc jako “dziecko” Słońce. Dzięki temu będzie przemieszczać się tak samo jak nasze słońce po scenie. Jak to zrobić? Przechodzimy do zakładki Hierarchy i przeciągamy Księżyc na Słońce.

Ustawienie księżyca jako dziecko obiektu słońce
O to nasz księżyc :)
Exit mobile version