Forum jest aktualnie zamknięte.

Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Tworzenie własnych czarów cz.1 - Czary Jednoinstancjowe
#1
Siema,
zaczynam szaleć z tymi poradnikami :P Ten będzie dość długi, ponieważ tworzenie czarów w edytorze wyzwalaczy to bardzo rozległy temat a chciałbym tutaj zawrzeć wszystko co może się przydać i tym kompletnie zielonym, i tym średniozaawansowanym.

A więc do dzieła :D 

Edytor obiektów:

Dobrze jest zacząć od edytora obiektów, bo to również pomoże nam określić jakiego typu będziemy robić czar. Oczywiście nie jest to taka zasada że trzeba zaczynać od edytora obiektów, ja notorycznie to olewam xD Ale tym razem zacznę od tego.
Co takiego jest nam potrzebne w edytorze obiektów? Na pewno jakaś zdolność. W końcu tworzymy czar. Zwracam uwagę że musi to być "pusta" zdolność, czyli taka która nic nie robi. Z jej pomocą nasza postać będzie aktywować wszystkie późniejsze wyzwalacze.
Warto też się zastanowić od jakiej podstawowej zdolności stworzymy naszą "pustą" zdolność. Jeżeli czar ma być obszarowy, to można wykorzystać na przykład Jasnowidzenie wróżbity. Jeżeli ma działać na jedną jednostkę to można wykorzystać Młot Burzy, Palec Śmierci itd. Jeżeli czar ma nie mieć celu to na przykład Bojowe Stąpnięcie albo Uderzenie Gromu. Trzeba wiedzieć od czego zacząć.

Stwórzmy więc na początek kilka "pustych zdolności". Nie będę ich konkretnie nazywać bo jeszcze nie zdecydowałem co będą robić.
Wybrałem Jasnowidzenie na obszarowy czar, Novę Mrozu na czar z jednym celem, Uderzenie Gromu na czar bez celu. Robię z nich po kolei puste zdolności. Jak to powinno wyglądać:
[Obrazek: NgYpZb2.png]
Pozostałe czary wyglądają podobnie. To co warto nie zostawiać tutaj pustego to obszar działania dla czarów obszarowych, zasięg rzucania, przerwę między użyciami i koszt many. Te dwa ostatnie zostawiam zerowe bo to tylko dla przykładu.

Bardzo prawdopodobne że jeszcze będziemy wracać do edytora obiektów żeby tworzyć jednostki dummy, ale co to jest i na co one są to o tym później.

Edytor wyzwalaczy:
Tutaj cała zabawa się zaczyna. Zajmiemy się tutaj trzema zagadnieniami:
- Single User Instanceability, czyli takie, kiedy tylko jedna instancja czaru może działać na raz, tutaj będzie zawarta cała idea robienia czarów.
- Multiple User Instanceability (MUI), tutaj wyjaśnię na czym to polega, jak to zrobić i łatwe przejście z Single User Instanceability na MUI.
- Systemy, ponieważ większość czarów korzysta z podobnych albo takich samych akcji, postaramy się podzielić je na systemy, które będzie można wykorzystywać dla każdego czaru i nie będzie trzeba wklejać ich do każdego z osobna. Jest to efektywniejsze, bardziej czytelne, łatwiejsze do edycji no i wygodniejsze :D
(Sorry że napisałem te nazwy po angielsku, po prostu nie wiem jak to nazwać po polsku :P podajcie sugestie to zmienię)

Single User Instanceability:
Czary można podzielić na jeszcze inne 3 rodzaje:
-takie które dzieją się natychmiast, na przykład Święty Blask, (zdolności natychmiastowe są jednocześnie MUI, z racji tego że żadna inna akcja nie może namieszać w naszych "natychmiastowych" akcjach)
-takie które dzieją się przez jakiś czas, na przykład Uderzenie Płomieni
-pasywne
Dla natychmiastowych czarów zazwyczaj wystarczy jeden wyzwalacz, dla tych które dzieją się przez jakiś czas zazwyczaj wystarczą dwa, a dla pasywnych nie da się stwierdzić ile zazwyczaj potrzeba. Można się zmieścić i w jednym, i w dwóch i w piętnastu.
Niezależnie od tego jaki to jest czar, ja lubię zawsze dodać jeszcze jeden wyzwalacz konfiguracyjny, w którym będą ustawiane takie wartości jak obrażenia, obszar działania, jak długo będzie działać czar i wiele innych. W miarę jak czar jest tworzony to uzupełniam ten wyzwalacz konfiguracyjny rzeczami, które chcę żeby były konfiguracyjne.
Zacznijmy tworzyć czar :D

Aby powiązać naszą zdolność w edytorze obiektów z wyzwalaczem, wystarczy zrobić coś takiego:
[Obrazek: M3ufBGu.png]
Wszystkie akcje jakie damy w tym wyzwalaczu będą częścią naszego czaru. Wydarzenie to Jednostka - Generic Unit Event, a warunek to Ability Comparision.
W tym wydarzeniu, poza "Rozpoczyna działanie zdolności" zobaczycie też podobne wydarzenia jak Zaczyna rzucać zaklęcie, Zaczyna ukierunkowywać zaklęcie, Kończy rzucanie zaklęcia. Niby wyglądają podobnie, ale każde z tych wydarzeń dzieje się w innym momencie.

Jednostka - A unit Zaczyna Ukierunkowywać Zdolność - To się dzieje jako pierwsze

Od tego momentu rozpoczyna się Czas rzucania zdolności

Jednostka - A unit Zaczyna Rzucać Zaklęcie - Czas rzucania zdolności minął, wtedy jednostka uzyskuje taki status, to się dzieje jako drugie.

Teraz jednostka odgrywa swoją animację rzucania zaklęcia.

Jednostka - A unit Rozpoczyna działanie zdolności - wraz z animacją jednostka uzyskuje taki status, to się dzieje jako trzecie,

Pobierana jest mana za użycie czaru

Jednostka - A unit Kończy rzucanie zaklęcia - Ostatni etap rzucania zaklęcia, wszystko poprzednie się zakończyło.

Kiedy jednostka Zaczyna Ukierunkowywać Zdolność, to wciąż można ją przerwać. Poprzez wydanie jednostce innego rozkazu, poprzez ogłuszenie albo uciszenie.

Dobra, wiemy już co się kiedy dzieje, możemy wybrać sobie to w naszym wydarzeniu. Zazwyczaj korzysta się z dwóch środkowych etapów, ale dla szczególnych przypadków potrzeba użyć innych. Wszystko zależy od aktualnych potrzeb.

Jak leczyć za pomocą wyzwalaczy (własna wersja natychmiastowego Świętego Blasku)
[Obrazek: 9xVA800.png]
Wydarzenie powinno być jasne, podobnie warunek :P Zwracam uwagę że czar, jaki został użyty do Świętego blasku musi działać tylko na jedną jednostkę. Aby ten czar leczył sojusznicze jednostki, trzeba w edytorze obiektów zmienić Dopuszczalne Cele.
Zobaczymy co się dzieje w akcjach.
CastingUnit to zmienna typu Jednostka, w tym konkretnym przykładzie nie jest nam do niczego potrzebna, chciałem tylko zwrócić uwagę jak dostać się do poszczególnych jednostek. Kiedy jednostka uruchamia ten wyzwalacz za pomocą rzuconego zaklęcia, to uzyskuje status "Casting Unit" jako reakcja na wydarzenie rzucania zaklęcia. Można również użyć "Triggering Unit" jako jednostka która uruchamia wyzwalacz. Natomiast jednostka, na którą rzucimy zaklęcie to (Target unit of ability being cast). W ten sposób rozpoznajemy która jednostka jest tą która rzuca zaklęcie a która jest tą na którą zaklęcie zostało rzucone.
TempReal = 300, jest to wartość o jaką chcę żeby moja jednostka została uleczona.
TempReal2 to po prostu działanie matematyczne. Aby uleczyć jednostkę trzeba do jej obecnego życia dodać wartość o jaką chcemy ją uleczyć. Dlatego do zmiennej TempReal2 pobieramy obecne życie naszego celu (Zycie of TargetUnit) i dodajemy do tego wartość o jaką chcemy uleczyć czyli 300. Jeżeli obecne życie naszej jednostki wynosiło 100 to zmienna TempReal2 uzyskuje wartość 400 (100 + 300). Ostatnią akcją która dokończy dzieła jest ustawienie życia naszego celu na wybraną wartość, czyli TempReal2. Jeżeli ktoś się boi zmiennych, to może te 3 linijki zrobić w ten sposób:
[Obrazek: HszTa4v.png]
Aby wejść do edytora zmiennych wystarczy wcisnąć Ctrl + B w edytorze wyzwalaczy. Potem na zielony przycisk aby dodać nową zmienną.
Ostatnie dwie linijki naszego czaru to efekt specjalny, wybrałem dokładnie taki sam jaki ma Święty Blask. Od razu należy usunąć ten efekt. Nasz czar nie różni się zbytnio od tego który posiada Paladyn.

Jak teraz zrobić z tego czar, który jest zależny od poziomu? O tak:
[Obrazek: IwHfAS1.png]
Zmienna PoziomZdolności to zmienna typu C. Zapisujemy w niej poziom zdolności naszego bohatera.
Zmienna TempReal[Indeks] to wciąż zmienna typu R, ale tym razem z tablicą. Podczas tworzenia zmiennej wystarczy zaznaczyć "Tablica"
[Obrazek: ujhIJo7.png]
I tak: TempReal[1] oznacza o jaką wartość nasz cel zostanie uleczony na pierwszym poziomie zdolności. TempReal[2] oznacza wartość uleczenia na drugim poziomie i TempReal[3] na trzecim poziomie.
Teraz przyjrzyjcie się TempReal2. Wygląda bardzo podobnie jak we wcześniejszym przykładzie. Tylko + TempReal wygląda inaczej. Pamiętajcie że zmienna PoziomZdolnosci zawiera obecny poziom naszej zdolności. Jeżeli ustawimy tą zmienną jako indeks w zmiennej TempReal, to będzie ona pobierać jedną z trzech zmiennych zapisanych wcześniej:
TempReal[1] = 300
TempReal[2] = 450
TempReal[3] = 600
Jeżeli poziom naszej zdolności wynosi 2, to PoziomZdolnosci = 2 a z tego wynika że TempReal[PoziomZdolnosci] = TempReal[2] = 450
Dalsze operacje są takie same jak we wcześniejszym przykładzie.

Jak zadawać obrażenia?
Można to robić na dwa sposoby:
[Obrazek: BNk5VoU.png]
Pierwszy sposób jest podobny do leczenia, tylko zamienia się znak plusa na minusa. Obrażenia tutaj są dokładne co do wprowadzonej wartości.
Drugi sposób to akcja Jednostka - Damage Target. Podane tutaj obrażenia są redukowane przez pancerz, odporność na magię i rodzaj pancerza. I zazwyczaj w taki sposób zadaje się obrażenia. Dokładnie też pokazuje się kto zadaje komu obrażenia.

Jak zadawać obszarowe obrażenia?
Również na dwa sposoby, z czego jeden jest kompletnie bezużyteczny. Mimo to pokażę go.
[Obrazek: in68zmn.png]
Rozdzieliłem oba przypadki. Mam nadzieję że widać w którym miejscu są rozdzielone.
Pierwszy przypadek to zastosowanie akcji Jednostka - Damage area. Jej wadą jest to że nie możemy przefiltrować jednostek którym chcemy zadać obrażenia. Ta akcja zadaje obrażenia WSZYSTKIM jednostkom w wyznaczonej przestrzeni.
W drugim przypadku natomiast, zapisujemy wszystkie jednostki w wyznaczonym obszarze do zmiennej typu grupa jednostek. Wybieramy każdą jednostkę po kolei (wybrana jednostka w grupie to "Picked Unit") i sprawdzamy, czy ta jednostka spełnia pewne wymagania. Jakie konkretnie? A takie jakie chcemy. Ja akurat nie chcę żeby obrażenia otrzymywały budynki, jednostki odporne na magię, martwe jednostki (nie mylić z nieumarłymi jednostkami, martwe jednostki to takie które zginęły, ale jeszcze nie minął ich czas śmierci i rozkładu) a także aby nie należały do sojuszników jednostki która rzuciła czar (w tym jednostki która rzuciła czar). Jeżeli jakaś jednostka spełnia te wymagania, to są zadawane jej obrażenia, każdej jednostce po kolei.

Jak dodać ogłuszenie, spowolnienie, wyciszenie do naszego czaru. Tworzenie jednostki Dummy.

Tutaj trzeba wrócić się do edytora obiektów. Będziemy potrzebowali jednostki Dummy i dodatkowej zdolności dla jednostki Dummy. Jednostka Dummy to taka jednostka, która jest tworzona podczas wykonywania się czaru aby wykonała jakieś zadanie. Pomaga twórcom czarów na różne sposoby, zazwyczaj są zmuszane do tego aby wykonywały dodatkowe działanie jak na przykład rzucenie ogłuszenia albo uciszenia. Można je również wykorzystać jako Efekt Specjalny. Czemu to robić? Bo czasami chcemy żeby nasz efekt się przesuwał podczas działania czaru. Samego efektu nie możemy przesunąć, ale jednostkę dummy która ma model naszego efektu już możemy. Aby efekt był większy lub mniejszy albo miał inny kolor, również wykorzystuje się jednostkę dummy, ponieważ nie można wykonać podobnych operacji na zwykłym efekcie.
W tym przypadku potrzebujemy jednostkę dummy aby rzuciła ogłuszenie, spowolnienie albo wyciszenie na nasz cel. 

Naszą jednostkę dummy możemy stworzyć z dowolnej innej jednostki. Trzeba zrobić z niej "pustą jednostkę".
-ustawiamy jej szybkość poruszania się na 0
-wyłączamy oba jej ataki, aby nie mogła atakować
-ustawiamy jej koszt w żywności na 0
-usuwamy wszystkie jej zdolności i dodajemy jej zdolność "Szarańcza".
Zdolność szarańcza sprawia, że jednostki nie da się zaznaczyć, nie widać jej paska zdrowia, jednostka ta jest również nieśmiertelna, inna jednostka nie może jej zaatakować w żaden sposób, a gracz nie ma kontroli nad nią podczas gry.
Ale możemy jej rozkazywać w za pomocą wyzwalaczy. Nie pokażę zrobionej tej jednostki w edytorze obiektów bo nie zmieści się na jednym obrazku :/
Jak już mamy naszą jednostkę dummy, potrzebujemy dla niej jakiejś zdolności która będzie ogłuszać, spowalniać albo wyciszać. W edytorze obiektów robimy kolejną zdolność w zależności od tego co obecnie potrzebujemy.
Dla ogłuszenia najlepiej wykorzystać Pocisk Burzy, dla spowolnienia najlepiej Spowolnienie czarodziejki, dla wyciszenia najlepiej Zagładę.
Czemu akurat te najlepiej? Bo wykorzystuje się je na jeden cel, przyda się to nawet gdy chcemy obszarowe ogłuszenie zrobić. 
Te zdolności muszą mieć obrażenia ustawione na zero
-czas działania na taki jaki chcemy
-przy spowolnieniu wartość spowolnienia na taką jaką chcemy
-koszt many na zero
-przerwa między użyciami na zero
-zasięg rzucania na bardzo duży, np: 99999
-usuwamy z nich wszelkie efekty, premie zostają albo robimy własne w zależności od potrzeb.
-poziom zdolności na 1
-odznaczamy zdolność bohatera.

Dla przykładu ja zrobię ogłuszenie:
[Obrazek: ImQcXsR.png]
Nazwałem tą zdolność tak aby kojarzyła się z tym co powinna robić. Czas działania ustawiłem na 2 czyli ogłuszenie będzie trwało 2 sekundy.
Teraz stwórzmy naszą jednostkę dummy w wyzwalaczu:
[Obrazek: NJnJ8cB.png]
Last created unit odnosi się do jednostki która została utworzona poprzez akcję Jednostka - Create Unit, co zostało zrobione w tym wyzwalaczu.
Upewniamy się że nasza jednostka dummy należy do nas (Owner of CastingUnit).
Następnie ją ukrywamy, aby nie była widoczna.(Jednostka - Hide unit)
Dodajemy jej expiration timer (Jednostka - Add expiration timer). Dzięki temu po sekundzie zginie i nasza mapa nie zaroi się od jednostek dummy przy każdym używaniu tej zdolności.
Dodajemy jej naszą zdolność która ogłusza(Jednostka - Add ability)
Jedna sekunda wystarczy jej aby rzucić zaklęcie. Wydajemy jej rozkaz rzucenia zaklęcia. Nasza zdolność została zrobiona na podstawie Pocisku Burzy, a więc wydajemy jej dokładnie taką komendę (Jednostka - Issue order targeting a unit)
Przy wyciszeniu i spowolnieniu wygląda to tak samo tylko dodajemy jednostce dummy inną zdolność i wydajemy inny rozkaz.

Jak sprawdzić czy drzewo jest drzewem
Gdybyśmy chcieli, aby nasz czar niszczyć drzewa wokół wskazanego punktu to możemy użyć takiej akcji:
[Obrazek: iR92TWA.png]
Jednak coś takiego wybiera wszystkie obiekty zniszczalne, nie tylko drzewa. Formując nasz czar w taki sposób zniszczymy nie tylko drzewa, ale i beczki, mosty i wszystko inne co będzie w zasięgu. Jak więc sprawdzić czy obiekt zniszczalny jest drzewem?
Potrzebujemy dodatkowej jednostki w edytorze obiektów. Musi to być jednostka zrobiona na podstawie chłopa. Może być nawet sam chłop jeżeli nie będzie potem edytowany. Ważne jest aby miał zdolność zbierania surowców, szarańczę i włączone ataki.
Następnie potrzebujemy wyzwalacz, który uruchomi się na początku mapy, gdzie stworzymy naszego chłopa. Będzie nam on potrzebny aby sprawdzić czy drzewo jest rzeczywiście drzewem.
[Obrazek: avxnFSH.png]
Musimy zapisać naszego chłopa w zmiennej typu jednostka i ukryć go żeby go nikt nie widział. Zauważcie że Chłop został stworzony dla gracza neutralnego, nie będzie więc należeć do żadnego gracza a zdolność szarańcza nie pozwoli go zabić.
Jak już mamy naszego chłopa to dzięki niemu możemy sprawdzić czy drzewo jest drzewem:
[Obrazek: Om4deB1.png]
Wydajemy naszemu chłopowi rozkaz zbierania drewna z drzewa. Jeżeli obiekt zniszczalny rzeczywiście jest drzewem, to chłop zacznie biec w kierunku drzewa z rozkazem "harvest". Sprawdzamy czy jego obecny rozkaz to "harvest". Jeżeli tak, to znaczy że obiekt zniszczalny jest drzewem i można go zniszczyć. Jeżeli nie, to nic się nie dzieje. Po tym sprawdzeniu rozkazujemy chłopowi się zatrzymać żeby nie zbierał drewna z drzewa.

Jak odczytywać kąty w grze?
Zrobiłem obrazek w paincie, który przedstawia wykres współrzędnych. Z pewnością znany Wam z lekcji matematyki. Wystarczy nałożyć go na naszą mapę aby zobaczyć w jakim kierunku jest jaki kąt.
[Obrazek: 39BENc4.png]
Tak więc rozkładają się kąty w warcrafcie. Ale zazwyczaj nie znamy kątów gdy chcemy coś zrobić. Na szczęście są na to sposoby:

[Obrazek: udvRj2R.png]
W zmiennej typu R zapisałem obecny kąt, w jakim jest zwrócona jednostka (Jednostka - Facing of Unit). Ten kąt za każdym razem może być inny, więc korzystając z takiej zmiennej będziemy zawsze "na czasie"

[Obrazek: OqL3N8x.png]
Tutaj zmienna TempReal przechowuje kąt od punktu TempPoint do punktu TempPoint2 (Angle between points). Kąt od TempPoint2 do TempPoint jest przeciwny. Jak to naprawdę wygląda:
[Obrazek: YCJoV3f.png]
Żeby zwiększać lub zmniejszać kąty wystarczy do pobranych wyżej wartości dodawać kąt jaki potrzebujemy np:
[Obrazek: w9of4YC.png]
Jeżeli Kąt od punktu TempPoint do punktu TempPoint2 wynosił 135 stropni, to po zwiększeniu go o 45 otrzymamy 180 stopni. Zwykła matematyka.

Jak sprawdzić dystans między punktami:
W taki sposób
[Obrazek: 1c9Igeh.png]
Jest to Distance between points.
Jeżeli chcemy znaleźć dystans między dwoma jednostkami to pobieramy ich aktualną pozycję (Position of Unit) i sprawdzamy dystans między punktami tak samo.

Czary, które dzieją się w czasie:
Tutaj już będziemy potrzebowali dwóch wyzwalaczy:
-pierwszy będzie się uruchamiać gdy jednostka rzuci czar
-drugi będzie pętlą uruchamianą poprzez pierwszy wyzwalacz

Najpierw dobrze jest się zastanowić jak długo będzie trwać czar i od czego zależeć, kiedy się zakończy.
Dla przykładu zmodyfikuję pierwszy czar z tego poradnika, leczenie natychmiastowe, na takie, które będzie leczyć przez 3 sekundy o jakąś mniejszą wartość co sekundę:
[Obrazek: oOJ5Op4.png]
[Obrazek: utsMnHN.png]
Zwróćcie uwagę że drugi wyzwalacz ma odznaczone "Początkowo włączone" To oznacza że po uruchomieniu mapy ten wyzwalacz jest wyłączony i nie działa, ale możemy go włączyć za pomocą innego wyzwalacza.
Pierwszy wyzwalacz jest początkowo włączony. Ustawiliśmy tam kto jest celem naszego zaklęcia, ile sekund ma trwać zaklęcie i ile zdrowia zostanie uleczone na sekundę. Potem włączamy drugi wyzwalacz.
Drugi wyzwalacz uruchamia się sam co sekundę (Wydarzenie Czas - Periodic Event)
Przy każdym uruchomieniu zmniejszamy jego czas trwania o jedną sekundę i leczymy naszą jednostkę.
Potem sprawdzamy, czy CzasTrwaniaCzaru osiągnął wartość zero. Jeżeli nie osiągnął tej wartości, to nic dodatkowego się nie dzieje i wyzwalacz znów się uruchamia po sekundzie. Gdy CzasTrwaniaCzasu osiągnie w końcu wartość zero, to wyzwalacz jest wyłączany. Ponowne użycie czaru włączy ponownie ten wyzwalacz i wszystko się powtórzy.

Ten przykład pokazał także w jaki sposób robić liczniki w wyzwalaczach. Najpierw ustawiamy licznik na jakąś wartość (CzasTrwaniaCzaru = 3)
Potem co sekundę odejmujemy od niego jeden (CzasTrwaniaCzaru = CzasTrwaniaCzaru - 1) I wreszcie gdy licznik spadnie do zera (Jeśli - Warunki > Real Comparision > CzasTrwaniaCzaru Mniejsze lub równe 0.00) to coś się stanie. Jeżeli wyzwalacz uruchamiałby się w jakimś innym czasie, na przykład co 0.5 sekundy, to od licznika odejmujemy 0.5 zamiast 1.

Jak zrobić odpychanie lub przyciąganie (knockback)

Knockback jest właściwie zależny od trzech rzeczy:
-maksymalnego dystansu jaki odepchnięta jednostka ma przebyć
-prędkości z jaką będzie odpychana
-czasu w jakim będzie odpychana
Te trzy rzeczy można powiązać ze wzorem z fizyki V=s/t czyli prędkość równa się droga podzielona przez czas. To jest dokładnie to samo co przy odepchnięciu. Ze wzoru widać że wystarczy posiadać dwie z tych wartości żeby wyliczyć trzecią.
Jak w takim razie odpychać? Musimy podzielić nasze odepchnięcie na bardzo dużo niewielkich kawałków. Wykorzystamy do tego szybką pętlę, która będzie przesuwać jednostkę o jakąś małą odległość. Całość będzie niezauważalna ludzkim okiem a nasze odepchnięcie będzie wyglądało całkiem "naturalnie".
Zróbmy więc czar obszarowy który będzie odpychać jednostki:
[Obrazek: X6e3h2W.png]
Wyzwalacz uruchamiający się podczas rzucania zaklęcia. Wybieramy sobie na jaki obszar ma działać nasze zaklęcie, Target point of ability being cast to punkt jaki wybraliśmy podczas rzucania zaklęcia, zauważcie że nie usunąłem go bo będzie nam jeszcze potrzebny, w TempGroup zapisałem wszystkie jednostki znajdujące się w obszarze działania wokół tego punktu. Dalej ustaliłem sobie że maksymalny dystans jaki przebędą odepchnięte jednostki wyniesie 600 i będą one przesuwane z prędkością 400 na sekundę. Całe przesunięcie wyniesie więc 1.5 sekundy. Na koniec uruchamiam wyzwalacz który będzie przesuwać jednostki:
[Obrazek: TZt61pt.png]
Wydarzenie Czas - Periodic Event musi wykonywać się bardzo szybko aby nie dało się zobaczyć tego przesunięcia gołym okiem. Najszybszy czas z jakiego powinno się korzystać to 0.03 sekundy, ja jednak wole 0.05 bo łatwiej robić na takiej liczbie obliczenia.
Co potem robimy:
Wybieramy wszystkie jednostki w naszej grupie. Musimy, bo jest to zaklęcie obszarowe i musi zadziałać na każdą jednostkę w grupe. Każdej wybranej jednostce pobieramy jej pozycję i sprawdzamy kąt od PunktuPoczątkowego (tutaj jest nam potrzebny ten punkt, dlatego go nie usunęliśmy) do pozycji naszej jednostki. Dzięki temu jednostka będzie odpychana, jakbyśmy sprawdzali odwrotnie, czyli od pozycji jednostki do PunktuPoczątkowego to jednostki byłyby przyciągane. Następnie formujemy nowy punkt (Point with polar offset) który jest pozycją naszej jednostki przesunięty o jakąś odległość (prędkość przesunięcia pomnożona przez 0.05, ponieważ nasza pętla wykonuje się co 0.05 sekundy, prędkość w czasie 0.05 sekundy  powinna się równać Prędkość na sekundę razy 0.05 i uzyskujemy prędkość na 0.05 sekundy) i pod jakim kątem ma nastąpić przesunięcie co wcześniej ustaliliśmy. Mając nasz nowy punkt przesuwamy jednostkę do tego punktu (Jednostka - Move unit (instantly)). Poza grupą zrobiliśmy licznik. Od całkowitego dystansu odejmujemy dystans, o jaki jednostki się przesunęły podczas tej 0.05 sekundy. A tym dystansem jest prędkość pomnożona przez 0.05.
Na koniec ustalamy kiedy czar ma się zakończyć. Wtedy, gdy nasz licznik dobije do zera. Dystans jest licznikiem, więc sprawdzamy czy dystans osiągnął zero. Jeżeli tak to usuwamy to co zalega w pamięci i wyłączamy wyzwalacz.

Akcja Jednostka - Move Unit (Instantly) przesuwa jednostkę natychmiast ale również anuluje wszystkie jej rozkazy i sprawia że podczas przesuwania nie można kontrolować tej jednostki.

Jak przesuwać jednostkę bez anulowania jej rozkazów:
Nie będę tworzyć tutaj nowego czaru, pokażę tylko sposób w jaki to zrobić. Będzie to wymagało custom scriptów.
Każdy punkt ma pewnie współrzędne na osi XY.
[Obrazek: pbIP0Xm.png]

TempPoint i TempPoint2 mają inne współrzędne. Jednak możemy zamienić tutaj akcję Jednostka - Move Unit na coś innego:
[Obrazek: 3KAglwT.png]
Ustawiamy jednostce nowe współrzędne ( SetUnitX, SetUnitY), ustawiamy jednostkę która ma otrzymać nowe współrzędne (udg_TempUnit) i pobieramy współrzędne X i Y z naszego nowego punktu (GetLocationX, GetLocationY). Dla każdej współrzędnej jest osobny custom script. Jednostka przesuwana w ten sposób będzie mogła nadal atakować, rzucać czary, nawet biec chociaż będzie spowolniona lub przyspieszona w zależności w jakim kierunku pobiegnie. Podczas takiego przesuwania kolizja jednostki nie działa, to znaczy że może być przesunięta w dowolne miejsce, nawet niedostępne dla normalnej jednostki (urwisko, rzeka).

Jak sprawić aby jednostki naziemne latały i jak zmieniać ich wysokość, tworzenie paraboli
Czasem chcielibyśmy aby nasza jednostka, poza odepchnięciem, została wystrzelona na chwilę w powietrze. Do tego posłuży nam się akcja
[Obrazek: MMBYO5K.png]
Jednak ta akcja działa wyłącznie na jednostki latające. Co zrobić aby móc zmienić wysokość jednostki naziemnej? Wystarczy dodaj i zabrać jej zdolność "Postać Kruka Burzy". Po takiej operacji nasza jednostka będzie mogła zmieniać wysokość przy pomocy podanej wyżej akcji.
[Obrazek: Hj2i9mL.png]
Jest to Jednostka - Add ability i Jednostka - Remove ability.

Parabole tworzymy korzystając z takiego wzoru:
4 * (MaxWysokość/MaxDystans) * (MaxDystans - PozostałyDystans) * (PozostałyDystans/MaxDystans)

Jest to bezpośrednio powiązany wzór z knockbackiem. MaxWysokość to maksymalna wysokość na jaką wzniesie się jednostka. MaxDystans to maksymalny dystans jaki wybraliśmy dla naszego przesunięcia. PozostałyDystans to dystans jaki pozostał do zakończenia się knockbacku.
Możemy użyć tego wzoru bez żadnego przesunięcia, jednak wartości MaxDystans i PozostałyDystans muszą się pojawić.
Jak wykorzystać ten wzór w praktyce? Przeróbmy nasz Knockback:
[Obrazek: c0y3Xs9.png]
Tutaj pojawiły się dwie nowe zmienne: MaxDystans który ma przyjąć początkową wartość Dystansu (nie zapominajmy że dystans jest licznikem) i wysokość. Reszta bez zmian.
[Obrazek: K3JxeoS.png]
Tutaj również niewiele się zmieniło. Sprawiliśmy że jednostka naziemna może latać (Postać Kruka burzy) i wyliczyliśmy parabolę z naszego wzoru. Potem zmieniliśmy wysokość jednostki na wartość paraboli. Reszta została bez zmian. Zauważcie że można tak samo zrobić bez przesunięcia:
[Obrazek: LnxAkaS.png]
Pierwszy wyzwalacz bez zmian, a tutaj usunęliśmy wszystko co przesuwało jednostkę. Teraz ten czar będzie wyrzucać jednostki w powietrze na chwilę zamiast je przesuwać.

Efekty błyskawic:

Zapewne zastanawialiście się jak zrobić taką błyskawicę jaką ma na przykład Palec śmierci, Spalenie Many, Wyssanie życia lub Podniebne Kajdany. Zobaczmy jak możemy dodać efekt specjalny do naszego czaru. Akcje błyskawic znajdują się w kategorii "Oświetlenie"
Zobaczmy najpierw jak stworzyć błyskawicę:
[Obrazek: HASvYVu.png]
Aby stworzyć błyskawicę potrzebujemy dwóch punktów: Źródła i celu. Tutaj też wybieramy w jaki sposób będzie wyglądać nasza błyskawica, tzn w jakim zaklęciu została pierwotnie użyta.
Jeżeli chcemy aby błyskawica była od samego początku naszego czaru to tworzymy ją w wyzwalaczu który jest uruchamiany jak ktoś rzuca zaklęcie, a w pętli tylko zmieniamy położenia.
Edytujmy teraz nasze odepchnięcie (wersja bez latania) aby każda jednostka podczas odpychania była połączona z punktem z jakiego rzuciliśmy zaklęcie
[Obrazek: FUMIyae.png]
Na początku musimy stworzyć błyskawicę dla każdej jednostki w grupie, a więc wybieramy te jednostki. Została dodana nowa zmienna typu C (Integer - Liczba całkowita) i dla każdej jednostki zwiększamy ją o 1. Dzięki temu wiemy ile jest jednostek w grupie. Dalej ustawiamy każdej jednostce jej własną wartość (custom value) na naszą liczbę, dzięki temu do każdej jednostki jest przypisany jej własny unikalny numer. Jest to konieczne ponieważ błyskawice też są tworzone dla każdej jednostki z osobna. Musimy je w pewien sposób rozróżniać która błyskawica należy do której jednostki. W ten sposób możemy zapisać nowo stworzoną błyskawicę do Zmiennej typu Błyskawica z tablicą i dać jej indeks Integera, czyli unikalnej liczby przypisanej do każdej jednostki. W ten sposób odnajdziemy błyskawice.
[Obrazek: ScuHoj2.png]
Tutaj niewiele się zmieniło. Odpychanie wygląda tak jak wcześniej. Dodaliśmy tylko kilka linijek odnośnie błyskawicy. Teraz zastanówmy się kiedy błyskawica ma zniknąć. Wtedy, kiedy czar się skończy, czyli jak dystans osiągnie zero. Moglibyśmy zrobić to w miejscu, gdzie wyzwalacz jest wyłączany, jednak wymagałoby to dodatkowej pętli przez wszystkie jednostki. Zamiast tego dodany został jeden warunek w grupie, sprawdzający czy czar już się kończy. Jest on sprawdzany dla każdej jednostki, a że czar kończy się dla wszystkich w jednym momencie to błyskawice znikną na raz. Ale gdy czar trwa, to przesuwamy błyskawicę w nowy punkt w jaki została przesunięta jednostka (Oświetlenie - Move lightning effect).
Dodam jeszcze że w taki sposób utworzone błyskawice nie mogą się przemieszczać w pionie, to jest nie możemy zmieniać jej wysokości.

Efekty błyskawic ze zmienną wysokością:
Będzie nam potrzebny do tego czar Palec śmierci i dwie jednostki dummy dla niego. Jedna jednostka będzie rzucać czar a druga będzie celem tego czaru. Czar zostanie specjalnie edytowany tak, aby jego efekt nigdy się nie kończył. W ten sposób możemy manipulować wysokościami jednostki rzucającej i celu aby zmieniać wysokość błyskawicy. Nie muszę wspominać że jednostki dummy muszą mieć szarańczę i być niewidzialne. Oto jak powinien wyglądać palec śmierci:
[Obrazek: ldLx2KH.png]
Aby wybrać inny rodzaj błyskawicy trzeba edytować Grafika - Efekty Błyskawic. Jak będziemy chcieli usunąć efekt błyskawicy to wystarczy usunąć obie jednostki dummy.

Zdolności pasywne:
Tworzenie umiejętności pasywnych wygląda nieco inaczej niż tworzenie umiejętności aktywnych, ponieważ nie ma tutaj wyzwalacza który uruchamia zdolność, wiąże umiejętność w edytorze obiektów z edytorem wyzwalaczy. Musimy więc to zrobić w inny sposób.
Wykorzystam ponownie leczenie, lecz teraz będzie to umiejętność pasywna, która leczy naszego bohatera co 10 sekund:
[Obrazek: vCJ8JJF.png]
Ten wyzwalacz uruchamia się gry jakaś jednostka nauczy się Aury Celności. Kiedy jednostka zwiększy poziom jakiejś zdolności to ten wyzwalacz również się uruchamia, dzięki temu możemy zrobić umiejętność pasywną zależną od poziomu.
[Obrazek: 1ZKPrAB.png]
W pętli nie ma nic skomplikowanego. Nie potrzebujemy licznika bo uleczenie ma się dziać co 10 sekund, nie ma potrzeby sprawdzać co sekundę czy czas już minął. Do zmiennej CastingUnit jest przypisana konkretna jednostka, a więc Pętla wie kogo ma leczyć.

To tyle na temat umiejętności pasywnych, nie miały one wielu tajemnic poza tą, w jaki sposób zrobić pierwszy wyzwalacz.


Na tym kończy się pierwsza część poradnika, niedługo pojawi się kolejna część w której wyjaśnię w jaki sposób robić czary MUI, czyli takie, gdzie wiele instancji czaru na raz może działać bez kolidowania z innymi instancjami.
Mam nadzieję że czegoś się nauczyliście z tego poradnika,
Pozdrawiam
Odpowiedz
#2
Pierwsza część poradnika dotycząca Single User Instanceability już niemalże ukończona. Napiszcie co jeszcze mógłbym pokazać takiego generalnego ze sposobów na różne przydatne rzeczy, może robicie jakiś czar i zastanawiacie się jak w jaki sposób coś wykonać. Trochę skończyły mi się już pomysły a nie wiem co jeszcze może sprawiać ludziom problem.
Następna część będzie dotyczyła tylko i wyłącznie sposobu w jaki tworzyć czary MUI no i jak je zrozumieć. Systemy to będzie to samo co jest już obecnie, ale zostanie dodana wiedza jak zrobić system z tego co obecnie mamy (połączenie MUI i wiedzy z pierwszej części poradnika)
Odpowiedz
#3
Axator, świetny poradnik :D Myślę, że teraz dużo mniej osób będzie miało problemy z czarami.
Odpowiedz
#4
Oczywiście o ile przebrną przez ten genialny i gigantyczny wręcz poradnik :)
Odpowiedz
#5
Dodałem na końcu informację jak zrobić umiejętność pasywną, na tym kończy się ten poradnik, czytajcie, uczcie się, komentujcie, oceniajcie :) I czekajcie na następny, niedługo się pojawi.
Odpowiedz
#6
A gdzie jest (Zycie of target unit) ?
Odpowiedz
#7
Zmienna typu R. To chyba pytanie do poradnika o zmiennych powinno być. Polecam go przeczytać :D
Odpowiedz
#8
A jak zwiększyć wielkość efektu oraz jak zrobić np. rysującą się gwiazdę. No i jak dodać po nawiasie + TempReal
Odpowiedz
#9
Żeby dodawać musisz wybrać aritmetic :P Żeby zwiększyć wielkość efektu chyba gdzieś pisałem musisz zrobić jednostkę, ustawić jej model na efekt jaki chcesz i powiększyć tą jednostkę. Rysująca się gwiazda lol. Użyj wyobraźni. Czary które dzieją się w czasie...
Odpowiedz
#10
A ten obszarowy nie działa bo efekt pojawia się na środku mapy
Odpowiedz
#11
Źle ustawiłeś punkt lub go usunałeś
Odpowiedz
#12
(06.08.2015, 14:45)Axator napisał(a): Źle ustawiłeś punkt lub go usunałeś

Zrobiłem tak jak tutaj "Set TempPoint = (Center of (Playable map area))" i na srodku mapy...
Odpowiedz
#13
Center of (Playable map area) to właśnie środek mapy. Czego innego się spodziewałeś? Zrób TempPoint = Target point of ability being cast
Odpowiedz
#14
A co zrobić żeby dummy nie było namierzalne ?
Odpowiedz
#15
Odpowiedzi na WSZYSTKIE Twoje dotychczasowe pytania są w poradniku. Przeczytaj
Odpowiedz
  


Skocz do:


Użytkownicy przeglądający ten wątek:
1 gości