Developing > Unity
Dialogi - skrypt Kubyzioma
Kuba90:
Witam chciałbym Wam pokazać jak w prosty sposób można zrobić dialogi z NPC unity.
Najpierw stworzymy tablice ze zmiennymi.Zacznijmy od Imienia Gracza i NPC
--- Kod: ---var imieg : String;
var imien : String;
--- Koniec kodu ---
Zabieramy się za stworzenie listy tematów
--- Kod: ---var tem : String;
--- Koniec kodu ---
i robimy tyle ile chcemy mieć opcji dialogowych mówionych przez naszą postać
Następnie tworzymy odpwiedzi które udziela nam NPC
--- Kod: ---var odp : String;
--- Koniec kodu ---
No to mamy już kluczowe elementy dialogu czyli głowne kwestie dialogowe.Dalej tworzymy pozycję wyświetlania odpowiedzi mówionych przez NPC
--- Kod: ---var pozycja : GUIText;
--- Koniec kodu ---
Tutaj tworzymy gameobject typu GUIText i umieszczamy go w odpowienim miejscu i usuwamy z niego w inspektorze napis.
Teraz tworzymy możliwośc wyboru skinu naszego GUI czyli
--- Kod: ---var skin : GUISkin;
--- Koniec kodu ---
Dalej kolejny bardzo potrzeban rzecz to pokazywanie się GUI czyli
--- Kod: ---var showGUI : boolean = false;
--- Koniec kodu ---
Teraz ustawione jest ,że GUI sie nie pokaze dopuki czegoś tam nie zrobimy
Kolejna bardzo ważna zmienna to odległośc od NPC czyli
--- Kod: ---public var dist : int;
--- Koniec kodu ---
Teraz wrzucamy w skrypt samego gracza czyli
--- Kod: ---var gracz : Transform;
--- Koniec kodu ---
No i kamery dialogowe i kamere którą używa gracz.
--- Kod: ---var camg : Camera;
var camd : Camera;
--- Koniec kodu ---
Dalej przechodzimy do kolejnego etapu tworzymy funkcje która po kliknięciu w NPC z odpowiedniej odległości wyzwoli dialog
--- Kod: ---function OnMouseDown(){
if(Vector3.Distance(gracz.position, transform.position) > dist) return; ///To dystans jeżeli jest większy od podaje wartości w inspektorze nie wsyswietli się GUI
showGUI = true ; ///to pokazanie naszego GUI
}
--- Koniec kodu ---
Dalej tworzymy nasze GUI
--- Kod: ---function OnGUI () { //funkcja gui
if(showGUI){ // pokazanie GUI po spełnieniu warnków
--- Koniec kodu ---
Dalej tworzymy nadal w funkcji GUI zablokowanie gracza ,żeby się ruszał w dialogu oraz ustawiamy zmianę kaery na dilogową :
--- Kod: ---camg.camera.enabled = false; //wyłacza kamere gracza
camn.camera.enabled = true; //włącza kamere dialogową
gracz.transform.active = false; //i wyłącza gracz
--- Koniec kodu ---
Teraz wygląd GUI (nadal w tej samej funckji)
--- Kod: --- GUI.skin = skin;// nasz skin
GUI.Box (Rect (pozycja i skala),imien ); //GUI box z imieniem NPC
GUI.Box (Rect (pozycja i skala),imieg ); //GUI Box z imieniem Gracza
if(GUI.Button(Rect(pozycja i skala),tem)) //Przycisk tematu czyli naszej kwesti dialogowej
{
pozycja.text = odp; // i odpowiedz NPC
}
--- Koniec kodu ---
Robimy tyle tematów ile chcemy i do nich odpowiedzi
I przycisk kończący rozmowe
--- Kod: ---if(GUI.Button(Rect(600,540,200,20),"Koniec")) //tutaj przykładowa skala i pozycja przycisku, identycznie jest z boxami
{
pozycja.text = ""; // nie wyświetla już tekstu
gracz.transform.active = true; // uaktywnia gracza
camg.camera.enabled = true; //i jego kamere
camn.camera.enabled = false; //wyłącza kamere dialogu
showGUI = false; //oraz GUI
}
}
}
--- Koniec kodu ---
Teksty wklejamy do inspektora w odpowienie pola , i ważne żeby tekst napisać w notatniku z ustawienim wersów jakie chcemy i kopiujemy z tamtąd tekst i wklejamy do inspektora.
A tak to wygląda w działaniu :
https://www.youtube.com/watch?v=O3FDuosmjoE
Jeżeli jakieś pytania proszę smiało pisać .
mgr Fartuess:
mam kilka uwag. Imię bohatera i NPCa nie powinny być polami dialogu tylko atrybutami postaci(a konkretniej skryptów doń podpiętych).
Jeśli dobrze rozumiem z każdą opcją dialogową musimy dodawać do skryptu nową zmienną string. Nie lepiej by było zrobić to powiedzmy w postaci listy stringów? Albo jeszcze lepiej listy obiektów samodzielnie stworzonej klasy która od razu miałaby listę referencji na swoje odpowiedzi(w ten sposób od razu mielibyśmy elastyczny system oraz możliwość kilkakrotnej wymiany dialogów między postaciami). Tylko nie wiem czy Unity'owy inspektor by sobie poradził z wyklikiwaniem tych wszystkich klas. Być może trzebaby wtedy sobie dokodzić odpowiednią obsługę do inspectora.
Poza tym C# jest szybszy od JavaScriptu
No ale co ja się czepiam. Gdyby sprostać moim uwagom, to to już by nie był prosty i łatwy system dialogów, a tu chodziło chyba właśnie o takie coś :)
Kuba90:
Co do Twoich uwag to bym musiał pomyśleć, no ale miało być prosto i szybko, oczywiście można modyfikować skrypt dodając mu animację npc , spawn trigera który coś tam robi w npc czy graczem możliwości jest wiele.
Dalej ja umię tylko korzystać z JavaScript i dla mnie jest on jak najbardziej wygodny i jego się uczę :)
Co do imion to wzorowałem się na wyglądzie a bardziej na układzie z Morrowinda :
http://i1191.photobucket.com/albums/z478/what_is_your_quest/A%20Look%20at%20the%20Elder%20Scrolls/Elder%20Scrolls%20-%20Morrowind/morrowind_dialogue_2.jpg
Gdzie masz podpis nazay naszego NPC w dialogu.A ,że dodałem jeszcze imię gracza , to tylko po to bo tak mi się wymyśliło.
BTW dzięki za uwagi może to jeszcze poprawię ,choć jeszcze nie wiem jak szczeże:D
Reverse:
Jak na razie najlepszy tutorial o Unity na forum :ok: .
Ridic530:
Jest w unity jakaś zmienna rozdzielczości? Bo w każdej rozdzielczości gdzie indziej mi się ten dialog pokazuje...
P.S jest jakaś funkcja włączająca animację od danej klatki do danej klatki Bo mam model w wingsie i będę go animował w blenderze i animacje się zapisuje razem z plikiem..
Czyli na przykład mam 1 plik npc z animacją.fbx i mogę włączać animację? Jak tak to poproszę link funkcji bo w dokumentacji znaleźć nie mogę?!
Nawigacja
[#] Następna strona
Idź do wersji pełnej