Unity3d FPS Tutorial, czyli tworzymy własną grę FPS od podstaw z wykorzystaniem silnika Unity3d.

Temat: Regeneracja życia i energii. Animacja trafienia.

Spis treści

Jeżeli nie używałeś do tej pory Unity3d:

#0 – Podstawy Podstaw

FPS Tutorial:

#1 – Tworzenie nowego projektu i narzędzie terenu

#2 – Sterowanie postacią

#3 – Życie, pancerz i wytrzymałość postaci

#4 – Regeneracja życia i energii. Efekty trafienia

#5 – Kamera z bronią i strzelanie

#6 – Przeładowanie broni i amunicja

#7 – Zbieranie przedmiotów

#8 – Druga broń

#9 – Rzut granatem i seria z karabinu

#10 – Celowanie i dziury po kulach

#11 – Przeciwnik z prostym AI, sztuczna inteligencja

#12 – Animacja postaci przeciwnika. Animator

#13 – Menu główne gry. GUI

#14 – Ostatnie szlify i budujemy projekt

Teoria

W poprzedniej części stworzyliśmy sobie paski życia, pancerza i energii. Życia ubywa po trafieniu, energii po biegu. Ale żadna z tych wartości się nie regeneruje. Również, w grach FPS, gdy zostaniemy trafieni, towarzyszy temu błyśnięcie ekranu na czerwono. Dodamy sobie teraz te efekty.

Regeneracja życia i energii.

Jak chcemy to zrobić? Wyjaśnię to na przykładzie paska zdrowia, a pasek staminy zostanie zrobiony analogicznie. Gdy zostaniemy trafieni, ustawiony zostanie licznik. Licznik zliczamy w dół, aż do zera. Gdy osiągnie tą wartość, znaczy, że możemy regenerować pasek. W grach, regeneracja życia, nie odbywa się natychmiast po trafieniu, a gdy chwilę przesiedzimy w bezpiecznym miejscu.  Taki licznik nam to zapewni. Następny krok to regeneracja paska, aż do maksymalnego poziomu życia. Tym razem, dzięki licznikowi, nie musimy dodatkowymi funkcjami przerywać regeneracji życia, gdybyśmy zostali trafieni, w czasie tej regeneracji.

Oczywiście, przyda nam się parę zmiennych pomocniczych:

Będą sprawdzały, czy nasza postać może się już leczyć lub regenerować wytrzymałość.

Teraz, czas przerobić trochę funkcję biegania i obrażeń, tak by nastawiać licznik. W funkcji takeHit dopisujemy jednego ifa:

Nie chcemy aktywować regeneracji, gdy stracimy pancerz. Jednak odebranie życia jest w dwóch miejscach. Dlatego, żeby nie dublować kodu, na koniec funkcji sprawdzamy, czy mamy mniej życia niż max, co oznacza, że powinniśmy się regenerować.

Czas poprawić bieganie:

Znów tylko ustawiamy licznik, gdy nasza postać biegnie. Niestety, ustawiamy to przy każdej klatce, ale będzie to bardziej optymalne, niż dodanie kolejnego ifa.

Teraz ustalmy zerowanie liczników. Zrobimy to, dodając do funkcji Update kilka linijek:

Jeżeli licznik został ustawiony, to co sekundę zmniejszamy go o 1. Czyli gdy w naszych przypadkach, ustaliliśmy wartość licznika na 5, oznacza to, że po 5 sekundach zacznie się regenerowanie.

Teraz zajmijmy się samym regenerowaniem, a załatwią to kolejne linijki w funkcji Update:

Gdy nasze liczniki są równe, bądź mniejsze od 0 (co kluczowe, bo przy zmniejszaniu ich, możemy uzyskać np. wartość -0.000000001. Wtedy samo przyrównanie do 0, nie uchwyciłoby takiego wyniku. Drugi warunek, to oczywiście sprawdzenie czy jest co regenerować.

Wewnątrz wywołujemy funkcję regenerate (napiszemy ją za chwilę), podając dwa parametry. Istotne tutaj jest słówko ref. Oznacza referencję.

Dodatkowa Wiedza
Referencja

Jest to zmienna, która zawiera informację, o położeniu innej zmiennej. Mówiąc obrazowo. Jeżeli podamy funkcji jako parametr zmienną „a”, o wartości 2, to wewnątrz funkcji mamy tylko wartość 2. Jednak, gdy podamy zmienną „a”, jako referencję, to wewnątrz funkcji, możemy zmodyfikować tą zmienną i będzie to widoczne na zewnątrz tej funkcji.


Więc po co nam ta referencja? Chcemy naszą funkcję uczynić uniwersalną. Gdybyśmy podali jej tylko currentHealth, funkcja wiedziała by tylko, ile ona wynosi, ale nie wiedziałaby, na jakiej zmiennej ma operować, co uczyniłoby ją bezużyteczną.

Zobaczmy samą funkcję:

Magii tu nie ma. Dodajemy tylko pewien procent wartości maksymalnej do zmiennej currentStat, która jest parametrem – właśnie naszą referencją. Teraz jasno widać, po co była referencja. Gdybyśmy podawali tylko wartość, musielibyśmy mieć jeszcze 3 parametr, określający, którą statystykę mamy regenerować. Referencja, ściąga z nas ten obowiązek, a kod jest bardziej przejrzysty i czytelny. Funkcję Clamp już znamy.

Warto tutaj odnotować, że jeśli chcemy, żeby funkcja przyjmowała zmienną referencyjną, przy parametrze musi znaleźć się słówko ref.

W sumie tyle. Odpal swój program, pobiegaj i zobacz jak działa regeneracja. Jeśli pasek napełnia się za szybko lub za wolno, pobaw się procentem w funkcji regenerate.

Efekt obrażeń

UWAGA dla Unity3d v.5.0 i wyższych!

W Unity 5.0 poniższa metoda, może nie działać z powodu wprowadzonych w silniku zmian. W takim przypadku, warto zastosować metodę z mojego innego poradnika: Zmiana Opacity za pomocą kodu.

Najpierw musimy poczynić małe przygotowania. Potrzebujemy tekstury. U mnie jest prosty kwadrat 2x2px w kolorze czerwonym. Można to szybko zrobić nawet w paincie. Teraz tworzymy sobie nowy GUITexture [GameObject -> Create Other -> GUITexture]. Zaznaczamy go i dodajemy naszą teksturę w polu Texture.

Efekt obrażeń
Efekt obrażeń

Teraz, otwieramy sobie okno Animacji [Window -> Animation]. W nowym oknie, klikamy na Add Curve i zapisujemy sobie jakoś naszą animację. Np. HitAnimation. Teraz powinno pojawić się nam małe okienko. Rozwijamy GUITexture i klikamy w plus przy color.

Dodanie krzywej
Dodanie krzywej

Teraz klikamy w strzałkę przy nazwie, nowej pozycji, aby ją rozwinąć. Wybieramy z niej Color.a (czyli alpha, czyli przeźroczystość). Na samym dole wybieramy sobie tryb krzywych (Curves)

Edytujemy krzywą przeźroczystości
Edytujemy krzywą przeźroczystości

Teraz po prawej, powinieneś zobaczyć krzywą reprezentującą kanał alpha naszej tekstury. Kółkiem myszy możesz przybliżać lub oddalać ekran. Klikając w kółka możesz je przemieszczać. A gdy pojawi się kursor w kształcie dwóch strzałek skierowanych w przeciwne strony, możesz przesuwać cały wykres. Aby dodać klatkę kluczową, klikasz prawym i wybierasz Add Key.

Teraz należy ustawić krzywą tak by dała fajny efekt. Ja stworzyłem coś takiego:

Krzywa kanału alpha
Krzywa kanału alpha

Co nam daje taki wykres? Na początku animacji, tekstura jest mało widoczna, ale szybko skacze do wartości ok. 0.7, aby potem stopniowo znów zniknąć. Całość trwa 0.15 sekundy. Ustaw sobie krzywą jak chcesz, zapamiętać musisz tylko ile trwa.

Teraz wracamy na chwilę do MonoDevelop i dodajemy jedną zmienną:

Gdy już to zrobiliśmy, przechodzimy do Unity i kończymy dzieło. Najpierw z naszej tekstury robimy prefabrykant. (Np. przeciągając z okna Chierarchy do okna Project). Teraz usuwamy GUITexture ze sceny (okno Chierarchy), a następnie utworzony prefabrykant, dodajemy do naszego skryptu, jako zmienna hitTexture:

Dodajemy teksturę
Dodajemy teksturę

Zostało już tylko wykonać animację w skrypcie. Wracamy do MonoDevelop i na samym początku funkcji takeHit() dodajemy:

Kod jest bardzo prosty. Funkcja Destroy jest znana. Usuwa wskazany obiekt, po pewnym czasie, oczywiście czas jaki musisz podać, to czas trwania twojej animacji. A obiekt, jaki chcemy wtedy usunąć, to instancja naszej tekstury z animacją.

Zapisz skrypt, przejdź do Unity i przetestuj wszystko.

Małe porządki

Na tym etapie, potworzyła nam się masa nowych plików, dlatego polecam uporządkować foldery z assetami. Mogę polecić coś takiego:

  • Models – Na przyszłe modele 3D
  • Textures – Na textrury
    • GUI – Na tekstury do GUI
  • Scripts – Na skrypty
  • Animations – Na animacje
  • Prefabs – Na prefabrykanty
  • Materials – Na przyszłe materiały

Tereny i sceny trzymam w głównym folderze.

 Poprzednia część <- #3 – Życie, pancerz i wytrzymałość postaci

Następna część -> #5 – Kamera z bronią i strzelanie

 

  • Pingback: Unity3d FPS Tutorial #6 - Przeładowanie broni i amunicja | mWin GameDev()

  • Firgus

    Hej, mam problem, nie mogę znaleźć tego ,,Create Other -> GUITexture”.

    • Prawdopodobnie masz Unity w wersji 4.6 lub nowszej. Przez co musisz zastosować inną technikę. Mianowicie:
      – Tworzysz pusty game object
      – Dodajesz komponent [Component -> Rendering -> GUITexture]

    • kuba

      public GUITexture hitTexture;
      gdzie to trzeba wpisać
      PlayerStats.cs

    • Wewnątrz klasy, ale nie w funkcji.
      public class PlayerStats : MonoBechaviour
      {
      // tutaj!

      void Start() {
      //jakis tam inny kod
      }

      // kolejne funkcje
      }

  • Pingback: Unity3d FPS Tutorial #1 - Tworzymy nowy projekt i przygotowujemy teren | mWin GameDev()

  • Beniamin Ogrodowski

    MissingComponentException: There is no ‚CharacterController’ attached to the „FirstPersonCharacter” game object, but a script is trying to access it. You probably need to add a CharacterController to the game object „FirstPersonCharacter”. Or your script needs to check if the component is attached before using it. PlayerStats.FixedUpdate () (at Assets/Script/PlayerStats.cs:95)]

    POMOCY!!!!!!

    • Obiektowi do którego się odwołujesz brakuje komponentu CharacterController. Powinien być domyślnie dodany do FirstPersonControllera. Jeśli go nie ma, możesz go dodać z menu: [Component -> Physics -> Character Controller]

  • Mag Zza Biedronki

    hej mam mały problem otóż wszystko zrobiłem jak należy a efekt uderzenia się nie wyświetla i mam w chierarchy clony tego prefaba

    • Możesz spróbować zamienić:
      Destroy(Instantiate(hitTexture), 0.15f);

      Na:
      GameObject clone = Instantiate(hitTexture);
      Destroy(clone, 0.15f);

    • Mag Zza Biedronki

      tia tera mi wyskakuje taki error
      Cannot implicitly convert type UnityEngine.GUITexture' to UnityEngine.GameObject’

      a nieważne co zrobie to ten czerwony ekran się nie pojawia jak odejmuję sobie życie

    • Zamiast GameObject będzie GuiTexture, zły typ zmiennej podałem ;)

    • Mag Zza Biedronki

      kurde sory że zawracam ci głowę ale clony się nie usuwają a efekt trafienia nie pojawia załączam kilka screenów które mogą pomóc

  • Tajniak

    Ehhh, wszystko zrobiłem tak jak należy (kilka razy przeanalizował kod) i coś mi nie cykło. Mam wątpliwości, czy dobrze mi się ta animacja zapisała w obiekcie… Znaczy, życie odejmuje, ale nie ma efektu.
    Dodatkowo zauważyłem jeszcze jeden problemu – gdy się biega i skończy się stamina, nie zacznie się ładować póki nie puści się shifta.
    Używam najnowszego Unity 5.0.4, masz może jakiś pomysł, jak to naprawić?
    Dzięki za poradnik ;)

    • Aby rozwiązać problem z bieganiem, trzeba by było kod:
      canRegenerate = 5.0f;
      przenieść do oddzielnego elseifa, który wyglądałby tak samo, tylko ostatni warunek by się różnił, bo zamiast stamina > 0, byłoby stamina <= 0.

      Jeżeli nie pojawia się w ogóle tekstura to błąd byłby raczej z wyświetlaniem, ale w sumie ciężko mi zgadywać czemu. Możesz sprawdzić Debug.Log czy kod odpowiedzialny za wyświetlanie tekstury działa. Ewentualnie zmieniłeś w animacji kanał alfa na 0 i tekstura od początku jest niewidoczna. Ale to tylko przypuszczenia.

  • patrix972

    Witam , mam problem otóż zrobiłem wszystko jak jest napisane i wyskakuje mi błąd „The type or namespace name `GuiTexture’ could not be found. Are you missing a using directive or an assembly reference?”

    • Nie ma typu GuiTexture, jest tylko GUITexture. Wielkość liter ma znaczenie.

    • patrix972

      Próbowałem i tak , jednak po zmianie wielkości liter pojawia się kolejny błąd : „Cannot implicitly convert type UnityEngine.Object' to UnityEngine.GUITexture’. An explicit conversion exists (are you missing a cast?)”

    • Przydałaby się linijka gdzie masz błąd – wraz z deklaracjami zmiennych, które w tej linijce się pojawiają. Bo oznacza on tyle, że oczekujesz od skryptu stworzyć zmienną GUITexture, a podajesz jej Object. I tutaj nie poradzę nic, nie wiedząc co, gdzie próbujesz przypisać.

    • patrix972

      chodzi dokładnie o linijki: GUITexture clone = Instantiate(hitTexture);Destroy(clone, 0.15f); ( dotyczy efektu obrażeń)

    • Linijka powinna wyglądać tak: Destroy(Instantiate(hitTexture).gameObject, 0.15f);

    • patrix972

      Po wpisaniu tej linijki powstają 3 błędy : 1) UnityEngine.Object’ does not contain a definition for gameObject' and no extension method gameObject’ of type UnityEngine.Object' could be found 2)The best overloaded method match for UnityEngine.Object.Destroy(UnityEngine.Object, float)’ has some invalid arguments 3) Argument #1' cannot convert object’ expression to type `UnityEngine.Object’

    • A czy zdefiniowałeś hitTexture i czy ustawiłeś mu wartość z poziomu Unity?

    • patrix972

      Zrobiłem wszystko tak jak było opisane w poradniku.

    • U mnie ustawienia są takie jak na załączonym obrazku.

    • patrix972

      dobrze , już wszystko działa , wielkie dzięki za pomoc :)

  • Skopiowałem z lekcji 3 cały kod „PlayerStats.cs” i mam trzy problemy:
    1. Po wciśnięciu „P” nie tracę pancerza.
    2. Bieganie nie zmniejsza paska staminy, tym samym o sprawdzeniu jego regeneracji mowy być nie może.
    3. W assecie „Player Stats” gracza nie mogę dodać prefabrykata „hit” jaki utworzyłem na zasadzie: pusty obiekt (parrent), a do tego child (grafika „hit”). Żadnych prefabrykatów nie wyszukuje mi okienko „Hit Texture” chociaż mam ich sporo. Jedynie co chcę przyjąć to samego gracza.

    Posługuje się Przedostatnią wersją Unity, czyli 4.6.2f1

    • Zacznę tak śmiesznie bo od końca:

      3) Mój obiekt HitFader to prefabrykant tekstury z animacją. Czyli nie ma tam pustego gameObjectu. Przez to nie chce Ci go przyjąć, bo uważa go za GameObject, a nie za obiekt typu GUITexture. Musi być sama tekstura. Bez nadrzędnego obiektu.
      1 i 2) Prawdopodobnie wynikają z tego samego błędu. Nie ma żadnych errorów czy warningów? (upewnij się, że w konsoli włączna jest opcja wyświetlania tego typu powiadomień). Jeżeli nie… Mógłby być w zły sposób dodany skrypt, ale skoro paski się wyświetlają to raczej nie to. Jeżeli kopiowałeś fragmentami, to jest opcja, że części skryptów są w złych miejscach. Możesz podesłać link do skryptu gdzieś zamieszczonego (kopiowanie go w całości do komentarza tylko rozwali stronę, a i tak nie będzie nic widać). Dodaj skrypt np. tu: http://wklej.to/ i podeślij link.

      Odnośnie kamery, jeśli nowa kamera, jest w miejscu domyślnej, nie powinno to robić różnicy, aczkolwiek raczej usuwa się tą domyślną kamerę, zostawiając tą w obiekcie.

  • Należy stworzyć obiekt typu GUITexture, co u Ciebie powinno działać, skoro pracujesz w 4.6, bo na tej wersji stworzony był tutorial.

    Aby widzieć wykres, musisz na dole okienka wybrać Curvers.

    Wstaw sobie Debug.Log w momencie kliknięcia P i w kilku miejscach funkcji takeHit i zobacz gdzie kod idzie nie tam gdzie trzeba, bo nie widzę co może być nie tak.

    • Za dużo tutaj niewiadomych dla mnie jest :) Widocznie, gdzieś po drodze coś przeoczyłem, bo zbyt mgliście dla mnie mówisz. Debug jaki znam, to tylko ten w „Inspectorze” po zmianie z „Normal” na „Debug”. A to wstawienie sobie Debug.Loga w moemncie kliknięcia P i cała reszta zdania, to czarna magia :)

      Zrobię pierw tak, że pierw sobie pospisuje różne przydatne rzeczy na kartce, a potem przerobię od nowa Twój kurs. Powiedz mi tylko czy na wersji 5.0.1 (najnowszej) kurs można śmiało przerabiać, czy jednak przerabiać go na wersji 5.0?

    • Najlepiej przerabiać go na wersji 4.6 bo pod nią był pisany ;) Przy nowej wersji działa również, ale czasami ludzie zgłaszają pewne problemy i dlatego przy niektórych częściach są adnotacje do wersji 5.0

      Funkcja Debug,Log(cos); Pozwala wyświetlić w konsoli wiadomość. Jeśli na początku funkcji odbierającej życie, wpiszesz sobie: Debug.Log(„start”); I po naciśnięciu P w konsoli pojawi się „start”, znaczy że skrypt doszedł do tego miejsca, a problem leży gdzieś dalej.

  • Guest

    Witam.. Mam problem przy HitFaderze. O to ostrzeżenia które się pokazują:

    Assets/Scripts/PlayerStats.cs(68,49): error CS1061: Type UnityEngine.Object' does not contain a definition for gameObject’ and no extension method gameObject' of type UnityEngine.Object’ could be found (are you missing a using directive or an assembly reference?)

    Assets/Scripts/PlayerStats.cs(68,17): error CS1502: The best overloaded method match for UnityEngine.Object.Destroy(UnityEngine.Object, float)' has some invalid arguments

    Assets/Scripts/PlayerStats.cs(68,17): error CS1503: Argument #1′ cannot convert object' expression to type UnityEngine.Object’

  • Paweł Jamroziak

    Witam, miałem problem z tą linijką:

    Destroy(Instantiate(hitTexture).gameObject, 0.15f);

    Skrypt skompilował się dopiero po usunięciu .gameObject .
    Po uruchomieniu, gdy zadaje sobie obrażenia pojawia mi się na środku kamery średniej wielkości czerwony prostokąt, czy taki efekt miałem uzyskać?

    • Przy dobrych ustawieniach tekstury, prostokąt powinien zająć cały ekran.

  • Wojtek Baryła

    Witam, mam problem,niby wszystko zrobiłem dobrze jak z tutorialem i jak kliknę P to pojawia się ten HitFader i zaraz zostaje niszczony ale żadna textura na hudzie się nie pojawia (Nie wiedziałem gdzie w 5.0 jest GUITexture więc zrobiłem Empty Object i dodałem do niego component GUITexture)

    • To zrobiłeś dobrze, bo od wersji 4.6 tak ten obiekt został zastąpiony.
      Jeżeli dodałeś animację zanikania, to mogła ona być tak ustawiona, że jest ledwo widoczna, albo kompletnie niewidoczna. Druga opcja, że niszczysz teksturę, zanim oko zdąży ją zarejestrować, czyli masz za mały czas w Destroy.
      Ostatni wariant, że tekstura pojawia się w złym miejscu.
      Żeby to sprawdzić, zakomentuj linijkę usuwającą teksturę i w okienku Scene zobacz gdzie ona się pojawia i jak wygląda.

    • Wojtek Baryła

      jak zakomentuje Destroy(Instantiate(hitTexture).gameObject, 0.15f); to wtedy w ogóle nie pojawia się ta textura

    • Bo w środku jest kawałek kodu, który ją tworzy. Musisz sobie je rozdzielić:
      GameObject hitFader = Instantiate(hitTexture).gameObject;
      //Destroy(hitFader, 0.15f);

    • Wojtek Baryła

      OK, sprawdziłem, ta textura towrzy się na 0,0,0

    • Bardziej istotne jest to, czy gdy się tworzy to zwyczajnie ją widzisz. Możesz ją do testu podmienić na jakąś niezanikającą teksturę.
      Lokalizacja tego skryptu nie powinna mieć znaczenia.

    • Wojtek Baryła

      Podmieniłem na taką i nie pojawia się nawet jak ją przemieściłem przed kamerę. Nie wiem czy to istotne ale jak się ta textura tworzy to ona jest wolna nie jest childem niczego

    • Wojtek Baryła

      A i jeszcze, ja dodaje te skrypty do FPSControler. Dobrze robię? Bo mam jeszcze FirstPersonCharacter który jest childem fpscontrolera i do tego firstpersoncharactera jest dodana camera

  • Kod jest za prosty żeby coś w nim nie działało. Powinna być luzem. Zakładam, że błędne są ustawienia tekstury, teraz zauważyłem, że na obrazku we wpisie są niepoprawne ustawienia. Już to zaktualizowałem, możesz sobie porównać. (Chodzi głównie o zmienną Pixel Inset).

    • Wojtek Baryła

      Ok, zmieniłem tak jak na obrazku, ale dalej nie działa a ta textura respi się gdzieś pod mapą na 0,0,0

    • U mnie tworząca się tekstura, ma dokładnie takie same ustawienia jak na podanym obrazku, czyli Position(0.5, 0.5, 0)
      W ogóle obiekt tego typu powinien się pojawiać przed kamerą, niezależnie od tego gdzie jest w okienku Scene. Utwórz sobie taki kwadrat i pogmeraj w ustawieniach bo ona na 100% gdzieś tam jest, ale może być przesunięta, za mała, albo przeźroczysta, przez co jej nie widzisz.

    • Wojtek Baryła

      Czy to że ta textura hitfadder ma mieć 2px na 2px to jest błąd czy tak ma być?

    • Tak ma być, tylko ma być też rozciągnięta na cały ekran.

    • Wojtek Baryła

      Nie wiem ale jeżeli mógłbyś to mogę ci podesłać mój projekt i jeżeli będziesz miał czas to możesz zerknąć?

    • Mozesz mi wyslac na maila.

  • Przemysław Kozieł

    Mam Unity 5.0.1 robię dokładnie wg poradnika ale dalej nie widzę tego obiektu(chodzi tutaj o hitFader) przed sobą wszystko ustawione tak jak tutaj ale mimo to dalej go nie widać. W czym może być jeszcze problem? W kodzie błędu nie ma na tyle razy co go sprawdzałem. Sprawdzałem obiekt się dodaje i usuwa, pozycja zawsze 0.5 0.5 0 tak jak tutaj na screenach.

    • Jal wszystko jest na miejscu to ciezko mi powiedziec. Musialbym zobaczyc projekt. Mozesz mi go wyslac na maila w wolnej chwili zobacze o co chodzi.

    • Przemysław Kozieł

      Ok super, to zaraz to ogarnę ;) z góry dzięki ;)

  • Kuba Rumin

    Zamiast GUITexture utworzyłem Empty Game object i dodałem do niego komponent guitexture, do tego dodałem tą teksturkę 2×2 zrobiłem animacje, wszystkie kody wpisane i teraz wywala mi błąd:
    ‚HitFader’ AnimationEvent has no function name specified!

    • Może być tak, że:
      1) HitFader się nie pojawia (Sprawdź okno Hierarchy)
      2) Może się pojawia, ale animację znikania ustawiłeś tak, że znika zanim będzie widoczony
      3) Może się pojawiać po za ekranem, albo jako tak mały kwadrat, że go nie zauważasz.

  • Justyna Brylok

    Witam,
    mam problem. mianowicie, jeśli ustawie kamerę gdzieś na mój świat, to rzeczywiście mój hitfader działa ładnie. jednak jeśli odpalę grę z pozycji gracza, tego efektu nie widać.

    • Czy jest opcja, że na scenie są dwie kamery i skrypt jest przypisany nie do tej co trzeba?

    • Justyna Brylok

      nie. kamera jest tylko i wylacznie przy FPS controller

    • Czy mogę zobaczyć kod i ewentualnie screeny efektu? (Sorki, za wolną odpowiedź).

    • Justyna Brylok

      Nic nie szkodzi. Zostawiłam to póki co. Ale jest coś co bardziej mnie gryzie :D jeśli pozwolisz, zapytam o to drugie.
      „UnassignedReferenceException: The variable ammoText of Shooting has not been assigned.”

      Wg, Twoich rad w tutorialu stworzyłam 2xGUIText (kratka 1 :D ), które jak zrozumiałam powinnam móc sobie uzupełnić w zmiennych (kratka 2). Jednak nie potrafię. Ani nie mogę ich poprostu przerzucić, ani wybrać z listy. Dlaczemu? Jak tego dokonać?

    • Wyskakuje jakiś błąd w momencie próby dodania? Bo ten podany rozumiem, że pojawia się przy próbie odpalenia gry i wynika z tego, że oba obiekty nie były dodane.

      Jeżeli nie ma konkretnego błędu przy próbie dodania, czy mogę jeszcze zobaczyć jak wygląda, któryś z obiektów?

    • Justyna Brylok

      Tak, ten który podałam wcześniej pojawia się gdy odpalę grę. Przy dodawaniu obiektu kursor zmienia się tylko w znak zakazu, nie wyświetla nie żaden błąd.

    • Błąd wynika z tego, że ten obiekt nie jest GUITextem, tylko obiektem UI.
      Poprawna metoda stworzenia obiektu GUIText w Unity 5.0, to:
      1) Tworzymy pusty obiekt gry (Empty GameObject)
      2) Dodajemy mu komponent GUIText: Component -> GUI -> GUIText
      Nie pamiętam czy druga opcja jest dokładnie GUI, ale to jedna z ostatnich opcji. :)

    • Justyna Brylok

      Byłam święcie przekonana, że to jedno i to samo. Wielkie dzieki <3

  • Michał Rewers

    cos się popsulo. Nie mogę dodac zadnego własnego skryptu( ale inne typu character controller tak). Pisze mi Cant add script. This script is an editor scrpit.

    • DjCoraxa

      Przenieś skrypty z folderu Editor :)

  • Krystian Kolka

    Nie za bardzo wiem jak dodać linijkę Destroy(Instantiate(hitTexture).gameObject, 0.15f);

    • Dodajemy ją na sam początek funkcji takeHit, więc powinieneś mieć coś takiego:

      void takeHit(float demage)
      {
      Destroy(Instantiate(hitTexture).gameObject, 0.15f);
      //Tutaj reszta kodu z tej funkcji, podana w tutorialu
      }

    • Krystian Kolka

      Dzięki wielkie ! Jesteś wielki !!!!

  • Fores

    Siemka, jak zrobić ten efekt uderzenia w najnowszym unity?? Robię wszystko po kolei według poradnika i cały czas mi się to nie chce wyświetlić??

    • Postaram się sprawdzić co jest nie tak, względem najnowszej wersji i dać jakoś znać. W tej chwili niestety nie potrafię odpowiedzieć na to pytanie.

  • Matix

    u mnie w ogole nie widac zeby cokolwiek sie dzialo po wykonaniu akcji… zrobilem wszystko krok po kroku bardzo dokladnie a nadal nie dziala…

    • Prawdopodobnie korzystasz z nowego Unity (wersja 5), kiedy tutorial był pisany pod wersję 4.6, zatem fragment z animacją trafienia, zwyczajnie może nie działać. Na tą chwilę nie dysponuję poradą, która mogłaby go rozwiązać.

    • K11

      Opcjonalnie możesz pobrać asset wykonany gotowej broni i wszystko będzie ci działać.
      Stronka armedUnity polecam darmowy KIT0.1.

  • Pan Diaxik

    Dodałem do skryptu funkcję regenerate skopiowaną z tego kursu. Gra zachowuje się tak, jak wcześniej, czyli nie ma regeneracji.

    • A dodałeś wywołanie tej funkcji oraz wszystkie zmienne, których ona używa?

    • Pan Diaxik

      Ni zauważyłem tych poleceń, które trzeba dodać do Update. Zaraz sprawdzę czy to w tym problem.

  • Adrian Piecek

    Mam wersję 5.3.4, i nie pojawia się u mnie [Create Other] nie pojawia się w zakładce GameObject, podejrzewam iż ma to związek z wersją, lecz pisaliście wyżej że ten sposób działa w wersjach 5

    • Poradnik ma już swoje lata, był aktualizowany, ale Unity też jest aktualizowane, stąd starsze informację. Pracuje obecnie nad nowym kursem od podstaw, bo ten jest już za stary, żeby go aktualizować.

      Aby rozwiązać Twój problem. GUIText robi się teraz tak:
      Tworzysz pusty GameObject: GameObject -> Create Empty
      Dodajesz mu komponent GUITexture:
      Component -> Rendering -> GUIText