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

Temat: Jak dodać postaci pasek życia, pancerza i wytrzymałości

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

Skończyliśmy póki co etap klikania, a bierzemy się za pierwsze skrypty. Na początek, zaczniemy od prostej rzeczy. Najczęściej w grach FPS postać charakteryzują trzy atrybuty, czasami widoczne na ekranie. Punkty życia – obecnie przy modzie na samoodnawialne punkty życia, paska, ani konkretnej liczby punktów życia, nie ma na ekranie. My, póki co wyświetlimy pasek życia, aby dobrze wszystko widzieć. Druga rzecz to pancerz, który sam się nie odnawia i oczywiście tracimy go, zanim stracimy punkty życia. Ostatnia sprawa to wytrzymałość. Ona często też jest ukryta, ale jej efekt bardzo widoczny. Np. dłuższy sprint, sprawia, że postać się męczy i przestaje biec.

HUD w grze Far Cry
HUD w grze Far Cry

My, będziemy celować  w wygląd, zbliżony do tego z gry Far Cry. Oczywiście, jakość graficzna nie stanie na takim poziomie, bo to nie kurs grafiki. :)

Przygotowanie

Zanim weźmiemy się za pisanie kodu, musimy sobie przygotować tekstury dla naszych pasków. Mogą to być małe obrazki w jednolitym kolorze, bądź tekstury. Ja stworzyłem sobie 3 prostokąty 10x20px, w kolorze czerwonym (#bd2515), żółtym(#f5d91c) i niebieskim(#1e3ac7). Nazwałem je kolejno: hp, armour i stamina. Dodałem im filtr szumu, aby uzyskać ciekawszy efekt tekstury. Teraz wszystkie pliki importujemy do projektu, przeciągając myszką. Dla porządku wcześniej tworzymy folder „Textures”, gdzie będziemy trzymać wszystkie pliki tekstur, tam też wrzucamy nasze obrazki.

Wreszcie, możemy faktycznie przejść do kodowania. W folderze „Scripts” tworzymy nowy skrypt C#. W tym celu, klikamy prawym klawiszem myszy w obszarze panelu Project i wybieramy: Create -> C# Script. Nazywamy skrypt: PlayerStats.cs. Skrypt dołączamy od razu do First Person Controllera, przeciągając go na niego.

Wchodzimy w edycję skryptu, klikając na niego dwukrotnie.

Wyświetlenie statystyk

Aby wyświetlić statystyki, przede wszystkim, musimy posiadać informację, jaki jest obecny stan atrybutu, oraz jaka jest wartość maksymalna. Dlatego zaczynamy od definicji zmiennych:

Aby wyświetlić tekstury współczynników, potrzebujemy również w naszym skrypcie tekstur:

Teraz wracamy do Unity i przeciągamy tekstury na odpowiednie miejsca:

Ustawienie tekstur dla skryptu
Ustawienie tekstur dla skryptu

Możemy teraz wyświetlić nasze paski, wracamy do kodu. Od razu zadbamy o responsywność. Czyli, o fakt, żeby nasze paski skalowały się do rozdzielczości ekranu gracza. W tym celu deklarujemy jeszcze dwie zmienne pomocnicze:

Zmienne nie mają wartości, dlatego musimy o to zadbać. Wykorzystamy funkcję Awake, która uruchamia się w momencie gdy obiekt gracza zostanie powołany do życia. Szybciej niż funkcja Start.

Kod jest prosty. Wysokość naszego paska, to 2% wysokości ekranu. Czyli np. dla full hd (1080px), nasz pasek będzie miał 20px wysokości. Kiedy dla 768px, będzie to ok. 15px. Wartość procentową, dobrałem metodą prób i błędów. Czyli testowałem, różne warianty, aż uzyskałem moim zdaniem najbardziej estetyczny. Szerokość za to uzależniamy od wysokości. Ma być to zwyczajnie dziesięciokrotność wysokości. Kierowałem się tu prostą zasadą. Domyślnie chciałem pasek w proporcji 100px na 10px. Czyli, żeby zachować proporcję, szerokość musi być dziesięciokrotnością wysokości.

Czas wyświetlić paski:

Uruchamiamy tutaj wszytko w funkcji OnGUI. Jest to funkcja, wyświetlające elementy interfejsu gracza (Graphic User Interface), czyli takie elementy jak nasze paski życia, czy później amunicja lub celownik.

Wykorzystujemy funkcję DrawTexture, która odpowiada za rysowanie tekstur. Ma ona dwa parametry. Pierwszy to obiekt typu Rect (za chwilę go omówię), drugi to Texture2D. Drugi jest oczywisty. Jest to tekstura, którą będziemy rysować. Obiekty typu Rect to nic innego jak prostokąt, który w Unity służy do ustalania pozycji obiektów w obszarze 2D. Ma cztery parametry. X, Y, W, H. Czyli… Swoją pozycję  w układzie współrzędnych: Osie X (poziomo) i Y (pionowo), oraz swoją szerokość (W – Width) i wysokość (H – Height).

Teraz wyjaśnijmy sobie skąd, tak skomplikowane obliczenia w każdej linijce.

Układ współrzędnych w przypadku GUI ma swój początek (punkt (0, 0))  w lewym górnym rogu. Dlatego, aby wyświetlić paski w prawym dolnym, musimy wykonać pewne obliczenia. Od całkowitej szerokości ekranu odejmuje szerokość paska i dodatkowe 10 pikseli dla marginesu.

Dla pozycji w pionie, stosujemy podobną sztuczkę. Od wysokości ekranu odejmujemy wysokość paska i dodatkowe 10 pikseli dla marginesu (dla pierwszego paska). Później dodatkowo mnożymy odjęcie wysokości paska oraz zwiększamy o 10 odejmowany margines. Po co? Bez tego, narysowalibyśmy paski na sobie. Dzięki temu zabiegowi, każdy będzie o swoją wysokość i 10 pikseli marginesu wyżej.

Ostatnie dwa parametry są raczej oczywiste. Pierwszy to proporcja. Nasza obecna liczba punktów życia/pancerza/wytrzymałości, mnożona przez maksymalną szerokość paska, podzielona przez maksymalną liczbę punktów życia. Taka proporcja oblicza długość paska, dla aktualnej liczby punktów. Mówiąc obrazowo: Gdy mamy 40% punktów życia, pasek punktów życia będzie zajmował 40% przestrzeni dla siebie przeznaczonej. Czyli gdyby maksymalnie miał mieć 100 pikseli, będzie miał 40. Ostatni parametr, to wysokość paska, która jest stała.

Otrzymywanie obrażeń

Mamy już nasze paski w tym pasek życia i pancerza. Ale co nam z nich, jeżeli są statycznym obrazkiem? W sumie nic. Ale dzięki zastosowaniu proporcji, obrazki powinny się ładnie skalować w zależności od punktów życia jakie mamy. Póki co nie mamy przeciwników, żeby sprawdzić czy to działa. Dlatego, stworzymy sobie prostą funkcję, która na przyciśnięcie przycisku zada nam obrażenia. Jednak trzeba pamiętać, że jeśli mamy pancerz, najpierw powinniśmy odejmować od niego.

Najprościej, będzie wykonać prostą funkcję odpowiedzialną za zadawanie obrażeń bohaterowi, w późniejszym etapie, gdy stworzymy już przeciwników, będziemy mogli ją łatwo wykorzystać.

Funkcja o nazwie takeHit, nie zwracająca wartości, a przyjmująca parametr damage. Na początek w ifie, sprawdzamy czy posiadamy jeszcze pancerz. Jeśli nie, obrażenia odejmujemy od aktualnie posiadanego życia. Jeżeli mamy pancerz, to odejmujemy ilość pancerza, równą obrażeniom. Ale! Jeśli liczba punktów pancerza w tym momencie spada poniżej zera, oznacza to, że powinniśmy również odebrać część życia. Czynimy to w kolejnym ifie. W wewnętrznym ifie, używamy += zamiast -=, bo wartość currentArmour ma wartość ujemną. Dla pewności zerujemy wartość pancerza.

Ostatnie dwie linijki, zapobiegają dziwnemu zachowaniu się pasków. Funkcja Clamp z biblioteki Mathf, sprawia, że podana wartość, musi się mieścić w przedziale. Czyli np.:

Oznacza, że zmienna currentHealth, musi się zawierać w przedziale 0 do maxHealth – czyli 100. Co to oznacza? Że jeżeli życie postaci spadnie poniżej 0 i wyniesie np. -20, to my i tak otrzymamy wartość zero. Jakie to ma dla nas znaczenie?

Unikamy efektu rysowania w przeciwną stronę
Unikamy efektu rysowania w przeciwną stronę

Unikamy takiego efektu jak na obrazku. Gdyby nie to zaokrąglenie, jeżeli postać otrzymałaby za dużo obrażeń, jej pasek życia zacząłby rosnąć w przeciwną stronę.

OK. Czas przetestować jakoś naszą funkcję. W tym celu w funkcji Update wpisujemy sobie następujące linijki:

Jeżeli naciśnięty zostanie przycisk „P”, wykonujemy naszą funkcję z parametrem równym 30. Dzięki temu, testujemy odejmowanie pancerza, pancerza z życiem i samego życia. Uruchom teraz grę i przetestuj efekt, naciskając P.

Run Forest, run! – Unity v.4.6.x

Czas wykorzystać w jakiś sposób wytrzymałość. Proponuję dodać bieganie (domyślny First Person Controller nie oferuje takiej funkcji), które będzie męczyło naszą postać.

Dodajmy sobie kilka zmiennych:

Są to prędkość chodzenia i biegania, które są publiczne, aby dało się je zmodyfikować z poziomu Unity. Do tego mamy zmienne typu CharacterController i CharacterMotor. Są to elementy First Person Controllera odpowiadające za poruszanie się. Potrzebujemy się do nich odwołać, aby umożliwić bieganie. W funkcji Awake, dodajemy linijki:

Funkcja GetComponent, pobiera nam komponent o wskazanej nazwie. Komponentami są wszystkie elementy wchodzące w skład obiektu.

Czas je wykorzystać.

Warte odnotowania jest to, że kod wywołujemy w funkcji FixedUpdate, zamiast Update. Nie będę się teraz zagłębiał w różnice między nimi, istotne jest to, że FixedUpdate wywołuje się z równą częstotliwością, niezależnie od ilości klatek na sekundę i odbywa się to przed wywołaniem funkcji Update.

Sam kod jest prosty. Pod zmienną tymczasową speed wstawiamy prędkość marszu. W ifie, wykorzystujemy jeden z komponentów, żeby sprawdzić czy postać dotyka ziemi (ciężko biegać w powietrzu), oraz sprawdzamy czy lewy shift jest naciśnięty. Jeśli tak, używamy prędkości biegu. Na koniec, podmieniamy zmienną maxForwardSpeed z komponentu CharacterMotor, aby umożliwić postaci, osiągnięcie większej prędkości.

Bieganie mamy, czas się zmęczyć.

Modyfikujemy kod, dodając zużycie staminy przy biegu, dochodzi do tego nasza znajoma funkcja zaokrąglająca. Jednak jest pewien problem. Kiedy stoimy, ale wciśniemy shift i tak się męczymy. Dlatego, musimy sprawdzić, czy postać w ogóle się porusza.

Dodajemy zmienną pomocniczą:

Będziemy w niej trzymać informację, na temat ostatniej pozycji gracza.

Wracamy znów do FixedUpdate:

Zmiany są dwie. Po pierwsze gdy naciskamy shift, ustawiamy ostatnią pozycję na aktualną. Robimy to tylko w ifie, bo nie potrzebujemy tych danych cały czas, a jedynie w czasie biegu. Druga zmiana, to dodatkowy warunek w ifie. Sprawdzający czy ostatnia pozycja różni się od obecnej. Oznacza to, że się przemieszczamy.

Dodatkowo, dodajemy warunek sprawdzający czy nasza postać, ma w ogóle staminę, czyli siłę do biegu.

Zostało tylko zainicjować zmienną lastPosition. Robimy to w funkcji Awake:

Bez kombinowania, wstawiamy do niej aktualną pozycję gracza.

Run Forest, run! – Unity v.5.0

Tutaj, jesteśmy w znacznie lepszej sytuacji, niż w wersji poprzedniej. Mianowicie domyślny kontroler postaci, posiada funkcję biegania. Nie musimy więc jej dodawać. Jedyne co trzeba zrobić, to obsłużyć zużycie staminy. Sam skrypt, podany dla wersji poprzedniej, też nie bardzo się zmieni. Ale lecimy po kolei:

Dodajemy sobie dwie zmienne:

Które wewnątrz funkcji Awake, od razu ustawiamy:

Jest to komponent CharacterController, który opisuje sytuację gracza, co przyda nam się za chwilę. oraz skrypt odpowiadający za poruszanie się postaci. Musimy użyć aż tak rozbudowanej ścieżki, aby uzyskać jednoznaczność odwołania.

Dodajemy samo zużycie staminy:

Używamy funkcji FixedUpdate, czyli tej zależnej od fizyki gry, a nie od klatek – mamy zapewnione stałe odstępy między wywołaniami tej funkcji. Co mamy w ifie? Sam warunek to po pierwsze sprawdzenie, czy gracz dotyka ziemi – bo przecież nie męczy się od biegania w powietrzu. Po drugie, czy gracz naciska Lewy Shift, czyli klawisz, który odpowiada za bieganie w First Person Controllerze. Jeśli tak, to odejmujemy staminę i zaokrąglamy, tak aby nie stała się ujemna.

Drugi if, to zmiana zmiennej CanRun w FirstPersonController.cs, tak aby uniemożliwić bieganie gdy stamina jest < 0. Domyślnie tej zmiennej nie ma, ale dodamy ją sobie później, gdy skończymy z tym skryptem. Zasada jest prosta. Stamina > 0 = można biegać, w przeciwnym wypadku nie.

Jednak jest pewien problem. Kiedy stoimy, ale wciśniemy shift i tak się męczymy. Dlatego, musimy sprawdzić, czy postać w ogóle się porusza.

Dodajemy zmienną pomocniczą:

Zmieniamy następnie funkcję FixedUpdate:

Zmiany są dwie. Po pierwsze gdy naciskamy shift, ustawiamy ostatnią pozycję na aktualną. Robimy to tylko w ifie, bo nie potrzebujemy tych danych cały czas, a jedynie w czasie biegu. Druga zmiana, to dodatkowy warunek w ifie. Sprawdzający czy ostatnia pozycja różni się od obecnej. Oznacza to, że się przemieszczamy. Na koniec musimy ustawić wartość startową dla naszej zmiennej lastPosition:

Wszystko powinno pięknie działać. Problemem natomiast jest fakt, że nasz poziom staminy nie wpływa na możliwość biegu gracza. Tutaj, niestety nie obejdzie się bez edycji pliku FirstPersonController.cs. Co tam należy zrobić? Dodajemy sobie jedną zmienną:

A następnie kodzik:

Co to nam daje? Mamy zmienną, która definiuje, czy możemy biegać, oraz dodajemy jej mutuatory (czyli popularny geter i seter), czyli pokrótce funkcję, które pozwalają pobrać i zmienić wartość tej zmiennej.

Jeszcze znajdujemy w kodzie taką linijkę:

I zamieniamy na:

Co to zmienia? W domyśle linijka sprawdza czy postać ma chodzić (IsWalking na true), jeśli tak, to dostajemy prędkość chodzenia, jeśli nie to prędkość biegu. – Ten cały dziwny zapis to jedno linijkowy if. Jego budowa jest następująca: [WARUNEK] ? [CO JEŚLI PRAWDA] : [CO JEŚLI FAŁSZ]. Stosowany najczęściej właśnie w takich przypadkach, gdzie warunek jest bardzo prosty i chcemy zwrócić jedną wartość.

Nasza podmiana, sprawiła, że w przypadku fałszu, czyli gdy postać ma biec, sprawdzamy jeszcze naszą dodatkową zmienną. Jeśli też jest prawdą, pozwalamy biec, w przeciwnym wypadku – idziemy.

Podsumowanie

W tej części, udało nam się stworzyć podstawowe GUI gracza, które jest responsywne. Do tego dodaliśmy funkcję biegania i męczenia się. Możemy też zadań naszej postaci obrażenia z uwzględnieniem pancerza.

W następnej części, zajmiemy się regeneracją współczynników. Poznamy współprogramy i proste sztuczki na oczekiwanie. Do tego dodamy kilka efektów, do otrzymywania obrażeń.

Cały kod PlayerStats.cs – Unity3d v.4.6.x:

Cały kod PlayerStats.cs – Unity3d v.5.0.x:

 Poprzednia część <- #2 – Sterowanie Postacią

 Następna część -> #4  – Regeneracja życia i energii. Efekty trafienia

 

  • mrKTPN

    Cześć! Mam taki głupi problem… A mianowicie nie wiem jak pokopiować linijki wstawione w artykule do skryptu? Jak cały skrypt ma wyglądać? Prosiłbym o w miarę szybką odpowiedź.

    • Kodzik w całości jest w jednym skrypcie w jednej klasie. Czyli mamy:

      using UnityEngine;
      using System.Collections;

      public class PlayerStats : MonoBehaviour {

      // Tutaj wszystkie zmienne public i private

      void Awake()
      {
      // kod z tej funkcji
      }

      void OnGUI()
      {
      // kod tej funkcji
      }

      //itd.

      }

    • kuba

      mam takie pytanie czemu nie mogę dać skrypt player state do gracza wyskakuje że błenda nazwa i nazwa klasy

    • Nazwa klasy musi być dokładnie taka sama jak nazwa pliku. Nie może też zawierać spacji. Czyli np. gdy masz klasę: PlayerStats, plik musi się nazywać PlayerStats.cs <- Wielkość liter również ma znaczenie.

    • kuba

      dziękuje . już działa

    • kuba

      później jak robiłem animacje krwi to cały skryp się popsuł . I teraz znowu nie działa skryp pisze dokładnie nazwe skryptu

    • A jaki błąd się pojawia?

    • kuba

      już nic sory że przeszkodziłem

    • kuba

      jak mam skrypt PlayerStats.cs. to mam dać od razu do gracza czy weść w ustawienia gracz i wkleić

    • kuba

      A CZEMU JAK SKOŃCZY MI SIĘ ENERGIA TO NADAL BIEGA

    • Mogłeś zapomnieć dodać warunku currentStamina > 0, ew. skopiowałeś końcowy kod dla Unity 5.0, który właśnie zauważyłem, że jest wybrakowany i dlatego nie działa. Kod poprawiłem.

    • kuba

      jak wkleiłem wszystko do unity 5 to wyskoczyło mi Assets/PlayerStats.cs(103,30): error CS1061: Type UnityStandardAssets.Characters.FirstPerson.FirstPersonController' does not contain a definition for CanRun’ and no extension method CanRun' of type UnityStandardAssets.Characters.FirstPerson.FirstPersonController’ could be found (are you missing a using directive or an assembly reference?)

    • Dokonałeś modyfikacji w kodzie skryptu ze standardowych assetów o nazwie: FirstPersonController.cs? Bez tego nie zadziała.

    • Łukasz Piszka

      Jakiej Modyfikacji?

    • kuba

      i nie mogę rozpocząć gry i mi wyskakuje 3 System nie może odnaleźć określonej ścieżki.

  • SkyLEx

    Witam. Czy mógłby Pan wstawić screena z kodem z PlayerStats to by znacznie ułatwiło mi ogarnięcie jak przepisać ten kod z góry dziękuje.

    • Screen byłby mało praktyczny, dlatego wstawiłem na koniec wpisu box, gdzie znajduje się cały kod. ;)

    • SkyLEx

      Wielkie Dzięki nie zauważyłem :)

  • MSrebro

    Nie mogę dodawać skryptów ;(

    • Wrzuć tutaj treść błędu, to z pewnością coś wymyślimy ;)

    • MSrebro

      ,,unable to open nazwapliku.cs check external application preferences”
      Skrypty w innych językach programowania też nie działają

    • Unity zwyczajnie nie widzi programu, który ma otworzyć skrypt. Możliwe, że przy instalacji Unity odznaczyłeś instalację domyślnego MonoDevelop. Przeinstalowanie Unity z upewnieniem się, że MonoDevelop został zainstalowany załatwi sprawę. :)

    • MSrebro

      Właśnie w tym problem, że MonoDevelop mam zainstalowany, a za każdym razem po instalacji wyświetla się ten błąd :(.

    • Jeżeli masz system Windows 7 lub nowszy, a aplikację zainstalowaną na dysku C, możliwe, że brakuje autoryzacji. Możesz spróbować uruchomić Unity jako administrator.
      Druga opcja, to ręczne przydzielenie edytora: [Edit -> Preferences] i w zakładce External Tools, masz opcję External Script Editor. Możesz tam ręcznie wybrać jakiś inny edytor i zobaczyć, co się wtedy stanie.

    • MSrebro

      Wielkie dzięki !!! Ściągnąłem Notepad i zrobiłem jak mi poradziłeś, już traciłem wiarę, że nie będę mógł zrobić własnej gry ;)

  • Firgus

    ,,UnassignedReferenceException: The variable hitTexture of PlayerStats has not been assigned”

    • Nie wystarczy skopiowac skryptu. Trzeba ustawic zmienne publiczne z poziomu Unity.

  • 4MaticPL

    Cześć. Mam problem z klasą CharacterMotor .Kompilator wywala błąd, że nie istnieje takie coś.

    • 4MaticPL

      Mam zaimportowany asset CharacterControl. W jego folderze znajduje się plik CharacterMotor więc nie wiem w czym problem

    • Czy CharacterMotor (skrypt) znajduje się w folderze Standard Assets, a skrypt statystyk w jakimkolwiek innym?

      CharacterMotor jest skryptem w JS, a nasz skrypt w C#. C# kompiluje się wcześniej, więc nasz skrypt nie ma dostępu do skryptów JS, chyba że te, znajdują się w specjalnym folderze, takim jak Standard Assets.

      U mnie po przejściu na Unity 4.6, MonoDevelop oznacza CharacterMotor jako coś nie istniejącego, ale w Unity gra uruchamia się normalnie.

    • 4MaticPL

      Skrypt PlayerStats dałem do tego samego folderu co Skrypt CharacterMotor.js

    • No to jak pisałem, tak nie może być. CharacterMotor musi być w folderze Standard Assets, a skrypt PlayerStats w każdym innym, tylko nie w Standard Assets. Np. w oddzielnym folderze Scripts.

  • Adrian Grenda

    Mam problem, podczas próby połączenia PlayerStats z kontrolerem wyskakuje mi okno błędu że taki plik nie istnieje ;/

    • Skrypt może zawierać błędy składniowe, przez co Unity uznaje go za nieistniejący. Sprawdź czy konsola nie sugeruje błędów w skrypcie. Jeśli jakieś są, musisz je poprawić, wtedy skrypt się doda.

      Jeżeli w skrypcie nie ma błędów, możesz spróbować kilku sztuczek:
      – Restart Unity
      – Skopiowanie treści skryptu do nowo utworzonego pliku
      – Wybrać z menu MonoDevelop: Build -> Clean All, a następnie kliknąć F8.

    • Adrian Grenda

      Próbowałem naprawiac wszystkie błędy, ale nadal mam ten problem, To pokazuje mi się w konsoli :

      Assets/Standard Assets/Character Controllers/Sources/Scripts/PlayerStats.cs..cs(4,25): error CS8025: Parsing error

      a to skrypt :

      using UnityEngine;
      using System.Collections;

      public class Plajer.cs. : MonoBehaviour {

      // Use this for initialization
      void Start () {

      // Update is called once per frame
      void Update () {

      }

    • Adrian Grenda

      Już naprawione, teraz tylko problem z character motorem, niby jest wgrany do person controllera ale kiedy chcę włączyć grę wyskakuje mi że tam go wcale nie ma :/

    • Kolega niżej miał taki problem. Jeżeli skrypt CharacterMotor masz w innym folderze niż Standard Assets, a skrypt tworzony w tutorialu masz w tym samym folderze co CharacterMotor, wtedy to nie zadziała.

    • Adrian Grenda

      Cześc, wiem że zadaje dużo pytań ale mam jeszcze jedno ważne, ponieważ, po wpisaniu już tych wszystkich linijek, wyskakują dodatkowe tabelki pod tym skryptem, kiedy ja zrobiłem nowy skrypt, tych tabelek wcale tam nie ma, ( nie chodzi mi o ten skrypt na stronie) ale wiem że wszystko dobrze napisałem, jakaś pomoc ? ktoś wie jak ” dodać ” taką tabelke ?

    • Jeżeli chodzi Ci o zmienne widoczne pod komponentem skryptu z poziomu Unity, to są to zmienne publiczne. Czyli widoczne jest tam każde:

      public typZmienne nazwaZmiennej = domyślnaWartość;

      Czyli, jeśli to Ci się nie pojawia, to możliwe że nie zadeklarowałeś tych zmiennych, lub nie są publiczne. Jeśli o to chodzi.

    • Adrian Piecek

      jak to naprawiłeś?

  • ertyu

    jak dodać te paski nie wiem jak i gdzie przeciągnąć nie rozumiem

    • Przeciąganie odbywa się z poziomu Unity. Aby dodać jakiś obiekt gdzieś, często wystarczy przeciągnąć go w odpowiednie miejsce. Tutaj trzeba zaznaczyć obiekt ze skryptem i z panelu Project przeciągnąć grafiki do panelu Inspector.

      Jeżeli przerabiasz kurs od początku i uważnie wykonujesz kolejne polecenia, to powinieneś sobie spokojnie poradzić.

  • Laysiks

    W nowej wersji Unity 5 występuje błąd w CharacterMotor … could not be found. Oczywiście próbuje to dodać do FPS controler bo innego first persona nie widzialem w unity.

    • matrix 2000

      Mam to samo pytanie i problem….

    • Wynika to z tego, że domyślne assety zmieniły się wraz z 5 wersją Unity i teraz FPS Controller posiada skrypt First Person Controller, zamiast CharacterMotor. Siłą rzeczy, nie znajdzie tego starego.
      Możesz próbować odwołać się do nowego skryptu, ale nie wiem czy część, która wymaga tego skryptu będzie działać poprawnie. Z drugiej strony, robiłem to, żeby dodać bieganie. Bieganie jest dostępne w skrypcie First Person Controller domyślnie. Jedynie zostaje kwestia zużycia staminy, ale do niej nie potrzebujesz tego odwołania.

      Reasumując: Możesz pominąć linijki kodu związane z tym skryptem. :)

  • Jack

    Mam 2 pytania czy też problemy, chodzi mi o statystyki

    1. Podczas gdy jedna z zmiennych osiąga 0 Unity włącza Pause w grze i nie da się tego cofnąć trzeba naciskać przycisk Play 2x aby znów włączyć grę do testowania

    2. Jak zrobić aby np. zmienna Armour zmniejszała się co 10sekund o 1 jednostkę, przerobiłem ten skrypt itp i posiadam dodatkowo Wodę i jedzenie ale nie wiem jak zrobić aby traciły one się co kilka sekund o 1 w dół

    • 1) Która zmienna? Tak bez dodatkowych danych, w sumie ciężko wysnuć jakieś wnioski, po za tym, że nie ma prawa się tak dziać.

      2) Możesz wykorzystać skrypt, który regeneruje życie. Tyle że zamiast dodawać będziesz odejmował. :)

    • Jack

      Pierwszy problem naprawiłem, coś musiało źle działać i po osiągnięciu 0 skrypt się sypał

      Co do odwrotu regeneracji życia nie wiem czy zadziała ponieważ życie tam regeneruje się dosyć szybko a mi bardziej zależy na powolnej utracie tych statystyk ale zobaczę czy da się to spowolnić

      Istnieje jakiś sposób aby zrobić coś w stylu ‚every 10seconds currentFood -= 1;’ żeby zawsze co jakiś czas działa się jedna pętla

    • Możesz zwiększyć czas timera. Jeśli chcesz osiągnąć taki efekt jak podałeś, należy skorzystać z podprogramu. Pisałem o tym tutaj:
      http://mwin.pl/unity3d-quicktip-7-zrobic-odmierzanie-czasu-timer/

  • Mag Zza Biedronki

    Ok wszystko ładnie pięknie ale po wyczerpaniu staminy nadal można biegać. Mówię o unity v5.0

    • Faktycznie, małe niedopatrzenie. Poprawię to jak najszybciej. :)

    • Udało się, wszystko powinno już ładnie działać. ;)

    • Crag Hack

      Mi nadal nie działa :/ (mam Unity 5)

  • Walter White

    Bardzo fajny poradnik.

  • Adrian Piecek

    Mam problem, posiadam wersię 5.0 i podczas napisania pierwszego kodu wyskakuje mi komunikat: ,,A namespace can only contain types and namespace declarations”, proszę o pomoc
    PS: numer błedu to CS0116

    • A mogę zobaczyć kod? :)

    • Adrian Piecek

      C#
      1
      2
      3
      4
      5
      6private float maxHealth = 100;
      private float currentHealth = 100;
      private float maxArmour = 100;
      private float currentArmour = 100;
      private float maxStamina = 100;
      private float currentStamina = 100;

    • Brakuje Ci całego początku skryptu, czyli deklaracji bibliotek i początku klasy w której wszystko się znajduje:

      using UnityEngine;
      using System.Collections;

      public class Shooting : MonoBehaviour
      {
      // dopiero tutaj zaczyna się Twój kod
      }

    • Adrian Piecek

      robiłem tak jak napisałeś, ale po napisaniu tego wyskoczył mi ten błąd

  • Norbi Zarzy

    co mam zrobić gdy wyskoczy mi błąd Parsing Error

    napisałem wszystko jak w tutorialu:

    using UnityEngine;

    using System.Collections;

    public class PlayerStats : MonoBehaviour {

    //private float maxHealth = 100;

    private float currentHealth = 100;

    private float maxArmour = 100;

    private float currentArmour = 100;

    private float maxStamina = 100;

    private float currentStamina = 100;

    public Texture2D healthTexture;

    public Texture2D armourTexture;

    public Texture2D staminaTexture;

    • Parsing error to blad skladni. Czyli pewnie gdzies nie domknales nawiasu, nie dodales srednika albo cos takiego. Ew. Dodales skrypt C. Do pliku .js

    • Norbi Zarzy

      Nie wszytko dobrze. Sprawdzałem i mam tak samo jak w poradniku. A i jeszcze dodałem

    • Norbi Zarzy

      Już mi działa. Miałeś rację. Zwracam honor.

  • lorow

    Kurde, ja cały net obleciałem w poszukiwaniu działających i fajnie opisanych skryptów, a tu pod nosem je mam :) Dzięki, teraz rozumiem co tam brackeys sobie „szkrefla” :)

  • Używasz funkcji GetKey, zamiast GetKeyUp albo GetKeyDown. GetKey zwraca true gdy klawisz jest wciśnięty. Czyli jak dłużej przytrzymasz spację, może dwa razy chwycić ifa. Jak zmienisz na GetKeyDown odjęcie nastąpi w momencie kliknięcia spacji. Żeby złapało odjęcie ponownie, musisz ją puścić i wcisnąć ponownie.

    • Arkhnen

      Ok, rozumiem. Niestety, przy GetKeyDown problem nadal występuje… nic się nie zmieniło. Cholbika. D:

    • Możesz podesłać resztę kodu, może błąd jest gdzie indziej.

  • Ezioleq

    Jak dla mnie bez sensu… Nie wiadomo gdzie co wpisać/wkleić.

    • Jeżeli wykonujesz wszystkie kroki od początku dokładnie czytając instrukcję, nie powinno być problemów. A jeśli jakieś są, możesz pytać w komentarzach ;)

  • Votan

    Pracuję na Unity 5.0.3. Wszystko robię krok po kroku, wszystko działa, lecz bieganie… Postać biega nawet wtedy, gdy nie ma staminy.

  • Kod, który udostępniłeś dla Unity 5, w wersji 5.0.1 nie działa. Wywala błąd dla tego kodu:
    „if (currentStamina > 0) {
    fpsC.CanRun = true;
    } else {
    fpsC.CanRun = false;
    }”
    Dopiero po jego usunięciu gra działa. Postać męczy się. Jednakże dokładnie sprawa przedstawia się tak, że:
    1. Postać męczy się po wciśnięciu „SHIFTA” bez względu na to, czy biegamy czy stoimy.
    2. Nie można zadać postaci obrażeń przyciskiem „P”.

    W powyższym kodzie, kompilator czepia się dokładnie „CanRun”. Metoda ta, jak podaje kompilator nie jest zdefiniowana w standardowych assetach postaci.

    Kod który podajesz dla wersji Unity3D 4, działa bez zarzutów. Jednak ten w 5 nie chcę działać jak należy.

    • Owszem nie jest zdefiniowana. Dlatego w kodzie dla wersji 5.0 jest opisane, co należy zmienić w kodzie skryptu FirstPersonController, aby skrypt działał. Samo skopiowanie kodu z podsumowania, nie załatwia sprawy.

      Z przyciskiem P, znów problem jest tej maści, że wymaga on HitTexture. Ile razy, ktoś do mnie pisał, że mu nie działa zadawanie obrażeń, okazywało się, że właśnie na tworzeniu HitTexture kod się sypie, bo nikt nie ustawił tej zmiennej z poziomu Unity.

    • Ja pierdziu. Czyli znowu coś przeoczyłem i nie doczytałem. Jakże typowe w moim przypadku……

      Dzięki za komentarz :)

  • Michał Wierzyk

    Witam, mam mały problem.
    Kiedy gracz jest w powietrzu i wciskam klawisz do sprintu to faktycznie stamina nie ucieka, ale prędkość się zmieniła.
    BTW. Dzięki za prowadzenie tego bloga!

    • Michał Wierzyk

      Sam doszedłem do rozwiązania. Jak to mówią – Przerwy dobrze robią programistom, a szczególnie tym początkującym.

      W funkcji update dodałem tylko małego ifa

      if (!chCont.isGrounded) {
      fpsC.CanRun = false;
      }

  • Kuba Rumin

    Assets/Scripts/Player/PlayerStats.cs(105,30): error CS1061: Type UnityStandardAssets.Characters.FirstPerson.FirstPersonController' does not contain a definition for CanRun’ and no extension method CanRun' of type UnityStandardAssets.Characters.FirstPerson.FirstPersonController’ could be found (are you missing a using directive or an assembly reference?)

    to mi wywala przy próbie wrzucenia zużycia staminy. Przy skopiowaniu całego kodu z dołu jest ten sam błąd.

    • Dlatego zawsze zalecam czytanie całego poradnika i robienie krok po kroku. Gotowy kod wstawiam głównie dla możliwości weryfikacji.
      Po prostu pominąłeś pół ostatniego rozdziału, gdzie trzeba edytować plik FirstPersonController.cs

    • Kuba Rumin

      Którą część dokładnie ? w poprzednim rozdziale opisałeś tylko jakie funkcje do czego służą, nie widzę nic o edytowaniu pliku firstpersoncontroller.cs
      PS. używam unity 5.0

    • Ostatni rozdział tej części tutoriala, czyli: Run Forest, run! – Unity v.5.0. W pewnym momencie tego rozdziału, jest akapit:

      „Wszystko powinno pięknie działać. Problemem natomiast jest fakt, że nasz poziom staminy nie wpływa na możliwość biegu gracza. Tutaj, niestety nie obejdzie się bez edycji pliku FirstPersonController.cs. Co tam należy zrobić? Dodajemy sobie jedną zmienną:”

      I tam dalej jeszcze kawałek.

    • Kuba Rumin

      Zatrybiło wielkie dzięki ;)

  • Mateuszus

    Podaj kodzik na tracenie życia,gdy dotyka cię przeciwnik,proszę,jest mi to bardzo potrzebne!

  • Igor Cizewski

    Assets/Scripts/PlayerStats.cs(6,23): warning CS0414: The private field Shooting.maxHealth' is assigned but its value is never used

    Assets/Scripts/PlayerStats.cs(7,23): warning CS0414: The private field Shooting.currentHealth’ is assigned but its value is never used

    Assets/Scripts/PlayerStats.cs(8,23): warning CS0414: The private field Shooting.maxArmour' is assigned but its value is never used

    Assets/Scripts/PlayerStats.cs(9,23): warning CS0414: The private field Shooting.currentArmour’ is assigned but its value is never used

    Assets/Scripts/PlayerStats.cs(10,23): warning CS0414: The private field Shooting.maxStamina' is assigned but its value is never used

    Assets/Scripts/PlayerStats.cs(11,23): warning CS0414: The private field Shooting.currentStamina’ is assigned but its value is never used

    Wyskoczyły te błędy jak zapisałem

    using UnityEngine;

    using System.Collections;

    public class Shooting : MonoBehaviour {

    private float maxHealth = 100;

    private float currentHealth = 100;

    private float maxArmour = 100;

    private float currentArmour = 100;

    private float maxStamina = 100;

    private float currentStamina = 100;

    public Texture2D healthTexture;

    public Texture2D armourTexture;

    public Texture2D staminaTexture;

    }

  • Bochen37

    Po napisaniu całego skryptu i po włączeniu mojej „gry” wyskakuje mi błąd
    „UnassignedReferenceException: The variable hitTexture of PlayerStats has not been assigned.

    You probably need to assign the hitTexture variable of the PlayerStats script in the inspector.

    UnityEngine.GUITexture.set_pixelInset (Rect value) (at C:/buildslave/unity/build/artifacts/generated/common/runtime/GUIElementBindings.gen.cs:77)

    PlayerStats.Start () (at Assets/PlayerStats.cs:69)”

    Chodzi mi o to, że zawsze jak wciskam P na klawiaturze z teksturą nic się nie dzieję i dalej wyskakuje mi błąd pokazany powyżej.
    Z góry dziękuje za pomoc.

    • Błąd dokładnie tłumaczy o co chodzi i nawet co trzeba zrobić:
      „You probably need to assign the hitTexture variable of the PlayerStats script in the inspector.”
      W wolnym tłumaczeniu: Prawdopodobnie nie przypisałeś zmiennej hitTexture do skryptu PlayerStats w inspekotrze. Innymi słowy, nie ustawiłeś wartości publicznej zmiennej z poziomu Unity.
      W opisie tutoriala pomiędzy linijkami kodu jest instrukcja, jak zmienna powinna wyglądać i jak ją przypisać. ;)

    • Bochen37

      Dziękuję za tak szybką odpowiedź, teraz działa wszystko jak należy.

    • Bochen37

      Dziękuje za tak szybką odpowiedź (i pomoc oczywiście), ale ustawienie wartości publicznej zmiennej nie wystarczyło, ciągle wyskakiwał mi ten błąd. Musiałem usunąć jedną linijkę kodu:
      Destroy(Instantiate(hitTexture), 0.15f);

      A teraz działa tak jak należy.

    • Kamil Młodzianowski

      Ja umialem sobie poradzic ze wszystkimi problemami prucz tego HitTexture wiec zrobilem jak kolega

  • Łukasz Piszka

    problem z fpsC.CanRun = true;
    } else {
    fpsC.CanRun = false;

    • Potrzebne jakiekolwiek szczegóły. Kod błędu, cokolwiek. Na tej podstawie, nie mogę powiedzieć kompletnie nic.

    • Łukasz Piszka

      Chodzi Ci o to?

      Assets/Scripts/PlayerStats.cs.cs(103,30): error CS1061: Type UnityStandardAssets.Characters.FirstPerson.FirstPersonController' does not contain a definition for CanRun’ and no extension method CanRun' of type UnityStandardAssets.Characters.FirstPerson.FirstPersonController’ could be found (are you missing a using directive or an assembly reference?)

    • Dokładnie o to.
      Wynika z tego, że w pliku FirstPersonController nie ma zmiennej CanRun, a z tego wynika, że pominąłeś fragment poradnika, gdzie opisane jest, jak tą zmienną dodać. Czyli rozdział „Run Forest, run! – Unity v.5.0”.
      Polecam przerabiać poradniki w całości, czytając dokładnie cały tekst, bez tego wiele rzeczy może nie działać, bo czasami coś trzeba zmienić np. z poziomu Unity.

    • Łukasz Piszka

      Teraz jest następny błąd: x3

      UnassignedReferenceException: The variable hitTexture of PlayerStats has not been assigned.

      You probably need to assign the hitTexture variable of the PlayerStats script in the inspector.

      UnityEngine.GUITexture.set_pixelInset (Rect value) (at C:/buildslave/unity/build/artifacts/generated/common/runtime/GUIElementBindings.gen.cs:69)

      PlayerStats.Start () (at Assets/Scripts/PlayerStats.cs:69)

      i: x2

      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/Scripts/PlayerStats.cs:96)

    • Pierwszy błąd, znów wynika z pominięcia fragmentu tekstu tutoriala. Zmienna hitTexture jest zmienną publiczną i trzeba ją uzupełnić z poziomu Unity.
      Drugi mówi o tym, że obiekt nie ma komponentu CharacterController – czyli postaci, której przypisaleś skrypt, brakuje tego komponentu i trzeba go dodać, jeśli nie korzystasz z domyślnego assetu.

      Polecam czytać dokładnie cały tekst w poradnikach, to większość problemów sama się rozwiąże.

    • Adrian Piecek

      u mnie nie da się ustawić HitTexture. Jest tylko None.
      przeciągnąłem na gracza PlayerStats, i i wszystko się wyświetla, ale nie mogę się ruszać

  • Łukasz Piszka

    Błąd:

    Assets/Scripts/PlayerStats.cs(106,30): error CS1061: Type UnityStandardAssets.Characters.FirstPerson.FirstPersonController' does not contain a definition for CanRun’ and no extension method CanRun' of type UnityStandardAssets.Characters.FirstPerson.FirstPersonController’ could be found (are you missing a using directive or an assembly reference?)

  • Matix

    Witam. Co mam zrobić aby dodać te paski i jak je wykonać? W paincie mam je zrobić i jakoś wgrać?

  • Shym

    Witam ,mam problem ze skryptemPlayerStats.cs
    Pokazuje mi się:
    Assets/Scripts/PlayerStats.cs(135,1): error CS8025: Parsing error

    Mam unity Unity3d wersji 5. Wpisałem te linijki w FirstPersonController ,przepisałem cały skrypt z podsumowania dla unity 5 ,przeczytałem cały dział w szukaniu odpowiedzi (dla mojej wersji) i nic nie znalazłem.

    Proszę o pomoc. Z góry dziękuję.

    • Shym

      A jak chcę dołączyć ten skrypt do obiektu Player w hierarchy to pisze mi

      Please fix compile errors before creating new script components.

      Tylko jak naprawić ten błąd kompilacji?

    • Do kodu błędu warto dorzucić fragment kodu, który powoduje błąd. Z tego wiem, że prawdopodobnie masz błąd składniowy w 135 linijce kodu PlayerStats.cs, ale nie widząc tej linijki, ciężko powiedzieć o co chodzi.

      Może to być brak średnika, niedomknięty nawias czy cudzysłów.

    • Shym

      Teraz się zmieniło na 132 linie ,w której jest tylko }

    • Shym

      Dobra dzięki :) Udało mi się naprawić błąd.

    • Shym

      void regenerate(ref float currentStat, float maxStat)
      {
      currentStat += maxStat * 0.005f;
      Mathf.Clamp(currentStat, 0, maxStat);
      }

  • Michał Rewers

    będzie poradnik jak stworzyć grę 3 osobową ?

    • W sumie różnica sprowadza się do tego, żeby postać z widokiem pierwszoosobowym, zastąpić taką z widokiem trzecioosobowym. Jeżeli chcesz korzystać ze standardowych assetów Unity, to kontroler do postaci trzecioosobowej też istnieje, wystarczy go wykorzystać. Problemem będzie pewnie animacja postaci, niestety tutaj z racji, że nie jestem grafikiem/animatorem, mogę poradzić tylko znalezienie modelu, który wymaganymi animacjami dysponuje.

  • Michał Rewers

    kiedy odpalam gre nie widze pasków a kod skopiowałem od ciebie i żadnych błedów nie wykrywa mi.

  • Michał Rewers

    cos zepsułem. Każdy skrypt jaki dodam który sam stworzylem ( nawet jeżeli nic w nim nie pisałem) to pisze cant add script
    The script is an editor script

    • A gdzie trzymasz pliki skryptów? Jeżeli w folderze Editor, może występować taki problem. Spróbuj przenieść skrypt do głównego folderu projektu i wtedy spróbuj go dodać.

    • Michał Rewers

      O, naprawilo sie. Dzieki wielkie za radę.

    • Mateusz Malinowski

      Witam, mam problem a mianowicie gdy zmieniam drugi skrypt tak jak to pokazałeś w części Run Forest Run!! 5.0 (czy jakoś tak ;) ) to mam 3 błędy w programie wynikające z :

      public bool CanRun
      {
      get { return m_CanRun; }
      set { m_CanRun = value; }
      }
      podkreśla mi to CanRun i oznajmia że :

      Severity Code Description Project File Line
      Error CS0102 The type ‚FirstPersonController’ already contains a definition for ‚CanRun’

      Jakbyś znalazł chwilkę wolnego czasu to proszę o odpowiedź, i z góry dzięki za nią :)
      Pozdrawiam,
      Człowiek, który uważa że ten poradnik jest świetny ;)

    • Twój błąd wskazuje na to, że w kodzie, a dokładnie w tym skrypcie posiadasz już definicję zmiennej CanRun. Mogłeś dodać zmienną przypadkowo kilka razy, albo coś takiego. Usunięcie drugiej deklaracji powinno pomóc.

      Bardzo mnie cieszy, że poradnik przypadł Ci do gustu. :)

  • Tomek Prabucki

    Gdzie wkleić ten skrypt PlayerStats.cs i prosze dodaj pełny skrypt FirstPersonController
    mam wersję 5.0 i niewiem co robić.
    Na skryptach nie znam się wgl.

    • Skrypt FirstPersonController jest dołączony automatycznie do modelu First Person Controller ze standardowych assetów.

      Skrypt PlayerStats, powinien być dołączony do modelu gracza (czyli obiektu First Person Controller)

      Polecam przerabiać tutorial od początku i czytać wszystko dokładnie. Odpowiedzi na te pytania padają w tekście. Jeżeli poświęcisz temu trochę czasu to na pewno opanujesz skrypty.

  • Pingback: Unity3d FPS Tutorial #5 - Kamera z bronią i strzelanie | mWin()

  • Michał Rewers

    w Unity 5.1.3 nie ma miejsca na teksturę,. Chodzi mi o to, że jak napisałem cały skrypt, i chciałem dodać te textury, to nie było tego „odpowiedniego miejsca” jak to mówiłeś. Czy coś się pozmieniało w tej aktualizacji ?

    • Tekstura, jest u nas zmienną publiczną, więc w tym zakresie nic się nie zmieniło. Sprawdź, czy deklaracja zmiennej jest w dobrym miejscu i czy na pewno zadeklarowałeś ją jako zmienną publiczną (public).

  • Pingback: Unity3d FPS Tutorial #13 - Menu główne gry. GUI | mWin()

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

  • disqus_CfQiRz5z5F

    Zrobiłem wszystko zgodnie z poradnikiem ale jak biegam to stamina nie jest odejmowana. Co robić?

    • Powstawiać funkcję Debug.Log() w różnych miejscach kodu odpowiedzialnego za odejmowanie i wyświetlanie staminy, aby zobaczyć w którym miejscu kod przestaje działać.

  • Ammon

    Witam mam błąd z HitTeksture ?!
    UnassignedReferenceException: The variable hitTexture of Statystyki has not been assigned.
    You probably need to assign the hitTexture variable of the Statystyki script in the inspector.
    UnityEngine.Object.Instantiate (UnityEngine.Object original) (at C:/buildslave/unity/build/artifacts/EditorGenerated/UnityEngineObject.cs:91)
    Statystyki.takeHit (Single damage) (at Assets/tekstury/Postac GUI/Statystyki.cs:112)

    Statystyki są pokazywane jako GUI ale nie zadaje obrażeń

    • Ammon

      Ok poprawiłem, wyrzuciłem całkowicie HitTXT i działa poprawnie, wersja 4.6.x

    • Prawdopodobnie nie przypisałeś teksturze wartości z poziomu Unity.

  • Michał Krynicki

    U mnie nie działa zmienna CanRun. Gdy wpisałem skrypt visual studio kazał mi utworzyć metodę w klasie FirstPersonController.cs o postaci: public bool CanRun { get; set; }. Ale skrypt nie chce działać. Trzeba tam coś dodać tylko nie wiem co. Czy ktoś pomoże ?

    z góry dziękuję za pomoc

    • Przerobiłeś rozdział Run Forest, run! – Unity v.5.0 z tego poradnika? Tam jest opisane jak zmodyfikować skrypt FirstPersonController, aby całość działała.

  • ToJa

    Dlaczego w 5.2.2 po wpisaniu kodu gra nie chce się uruchomić po wciśnięciu przycisku play?

    • ToJa

      Dodam, że przed zaczęciem pisania kodu gra działała, a sam kod kopiowałem i wklejałem. Może źle go wkleiłem?

    • Jest taka opcja. W konsoli powinny Ci się pojawić jakieś błędy, sugerujące, co jest nie tak.

  • franek dolas

    hello, mam problem mianowicie postępuje zgodnie z instrukcjami krok po kroku a w ogóle nie wyświetlają mi się statystyki na ekranie gry i dodatkowo pojawia się błąd: NullReferenceException: Object reference not set to an instance of an object

    PlayerStats.FixedUpdate () (at Assets/Standard Assets/Characters/FirstPersonCharacter/Scripts/PlayerStats.cs:83)

    • Nie widząc kodu nie powiem konkretnie, bo nie wiem co masz w linii 83, ale z treści błędu wynika, że wykonujesz operacje na jakiejś zmiennej, która nie ma wartości.

      Zakładam, że nie przypisałeś z poziomu Unity wartości do jakiejś zmiennej publicznej.

  • franek dolas

    hello, znalazłem przyczynę błędu tzn. dlaczego wyrzucało mi błąd NullReferenceException: Object reference not set to an instance of an object. Z rozpędu funkcję Awake() napisałem z małej litery po poprawieniu na duże ‚A’ wszystko ładnie śmiga. A powiedz mi tak po za konkursem dlaczego podczas tutoriala deklarujesz zmienne private float barWidth; i private float barHeight; ale ich nie inicjujesz a na końcu podając cały kod te 2 zmienne mają przypisaną wartość =100; u mnie kod działa w obu przypadkach tzn z inicjacją i bez. pytam z ciekawości, po za tym super kurs

    • Działa w obu przypadkach, bo faktyczne wartości tych zmiennych ustawiamy w funkcji Awake:
      void Awake() {
      barHeight = Screen.height * 0.02f;
      barWidth = barHeight * 10.0f;
      }

      W takim przypadku deklarowanie wartości od razu jest zbędne, przy czym nigdy nie zaszkodzi (bo gdyby z jakiegoś powodu, nie uruchomił się kod przydzielający im wartość, to będziemy mieli na sztywno to wprowadzone 100).

      A dlaczego w jednym miejscu jest, a w drugim nie? Prawdopodobnie dlatego, że później jeszcze majstrowałem trochę z kodami, a te fragmenty zbiorcze były dodawane czasami nawet kilka tygodni po skończeniu kursu, na prośbę czytelników, więc czasami kody się troszeczkę różnią, albo pochodzą np. z późniejszej części.

      Cieszę się, że kurs się podoba. :)

  • Twój błąd mówi o tym, że odwołujesz się do obiektu, którego nie znaleziono. Z tego co widzę u Ciebie linia 99 to:
    fpsC.CanRun = true;
    Oznacza to, że albo nie masz zdeklarowanego fpsC, albo nie masz zmiennej CanRun. Czyli są dwie opcję:
    1) Pominąłeś fragment tutoriala o dodaniu zmiennej CanRun, wtedy wróć do nagłówka „Run Forest, run! – Unity v.5.0” i przerób go jeszcze raz dokładnie.
    2) Kawałek kodu deklarujący zmienną fpsC wygląda tak:
    fpsC = gameObject.GetComponent
    Zatem… Może nie znajdować wymaganego komponentu. Oznaczałoby to, że skrypt PlayerStats umieściłeś w złym miejscu. Powinien być dodany do tego samego obiektu co skrypt FirstPersonController.

  • makox

    mnie to nie działa wyskakuje mi błąd :( a kopiuje cały skrypt ze strony i nie działa

    • Prawdopodobnym problemem jest to: że kopiujesz tylko skrypt.
      Po za posiadaniem dobrego kodu, należy też mieć przypisanego do dobrego obiektu, mieć odpowiednią hierarchię obiektów oraz zdeklarowane wszystkie zmienne publiczne.
      Polecam przerabiać tutorial po kolei, czytając wszystkie instrukcję. Prawdopodobnie pominąłeś jakiś istotny fragment i dlatego kod nie działa.

  • Robror

    Mam problem. Po skopiowaniu skryptu i dodaniu go do First Person Controller, w skrypcie PlayerStats nie mam możliwości przypisaniu tekstur a w konsoli wywala błąd: Element: „UnityStandardAssets.Characters.FirstPerson.FirstPersonController” nie zawiera definicji „CanRun”, a nie odnaleziono metody rozszerzającej „CanRun” , która przyjmuje pierwszy argument typu: „UnityStandardAssets.Characters.FirstPerson.FirstPersonController” (czy nie brakuje dyrektywy „using” lub odwołania do zestawu?). Z góry mówię, że mam Unity 5.3.2.f1 .

    • Błąd popełniany notorycznie przez sporą liczbę osób. Pominąłeś całkowicie rozdział: „Run Forest, run! – Unity v.5.0”, gdzie trzeba było wykonać kilka dodatkowych kroków, bez których kod nie będzie działał.
      Zalecam czytanie całych tutoriali i wykonywanie wszystkich kroków pokolei. Samo kopiowanie kodu, będzie doprowadzało do takich problemów jak ten, niemal w każdej części tutoriala.

    • Robror

      Błąd z brakiem możliwości dodania tekstur wystąpił już w pierwszym kroku tutorialu, jestem w tym zielony i nie wiem dlaczego tak właśnie się zrobiło. Chodzi tu o krok „Wyświetlanie Statystyk”.

    • Ale podany przez Ciebie błąd, mówi o tym, że brakuje definicji CanRun w skrypcie, a nie ma tutaj słowa o teksturze.

    • Robror

      Napisałem również o braku możliwości przypisania tekstur w PlayerStats.cs po ukończeniu „Wyświetlanie statystyk”. Nie rozumiem dlaczego w PlayerStats w FPScontroller nie mogę przypisać tekstury (nie mam np. możliwości przypisania tekstury do health, gdzie u pana można było to zrobić od razu po ukończeniu pierwszej części tutorialu).

    • Robror

      Dziękuję bardzo, problemem była moja ślepota i ignorowanie wskazówek MonoDevelop, nie wstawiłem jednego ; . Przepraszam za kłopot i dziękuję za pomoc :)

  • Robror

    Sorry, że zawracam wam tyłki, ale mam kolejny problem, mianowicie: po skończeniu się staminy na skutek biegu, postać dalej biegnie i nie ma znaczenia stamina <0.

    • W skrypcie FirstPersonController została zmieniona linijka na:
      speed = m_IsWalking ? m_WalkSpeed : m_CanRun ? m_RunSpeed : m_WalkSpeed;
      Do tego w Twoim skrypcie jest fragment:

      if (currentStamina > 0) {
      fpsC.CanRun = true;
      } else {
      fpsC.CanRun = false;
      }
      ?

    • Robror

      Tak mam wszystko tak jak w tutorialu.

    • Proponuję w funkcji FixedUpdate wypisać wartość zmiennej currentStanima, żeby zobaczyć czy faktycznie spada poniżej wymaganej wartości. Ewentualnie masz tak niskie opóźnienie przy regeneracji staminy, że zdąży się ona zregenerować w trakcie biegu i wartość nigdy nie jest mniejsza od 0, przez co cały czas możesz biec.

    • Robror

      W FixedUpdate mam tak
      void FixeUpdate ()

      {

      if (chCont.isGrounded && Input.GetKey (KeyCode.LeftShift)){

      currentStamina -= 1;

      currentStamina = Mathf.Clamp (currentStamina, 0, maxStamina);

      }

      if (currentStamina > 0) {

      fpsC.CanRun = true;

      } else {

      fpsC.CanRun = false;

      }

      if (chCont.isGrounded && Input.GetKey (KeyCode.LeftShift) && lastPosition != transform.position && currentStamina > 0) {

      lastPosition = transform.position;

      currentStamina -= 1;

      currentStamina = Mathf.Clamp (currentStamina, 0, maxStamina);

      canRegenerate = 5.0f;

      }

    • Funkcja powinna wyglądać tak:

      void FixedUpdate ()
      {
      float speed = walkSpeed;

      if(chCont.isGrounded && Input.GetKey(KeyCode.LeftShift) && lastPosition != transform.position && currentStamina > 0) {
      lastPosition = transform.position;
      speed = runSpeed;
      currentStamina -= 1;
      currentStamina = Mathf.Clamp(currentStamina, 0, maxStamina);
      canRegenerate = 5.0f;
      }

      chMotor.movement.maxForwardSpeed = speed;
      }

  • Bartłomiej Rybak

    Witam,
    używam Unity w wersji 5.x i wyświetla mi się mianowicie taki błąd: The name ‚chMotor’ does not exist in the current context. Próbowałem nawet skopiować cały kod i ciągle jest ten problem. Mogę się mylić ale domyślam się, że chodzi o to, że chMotor jest „puste”.

    • Bartłomiej Rybak

      Chyba sobie z tym poradziłem. Usunąłem w ogóle tę linijkę: chMotor.movement.maxForwardSpeed = speed; i teraz wszystko działa.
      Natomiast mam problem teraz z tym, że mimo iż stamina spada do 0, postać może ciągle biec.

    • Jest to notoryczny problem, najczęściej wynikający z pominięcia rozdziału:
      Run Forest, run! – Unity v.5.0
      Trzeba zmodyfikować inne pliki i jest tam wszystko opisane.

      Do tego, jeśli masz zmienną chMotor to skopiowałeś kod dla Unity w wersji 4, zamiast ten dla wersji 5, stąd pozostałe błędy.

  • Amelia Trzaska

    Witam.
    Mam problem dotyczący skryptów z pierwszego etapu tego poradnika:

    Assets/skrypty/Zycia.cs(22,10): error CS1547: Keyword void' cannot be used in this context

    Assets/skrypty/Zycia.cs(22,6): error CS0650: Syntax error, bad array declarator. To declare a managed array the rank specifier precedes the variable's identifier. To declare a fixed size buffer field, use the fixed keyword before the field type

    Assets/skrypty/Zycia.cs(23,1): error CS1525: Unexpected symbol {‚, expecting )', ,’, or `;’

    Assets/skrypty/Zycia.cs(72,14): error CS0116: A namespace can only contain types and namespace declarations

    Assets/skrypty/Zycia.cs(80,1): error CS8025: Parsing error

    Wiem, że rozwiązania mogą być dziecinnie proste, ale dopiero tydzień się tym bawię i nie jestem obeznana. Moja wersja Unity (jak by była potrzebna) to 5.3.3f1.
    Pozdrawiam i czekam na odpowiedź

  • Skydrovski

    Assets/PlayerStats.cs(4,14): error CS0101: The namespace global::' already contains a definition for PlayerStats’

    • Masz w projekcie dwa skrypty o nazwie PlayerStats, albo przynajmniej 2 klasy o tej samej nazwie.

    • Skydrovski

      teraz coś takiego Assets/PlayerGUI/PlayerStats.cs(106,17): error CS0103: The name `chMotor’ does not exist in the current context

    • Prawdopodobnie wykorzystujesz Unity w wersji 5, a operujesz na skryptach dla wersji 4. W domyślnych FirstPersonControllerze w Unity 4 był używany Character Motor, w wersji 5 go nie ma.

      Rozdziały są podzielone na wersję 4 i 5, więc trzeba tutaj nieco uważniej czytać.

    • Skydrovski

      Skopiowałem cały skrypt do wersji 5 i dodałem kilka funkcji do Fpscontroler.cs jak w tekście.

    • OK. Już widzę. W kompletnym skrypcie był błąd w funkcji FixedUpdate, zamiast linijki z chMotor, powinno być:

      if (currentStamina > 0) {
      fpsC.CanRun = true;
      } else {
      fpsC.CanRun = false;
      }

  • Franek Barszcz

    Mam pewien problem…

    Assets/Skrypty/PlayerStats.cs(107,30): error CS1061: Type UnityStandardAssets.Characters.FirstPerson.FirstPersonController' does not contain a definition for CanRun’ and no extension method CanRun' of type UnityStandardAssets.Characters.FirstPerson.FirstPersonController’ could be found (are you missing a using directive or an assembly reference?)

    • Korzystasz z Unity 5, a wykonałeś kroki poradnika dla Unity w wersji 4, dlatego brakuje Ci pewnych rzeczy. Przykładowo zmienną CanRun dokładamy w kroku: Run Forest, run! – Unity v.5.0. Skoro Ci go brakuje, to na 100% ten krok pominąłeś.
      Radzę prześledzić jeszcze raz dokładnie tą część, to błąd się sam rozwiąże.

  • Bartek Januchta

    Assets/scripts/PlayerStats.cs(119,18): error CS1061: Type UnityStandardAssets.Characters.FirstPerson.FirstPersonController' does not contain a definition for CanRun’ and no extension method CanRun' of type UnityStandardAssets.Characters.FirstPerson.FirstPersonController’ could be found (are you missing a using directive or an assembly reference?)

    • To samo, co w co 2 komentarzu pod tym postem, cytuje jedną z moich odpowiedzi:
      „Korzystasz z Unity 5, a wykonałeś kroki poradnika dla Unity w wersji 4, dlatego brakuje Ci pewnych rzeczy. Przykładowo zmienną CanRun dokładamy w kroku: Run Forest, run! – Unity v.5.0. Skoro Ci go brakuje, to na 100% ten krok pominąłeś.

      Radzę prześledzić jeszcze raz dokładnie tą część, to błąd się sam rozwiąże.”

  • Bartek

    Witam,
    mam pewien problem z tym tutorialem, mianowicie nie mogę załadować żadnej części tego tutoriala od 4 wzwyż. Czy któraś z osób robiąca ten kurs miała taki problem lub moderatorzy wiedzą coś na ten temat?

    Dodam, że używam Firefox’a, ale sprawdziłem też na Chrom’ie i tam również nie działa.

  • xSieniu

    Mam problem, wszystko działa – schodzi sprint, bez „Forest Run (5.x)” działa również zadanie obrażeń poprzez kliknięcie „P” – natomiast po dodaniu forest Run i odpaleniu gry pojawia się coś takiego (screen) i po naciśnięciu klawisza P nic się nie wyświetla (poza dodaniem kolejnej linijki w debugerze (?) za każdym razem gdy klikne P, ta linijka powiela się) Proszę o pomoc

    P.S – świetny poradnik, dobrze że są ludzie którzy chcą pomóc początkującym twórcom! Pozdrawiam!

    • Wygląda jak by Ci gubiło teksturę, która ma się wyświetlić jako efekt trafienia, bo jej zwyczajnie nie znajduje.

      P.S. – Ciesze się, że poradnik się podoba :)

  • Myko Macura

    Ej w tej chwili mam taki problem, że mi nie znajduje na najnowszej wersji Unity klasy CanRun. Pomoże ktoś?

    • CanRun jest zmienną. ;)

      Nie znajduje jej, bo zmienną dodajemy sami w rozdziale „Run Forest, run! – Unity v.5.0”. Wiele osób często pomija ten krok i przez to pojawia się błąd.

    • Myko Macura

      Ok thx

  • Kot

    Mi nie wyświetla w ogóle tych pasków(dodałem teksturki i zrobiłem to co kazałeś w Run Forest, run! – Unity v.5.0. mam Unity v.5.3.5f1) jedyne co mi się pokazuje to:
    The referenced script on this Behaviour (Game Object ‚FPSController’) is missing!
    lub

    MissingReferenceException: The object of type ‚Object’ has been destroyed but you are still trying to access it.

    Your script should either check if it is null or you should not destroy the object.

    UnityEditor.Editor.IsEnabled () (at C:/buildslave/unity/build/Editor/Mono/Inspector/Editor.cs:589)

    UnityEditor.InspectorWindow.DrawEditor (UnityEditor.Editor editor, Int32 editorIndex, Boolean rebuildOptimizedGUIBlock, System.Boolean& showImportedObjectBarNext, UnityEngine.Rect& importedObjectBarRect) (at C:/buildslave/unity/build/Editor/Mono/Inspector/InspectorWindow.cs:1151)

    UnityEditor.InspectorWindow.DrawEditors (UnityEditor.Editor[] editors) (at C:/buildslave/unity/build/Editor/Mono/Inspector/InspectorWindow.cs:1028)

    UnityEditor.InspectorWindow.OnGUI () (at C:/buildslave/unity/build/Editor/Mono/Inspector/InspectorWindow.cs:352)

    System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Reflection/MonoMethod.cs:222)

    • Gdzieś w kodzie masz funkcje Destroy, po której wykonujesz jeszcze jakiś kod. Tak wnoszę po komunikacie błędu.

  • Eccio

    Czemu nie działa mi characterMotor i wszystko z nim związane?
    Jest wyświetlane na czerwono w skrypcie ale nie wyświetla żadnych błędów po prostu nie działa bieganie. Mam unity 4.7.

    PS. Bardzo fajny poradnik.

    • Ciężko mi coś powiedzieć. Pierwszy raz ktoś zgłasza taki problem. A czy CharaceterMotor na pewno jest dodany do obiektu, do którego przypisany jest skrypt? Możesz spróbować usunąć komponent i dodać go jeszcze raz.

    • Eccio

      Ten problem został już rozwiązany (aktualizacja do 5.2 :]) za to pojawił się kolejny związany z CanRun, którego nie czyta i position po transform.

      void FixedUpdate()

      {

      float speed = walkSpeed

      if(chCont.isGrounded && Input.GetKey (KeyCode.LeftShift) && lastPosition != transform.position && currentStamina > 0) {

      lastPosition = transform.position;

      speed = runSpeed;

      currentStamina -= 1;

      currentStamina = Mathf.Clamp (currentStamina, 0, maxStamina);

      }

      if(currentStamina > 0) {

      fpsc.CanRun = true;

      } else {

      fpsc.CanRun = false;

      }

      }

    • CanRun nie czyta, bo trzeba je dodać do domyślnego kodu. Opisane to jest w ostatnim rozdziale. :)

  • kimix

    skopiowałem cały skrypt z końca i mam błąd

    Assets/NewBehaviourScript.cs(107,30): error CS1061: Type UnityStandardAssets.Characters.FirstPerson.FirstPersonController' does not contain a definition for CanRun’ and no extension method CanRun' of type UnityStandardAssets.Characters.FirstPerson.FirstPersonController’ could be found (are you missing a using directive or an assembly reference?)

    mógłbyś mi wytłumaczyć jak to naprawić?

    • Wystarczy przeczytać treść tutoriala. Nie zrobiłeś jednej rzeczy, opisanej w rozdziale: „Run Forest, run! – Unity v.5.0”.

      Jak daję skrypt na końcu to raczej do sprawdzenia sobie, ale polecam czytać wszystko po kolei, bo samo kopiowanie skryptów, niczego nie nauczy.

  • Marcin

    ahh… ten skrypt do końca nie działa wywala mi 2 błędy oby dwa są w tych linijkach które są zakreślone na czerwono aaa… gdyby to miało jakieś znaczenie kożystam z unity 5.0

    • Wystarczy przeczytać treść tutoriala. Nie zrobiłeś jednej rzeczy, opisanej w rozdziale: „Run Forest, run! – Unity v.5.0”.

      Jak daję skrypt na końcu to raczej do sprawdzenia sobie, ale polecam czytać wszystko po kolei, bo samo kopiowanie skryptów, niczego nie nauczy.

  • Adrian Piecek

    fpsC.CanRun = true;
    tu i
    fpsC.CanRun = false;
    tu pokazuje mi błąd. Czemu? Korzystam z wersji 5.3.4

    • Problem jest opisany w jednym z rozdziałów poradnika. Wystarczy przeczytać całość dokładnie, ewentualnie resztę komentarzy, bo problem pojawia się notorycznie, a wynika z niedoczytania rozdziału: Run Forest, run! – Unity v.5.0

    • Adrian Piecek

      Tam często piszesz: Dajemy sobie dwie zmienne, ale mało kiedy napiszesz, gdzie je dajemy :/

    • Adrian Piecek

      Assets/Standard Assets/Characters/FirstPersonCharacter/Scripts/FirstPersonController.cs(108,22): error CS0111: A member `UnityStandardAssets.Characters.FirstPerson.FirstPersonController.FixedUpdate()’ is already defined. Rename this member or use different parameter types
      takie coś mi wyskakuje a kiedy kliknę to, pokazuję funkcję
      private void FixedUpdate()
      w FirstpersonController.cs

    • Napisałeś całą funkcję FixedUpdate od nowa. Ona tam już jest. Wystarczy ją edytować.

    • Adrian Piecek

      I tak zrobiłem, a jak to zrobiłem, z jednego błędu wyskakuje 10 typu:
      Nieznany znak „;”
      Nieznany znak „.”
      i tak dalej
      dziękuje, że poświęcasz mi swój cenny czas

    • Pokaż swój przerobiony skrypt, tylko najlepiej przez jakieś pastebin, bo wklejony na żywca w komentarz nie daje się czytać ;)
      Nie ma za co ;)

    • Adrian Piecek

      private void FixedUpdate()

      {
      if(chCont.isGrounded && Input.GetKey(KeyCode.LeftShift)) {
      currentStamina -= 1;
      currentStamina = Mathf.Clamp(currentStamina, 0, maxStamina);
      }

      if (currentStamina > 0) {
      fpsC.CanRun = true;
      } else {
      fpsC.CanRun = false;
      }
      }

      {
      float speed;
      GetInput(out speed);
      // always move along the camera forward as it is the direction that it being aimed at
      Vector3 desiredMove = transform.forward*m_Input.y + transform.right*m_Input.x;

      // get a normal for the surface that is being touched to move along it
      RaycastHit hitInfo;
      Physics.SphereCast(transform.position, m_CharacterController.radius, Vector3.down, out hitInfo,
      m_CharacterController.height/2f);
      desiredMove = Vector3.ProjectOnPlane(desiredMove, hitInfo.normal).normalized;

      m_MoveDir.x = desiredMove.x*speed;
      m_MoveDir.z = desiredMove.z*speed;

      if (m_CharacterController.isGrounded)
      {
      m_MoveDir.y = -m_StickToGroundForce;

      if (m_Jump)
      {
      m_MoveDir.y = m_JumpSpeed;
      PlayJumpSound();
      m_Jump = false;
      m_Jumping = true;
      }
      }
      else
      {
      m_MoveDir += Physics.gravity*m_GravityMultiplier*Time.fixedDeltaTime;
      }
      m_CollisionFlags = m_CharacterController.Move(m_MoveDir*Time.fixedDeltaTime);

      ProgressStepCycle(speed);
      UpdateCameraPosition(speed);
      }

    • Czy da radę jednak wrzucić kod przez pastebin? Tak jak pisałem,w takiej formie jest on kompletnie nieczytelny. W PasteBinie możesz od razu wrzucić cały plik.

    • Adrian Piecek

      mam nadzieję, że o to ci chodziło, gdyż nigdy przez coś typu pastebin nie korzystałem

    • Adrian Piecek
    • Zostawiłeś blok kodu luzem. Masz coś takiego:
      private void FixedUpdate()
      {
      // Twój kod
      }

      {
      // Stara wartość FixedUpdate
      }

      A powinno być tak:

      private void FixedUpdate()
      {
      // Twój kod
      // Stara zwartość FixedUpdate
      }

    • Adrian Piecek

      Dziękuje, jesteś niesamowity :)

    • Polecam zmierzyć się z tym jeszcze raz na spokojnie od początku, dokładnie czytając instrukcję. Wszystko powinno działać. Nikt nie zgłaszał problemu z tym fragmentem.

    • Adrian Piecek

      Pomoc?

  • Łukasz

    Gdzie znajduje się linijka speed = m_IsWalking ? m_WalkSpeed : m_RunSpeed; bo nigdzie jej nie ma?!

    • Łukasz

      Znalazłem. Linijka 225.

  • Adrian Piecek

    Kilka dni spędziłem na szukaniu błędów, nie spałem nocami żeby przeanalizować ten artykuł, kilka godzin spędziłem na doszukaniu się w komentarzach mojego problemu. I kurna co?
    GÓWNO!

  • Adrian Piecek

    Czy ktoś może mi dać skopiuj wklej tego jak to powinno wy glądać w FirstPersonController.cs na wersję 5.0.x?
    Podesłałby mi ktoś całość skryptu FirstPersonController.cs
    Bo już się bardzo namęczyłem na zrobieniu tego według tutoriala, a nic nie pomaga.
    Proszę, a wręcz błagam. Dziękuję.

  • Pastebin się nie ładuje, bo mają przeciążone serwery, ale z kodu błędu wynika, że nie ma zadeklarowanych tych zmiennych. Trzeba je po prostu dopisać tam, gdzie deklarujesz resztę zmiennych.

    • lisekmiki

      Dzięki już wszystko śmiga.

  • Marcin Iwanowski

    {
    private bool m_CanRun = true;
    public bool CanRun

    get { return m_CanRun; }
    set { m_CanRun = value; }
    }
    to na koniec fpscontrollera?
    no i ten CanRun

    • Prawdopodobnie kodzik jest nie tam gdzie powinien. Wrzuć kod FirstPersonControllera do pasebin i podeślij tutaj, to rozgryziemy co jest nie tak.

  • Marcin Iwanowski

    pomoże ktoś? błędy mam i wgl najlepiej by było gdyby ktoś skopiował fpscontroller i wklejił w odpowiedź te błędy:

    Assets/Standard Assets/Characters/FirstPersonCharacter/Scripts/FirstPersonController.cs(258,14): error CS0116: A namespace can only contain types and namespace declarations
    i
    Assets/Standard Assets/Characters/FirstPersonCharacter/Scripts/FirstPersonController.cs(260,1): error CS8025: Parsing error

    prosze o wmiare szybką pomoc ):
    no i CanRun podkreśla na czerwono

  • Radek Mazowiecki

    świetny tutek. Nie działa mi opcja lastPosition. próbowałem już czytać osobno pozycje x i Y, i nic.
    lastPosition i czytanie obecnej pozycji zwracają tę sama wartość i niewiem gdzie jest błąd.

    obszedłem to sprawdzając czy gracz nie wciska jednocześnie shifta i któregokolwiek klawisza kierunkowego

    • Sprytne rozwiązanie.

      lastPosition ogólnie wprowadza nam naszą ostatnią pozycję i powinno zwracać różne wyniki tylko w przypadku poruszania się. Nie wiem w sumie z czego mógłby wynikać błąd, że nawet w trakcie poruszania się, wynik jest ten sam.

  • Albert

    Wyświetla mi się taki oto błąd: error CS0131: The left-hand side of an assignment must be a variable, a property or an indexer. Nie za bardzo rozumiem z czego wynika ten błąd, wszystko działało do momntu dodania wytrzymałości. Dodam że robiłem wszystko zgodnie z poradnikiem RunForest v5. Próbowałem się posilić kodem który prezentujesz na koniec, ale znacząco różni się od kodu, który jest omawiany w RunForest v5. https://uploads.disquscdn.com/images/e78194a285fab84734ef307efb8aa6c2b9d589fb0b687213782cdee27e62a5d6.png

    • Możliwe że zmienna, której dotyczy błąd jest niezainicjowana.

    • Albert

      Pracuję w środowisku monodevelop i jeśli coś jest niezainicjalizowane to z automatu mi podświetla taką zmienną. Masz może inne sugestie?

    • Pokaż cały kod w pastebin :)

    • Albert
    • Błędem jest ta linijka:
      CanvasRenderer = 5.0f;

      1) Przypisujesz wartość do klasy, a nie do zmiennej.
      2) Nawet jak by to była zmienna, to nie miałbyś jej nigdzie zadeklarowanej.

    • Albert

      Dzięki wielkie za pomoc :) wszystko już śmiga

  • UrbanMaster

    Dzień dobry! Mam Unity 5.4.2f2 i mam problem otóż kiedy robię script (skopiowałem gotowy do 5.x) wyskakuje mi błąd : Assets/MaterialPreviewer/Scripts/PlayerStats.cs(143,1): error CS8025: Parsing error

    Proszę o szybką odpowiedź i z góry dziękuje:).

    • Masz jakiś błąd w kodzie. Pokaż kod przez PasteBin i zobaczymy o co chodzi.

    • UrbanMaster

      Problem zniknął po edytowaniu i dodaniu linijek o których nie doczytałem ten problem zniknął.Jednak po chwili pojawił się błąd: Assets/MaterialPreviewer/Scripts/PlayerStats.cs(97,23): error CS1525: Unexpected symbol `private’

    • Pokaż wspomnianą w błędzie linijkę, oraz najlepiej po 2 w górę i w dół od niej.

    • UrbanMaster

      Po usunięciu ‚Private’ wyskoczyły mi kolejne błędy:
      Assets/MaterialPreviewer/Scripts/PlayerStats.cs(99,76): error CS0165: Use of unassigned local variable lastPosition'

      Assets/MaterialPreviewer/Scripts/PlayerStats.cs(108,30): error CS1061: Type UnityStandardAssets.Characters.FirstPerson.FirstPersonController’ does not contain a definition for CanRun' and no extension method CanRun’ of type UnityStandardAssets.Characters.FirstPerson.FirstPersonController' could be found (are you missing a using directive or an assembly reference?)

      Assets/MaterialPreviewer/Scripts/PlayerStats.cs(110,30): error CS1061: Type UnityStandardAssets.Characters.FirstPerson.FirstPersonController’ does not contain a definition for CanRun' and no extension method CanRun’ of type `UnityStandardAssets.Characters.FirstPerson.FirstPersonController’ could be found (are you missing a using directive or an assembly reference?)

      Link dom kodu: http://pastebin.pl/view/a72f6f1a

    • Pierwszy błąd wynika z tego, że masz zmienną „lastPosition” zadeklarowaną dwa razy. Raz globalnie (tak jak powinno być) i raz lokalnie w funkcji (można wywalić).

      Dwa pozostałe błędy wynikają z tego, że nie zmodyfikowałeś kodu FirstPersonController tak jak jest to opisane w poradniku.

    • UrbanMaster

      Dziękuje ci skrypt PlayerStats nie ma już problemów!

      Jedank jeśli chodzi o skrypt FirstPersonComntroller wkleiłem linijki tak jak to zrozumiałem i wyskoczyło mi 8 błędów:

      Assets/Standard Assets/Characters/FirstPersonCharacter/Scripts/FirstPersonController.cs(15,40): error CS1519: Unexpected symbol =' in class, struct, or interface member declaration

      Assets/Standard Assets/Characters/FirstPersonCharacter/Scripts/FirstPersonController.cs(15,68): error CS1519: Unexpected symbol :’ in class, struct, or interface member declaration

      Assets/Standard Assets/Characters/FirstPersonCharacter/Scripts/FirstPersonController.cs(15,92): error CS1519: Unexpected symbol :' in class, struct, or interface member declaration

      Assets/Standard Assets/Characters/FirstPersonCharacter/Scripts/FirstPersonController.cs(15,105): error CS1519: Unexpected symbol ;’ in class, struct, or interface member declaration

      Assets/Standard Assets/Characters/FirstPersonCharacter/Scripts/FirstPersonController.cs(48,24): error CS1519: Unexpected symbol =' in class, struct, or interface member declaration

      Assets/Standard Assets/Characters/FirstPersonCharacter/Scripts/FirstPersonController.cs(48,59): error CS1519: Unexpected symbol (‚ in class, struct, or interface member declaration

      Assets/Standard Assets/Characters/FirstPersonCharacter/Scripts/FirstPersonController.cs(49,22): error CS1519: Unexpected symbol =' in class, struct, or interface member declaration

      Assets/Standard Assets/Characters/FirstPersonCharacter/Scripts/FirstPersonController.cs(49,114): error CS1519: Unexpected symbol (‚ in class, struct, or interface member declaration

      Link do kodu: http://pastebin.pl/view/1f453302

    • Mocno przekombinowałeś.

      Nie dodałeś zmiennej m_CanRun.

      Kod od speed = (..) wstawiłeś gdzieś przy deklaracji zmiennej speed, a nie zamiast linijki, którą podałem.

      Nie dodałeś Getera i Setera (drugi fragment kodu podany w rozdziale).

  • Linijkę której dotyczy błąd masz podaną w błędzie:
    Assets/MaterialPreviewer/Scripts/PlayerStats.cs(97,23)
    Tutaj chodzi o linijkę 97.

    Masz tam takie coś:
    private Vector3 lastPosition;
    co ogólnie jest poprawnym zapisem, ale wewnątrz klasy, ale nie wewnątrz funkcji. Jak usuniesz private to powinno działać.

    Raczej nie udostępniam gotowców, bo są „niepedagogiczne”, wszyscy wtedy kopiują na ślepo kod, nie zapoznając się nawet z nim, co kończy się zalewem dodatkowych pytań. Jeśli uważnie przeczytasz rozdział i będziesz wykonywał polecenia krok po kroku, wszystko powinno się udać.

  • Miszczu

    a ja mam błąd : Assets/Standard Assets/Characters/FirstPersonCharacter/Scripts/FirstPersonController.cs(7,14): error CS0116: A namespace can only contain types and namespace declarations

    • Oprócz kodu błędy zawsze załącz kod, albo jego fragment (przez pastebin). Bez tego mogę wróżyć z fusów.

  • Miszczu

    ..

  • Miszczu

    dzięki już naprawiłem błąd :D

  • Wilczur

    https://uploads.disquscdn.com/images/af5aee68663899589f5fff90673f8f2a0fa1166b79c9ff08c53d99fa16a9d4fe.png
    Witam, mam problem. Po wyeliminowaniu wielu błędów, dalej mam 5 zbyt trudnych jak dla mnie do rozwiązania. Związane są z nazwą „walkSpeed”,”runSpeed”,”canRegenerate” i dwoma elementami Unity Standard Assets. Błagam o pomoc bez odsyłania do robienia od nowa, bo skrypt piszę już trzeci raz.
    using UnityEngine;
    using System.Collections;

    public class PlayerStats : MonoBehaviour {

    private float maxHealth = 100;
    private float currentHealth = 100;
    private float maxArmour = 100;
    private float currentArmour = 100;
    private float maxStamina = 100;
    private float currentStamina = 100;

    private float barWidth;
    private float barHeight;

    private CharacterController chCont;
    private UnityStandardAssets.Characters.FirstPerson.FirstPersonController fpsC;
    private Vector3 lastPosition;

    private bool m_CanRun = true;

    public Texture2D healthTexture;
    public Texture2D armourTexture;
    public Texture2D staminaTexture;

    public bool CanRun
    {
    get { return m_CanRun; }
    set { m_CanRun = value; }
    }

    void Awake()
    {
    barHeight = Screen.height * 0.02f;
    barWidth = barHeight * 10.0f;

    chCont = GetComponent();
    fpsC = gameObject.GetComponent ();

    lastPosition = transform.position;
    }

    void OnGUI()
    {
    GUI.DrawTexture(new Rect(Screen.width – barWidth – 10,
    Screen.height – barHeight – 10,
    currentHealth * barWidth / maxHealth,
    barHeight),
    healthTexture);
    GUI.DrawTexture(new Rect(Screen.width – barWidth – 10,
    Screen.height – barHeight * 2 – 20,
    currentArmour * barWidth / maxArmour,
    barHeight),
    armourTexture);
    GUI.DrawTexture(new Rect(Screen.width – barWidth – 10,
    Screen.height – barHeight * 3 – 30,
    currentStamina * barWidth / maxStamina,
    barHeight),
    staminaTexture);
    }

    void takeHit(float damage)
    {
    if(currentArmour > 0) {
    currentArmour -= damage;
    if(currentArmour 0) {
    lastPosition = transform.position;
    speed = runSpeed;
    currentStamina -= 1;
    currentStamina = Mathf.Clamp(currentStamina, 0, maxStamina);
    canRegenerate = 5.0f;
    }

    if (currentStamina > 0) {
    fpsC.CanRun = true;
    } else {
    fpsC.CanRun = false;
    }
    }
    }

    • Wybacz, że teraz odpisuje ale jakoś wcześniej umknął mi ten komentarz.

      Błędy są proste:
      Pierwsze 3 wynikają z tego, że używasz 3 zmiennych, których nie zadeklarowałeś wcześniej. Wystarczy na początku skryptu je zadeklarować.

      Pozostałe błędy wynikają z tego, że CanRun dopisałeś do skryptu PlayerStats, zamiast do FirstPersonController jak to jest opisane w rozdiale „Run Forest, run! – Unity v.5.0”.

  • TetraHydroSoft

    Siemka, mam problem robiłem skrypt zgodnie z poradnikiem i 10 razy się upwniałem czy dobrze napisałem mimo to skrypt przestał dziłać od kiedy zacząłem przepisywać skrypt na staminę niby żadnych mi błędów kompilator nie pokazuje ale jednak mimo to gra nie chce się włączyć więc zrezygnowałem z tego przepisanego skryptu przezemnie i przeżuciłęm się na twój gotowy na twoim nie wywala błędów i gra się odpala ale ten skrypt wogóle nie działa właściwie działa tylko wyświetlenie tych 3 pasków lecz kiedy klikam P nic się nie dzieje i kiedy biegam stamina mi też nie ubywa. Wie ktoś o co chodzi

    • A uzupełniłeś wszystkie zmienne z poziomu okna inspektor?

  • TetraHydroSoft

    Uprzedzając pytanie tak… zmodyfikowałem skrypt FirstPersonController

  • Pingback: Unity3d FPS Tutorial #12 - Animacja postaci przeciwnika. Animator | mWin()

  • Pingback: Unity3d FPS Tutorial #7 - Zbieranie przedmiotów | mWin()

  • Dawid Dettlaff

    https://uploads.disquscdn.com/images/2ba40c73586ff484d15da42ea72d3ec648f27722b082aabac0bf08a4c157e463.png
    Witam, mam problem z CharacterMotor. Czy da się to jakoś poprawić aby działało ?

    • W wersji Unity 5 i wyżej nie ma już tego komponentu. Musisz wykonywać polecenia z podrozdziałów dla Unity 5. :)

  • Atom

    https://uploads.disquscdn.com/images/dc40728381ca6d8cd1de2aa1bbcb767b91ced81a4ac014c4b13ff73d9d9cf6f5.png Proszę o pomoc! Problem wygląda następująco: zrobiłem wszystko jak na tym odcinku ale wyskakuje mi błąd w skrypcie FirstPersonController.cs a dokładnie wygląda on tak :
    Assets/Standard Assets/Characters/FirstPersonCharacter/Scripts/FirstPersonController.cs(52,17): error CS1014: A get or set accessor expected
    Jest tam funkcja ” private void Start() ”
    i właśnie podkreśla mi „void ” na czerwono i nwm jak tem problem rozwiązać :(
    Jeszcze raz proszę o pomoc.

  • Wojciech Machulski

    Bawiłem się z tym długo i doszedłem do 2 errorów CS1518 i CS1022
    void takeHit(float damage)
    {
    if(currentArmour > 0) {
    currentArmour -= damage;
    if(currentArmour < 0) {
    currentHealth += currentArmour;
    currentArmour = 0;
    }
    } else {
    currentHealth -= damage;
    }

    currentArmour = Mathf.Clamp(currentArmour, 0, maxArmour);
    currentHealth = Mathf.Clamp(currentHealth, 0, maxHealth);
    }

    currentArmour = Mathf.Clamp(currentArmour, 0, maxArmour);
    currentHealth Mathf.Clamp(currentHealth, 0, maxHealth);
    }
    }

    • Bez pełnej treści błędów, nie jestem w stanie pomóc.

    • Wojciech Machulski

      Error CS0116: W przestrzeni nazw nie mogą występować bezpośrednio elementy członkowskie, takie jak pola lub metody. (CS0116) (Assembly-CSharp-firstpass)
      : Error CS1022: Oczekiwano definicji typu lub przestrzeni nazw albo znacznika końca pliku. (CS1022) (Assembly-CSharp-firstpass)

    • Trochę to wszystko chaotyczne. Będę niestety musiał poprosić o więcej danych:
      1) Pełny kod skryptu w którym masz błędy (najlepiej przesłany przez PasteBin)
      2) Screena konsoli z wyświetlonymi błędami.

  • Jasiek

    Po zedytowaniu kontrolera wygląda to tak : http://pastebin.com/mprBjDJY

    I wyskakują mi błędy
    Assets/Standard Assets/Characters/FirstPersonCharacter/Scripts/FirstPersonController.cs(359,100): error CS1012: Too many characters in character literal
    Assets/Standard Assets/Characters/FirstPersonCharacter/Scripts/FirstPersonController.cs(424,0): error CS1024: Wrong preprocessor directive
    Assets/Standard Assets/Characters/FirstPersonCharacter/Scripts/FirstPersonController.cs(1,0): error CS1525: Unexpected symbol `u’

    • Coś mi się tutaj nie zgadza o tyle, że Twoje błędy wskazują na problemy z liniami 359 i 424, kiedy załączony plik kończy się na linii 265. Trzeci błąd pojawia się często, kiedy gdzieś zapodzieje się luźna literka, w tym wypadku literka u w pierwszej linii pliku, gdzie u Ciebie nie widzę niczego nadzwyczajnego.

    • Jasiek

      To Nic nie poradzimy?

    • A jeżeli wycofasz zmiany z tego pliku, to błąd dalej wyskakuje, czy nie?

    • Jasiek

      Mógłby pan podesłać mi zdedtowany plik kontrolera 1 osoby?
      Bo jak widać na zdjęciu niezła maniana się zrobiła tam .. https://uploads.disquscdn.com/images/30ab5e25eb0d20fe1757ed88559fa502c8be0be6e77eaf9d465f669a2537945f.png

    • Niestety nie dysponuje tym plikiem w takiej formie (poradnik ma swoje lata). Proponuje Ci usunąć z projektu paczkę Characters i zaimportować ją od nowa. Powinno pomóc.

    • Jasiek

      Dobrze, zrobie tak, mam pytanie będzie poradnik do gier 2D? lub 2.5D?

    • Tak jak zapowiadałem jakiś czas temu na moim fanpage na Facebooku (polecam śledzić ;)) pracuje obecnie nad większym poradnikiem od podstaw w pełni poświęcony 2D. Na razie jestem po etapie projektowania i pracuje nad grafikami do niego. Części będą się pojawiać jak skończę całość, żeby nie było chaosu w tłumaczeniu.

    • Jasiek

      Okey dzięki, jest jakiś kontakt do pana czy tylko poprzez komentarze?

    • Przez fanpage na Facebooku, albo mailowo. Mail jest widoczny w zakładce współpraca.

    • Jasiek
    • Jasiek

      Jeszcze Sprawa nie jest rozwiązana, za każdym razem gdy edytuje firstpersoncontroller to w podglądzie jest tylko to ” u ” w 1 linijce a jak odpale to jest wszystko normalne, próbowałem zrobić nawet to jako osobny plik ale też nie działa..

    • Odpisałem Ci w wiadomości na Facebooku. :)

    • Jasiek

      Mógłby pan Wejść na FaceBooka? Mam sprawe, napisałem już, naprawiłem ale jest kolejne xD

    • Jasiek
  • Rafał Szu

    No dobra…ale w takim razie co oznacza hitTexture? Bo nie znalazłem wytłumaczenia…

  • Kuba Czebotar

    czy ktoś może mi z tym pomóc?
    Assets/Standard Assets/Characters/FirstPersonCharacter/Scripts/PlayerStats.cs(5,14): error CS0101: The namespace global::' already contains a definition for PlayerStats’

    • Masz w projekcie 2 skrypty, które zawierają klasę o nazwie PlayerStats. :)

    • Kuba Czebotar

      to napiszesz mi w jakimś pastebine albo ty jak skrypt ma wyglądąć?
      jak tak to z góry dziękuję

    • Raczej nie masz problemu z samym skryptem, tylko fakt, że utworzyłeś go dwa razy stanowi problem. Wystarczy usunąć jedną kopię i powinno być po problemie ;)