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

Temat: Przeładowanie broni i amunicja

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 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 ostatniej części daliśmy graczowi możliwość strzelania, oraz wyświetliliśmy broń. Jednak aby nie zrobić z gry kiepskiego filmu akcji klasy B, musimy ograniczyć liczbę kul, a co za tym idzie, umożliwić graczowi przeładowanie broni. Oczywiście, warto go też poinformować o posiadanym stanie amunicji.

Paczka assetów, do dzisiejszego odcinka:

Tutorial_06_assets

Dodajemy liczbę kul i magazynek

Aby obsłużyć posiadanie amunicji, musimy w ogóle dodać ją do broni. Dlatego otwieramy skrypt shooting.cs, nad którym pracowaliśmy w poprzednim odcinku. Zaczynamy od dodania kilku parametrów:

Łatwo się domyślić, co będziemy trzymać w tych zmiennych. Po pierwsze maksymalną liczbę kul, jaką może broń posiadać. Rozmiar magazynka, oraz ile kul obecnie posiadamy i ile jest w magazynku. Musimy teraz zmienić nieco system strzelania:

Dodajemy kolejny warunek, który mówi, że musimy posiadać pociski w magazynku, aby móc wystrzelić. Po drugie, w momencie wystrzału, odejmujemy kule z magazynka.

Jak pewnie dało się zauważyć, wszystkie zmienne, które zadeklarowaliśmy posiadają zdefiniowane wartości, za wyjątkiem obecnego stanu magazynka. Stało się tak, ponieważ chcemy, żeby magazynek domyślnie był wypełniony maksymalną liczbą kul. Jeżeli wprowadzilibyśmy wartość na sztywno, trzeba by było o tym pamiętać przy każdej zmianie maksymalnego rozmiaru magazynka. Dzięki prostej sztuczce, możemy o tym zapomnieć. W funkcji Start dopisujemy:

Właściwie tyle. Samo odejmowanie kul i ich posiadanie, mamy załatwione.

Wyświetlamy stan magazynka

Nie możemy jednak tego sprawdzić, jeśli nigdzie nie wyświetlamy liczby pocisków. Na początek dodajemy kolejną zmienną:

Wracamy na chwilę do Unity i dodajmy do sceny obiekt GUIText. Dla wersji: 4.5.x:  [GameObject -> Create Other -> GUI Text]. Dla wersji 4.6.x: Tworzymy pusty GameObject: [Ctrl+Shift+N], a następnie dodajemy mu komponent GUIText [Component -> Rendering -> GUI Text]

Jedyne co ja z nim zrobiłem, to usunięcie parametru Text, zwiększenie czcionki (Font Size) na 30, oraz ustawienie Anchor na middle center, aby tekst się ładnie wyświetlał. Sam obiekt nazwałem GT_ammo. Pozwoli to łatwiejsze lokalizowanie obiektów danego typu, dzięki przedrostkowi GT od GUIText. Moje ustawienia obiektu wyglądają tak:

Ustawienia obiektu GT_ammo
Ustawienia obiektu GT_ammo

Wracamy do kodu i dodajemy kod, który nam wyświetli stan magazynka:

Po pierwsze, zmieniamy położenie tekstu. Domyślnie GUIText, wyświetla się centralnie na środku ekranu, a my chcemy go w lewym dolnym. Dlatego od jego położenia odejmujemy połowę szerokości ekranu, po tym zabiegu, widzieć będziemy jedynie połowę napisu. Dlatego, musimy dodać parę pikseli, które odpowiadają wysokości i szerokości tekstu. Po tym zabiegu, napis powinien się ładnie ułożyć. Drugi ruch, to dodanie samego tekstu. Stringi łączymy plusem, wyświetlając amunicję w magazynku, slash i posiadaną amunicję zapasową.

Dodajemy przeładowanie

Mamy już system strzelania i widzimy stan amunicji. Ale, po wystrzeleniu wszystkich pocisków, zostajemy bez amunicji. Dlatego, czas zrobić przeładowanie. Znów przyda się parę zmiennych:

Po pierwsze, przyda się dźwięk przeładowania. Po drugie, jakiś czas przeładowania. Dodatkowo, robimy sobie flagę, która sprawdza czy jesteśmy w trakcie przeładowania, oraz prosty timer. Uprzedzając pytania: Nie możemy użyć współprogramu, ponieważ, pracujemy głównie na funkcji Update, w której nie powinno wykorzystywać się funkcji StartCorutine, która to odpowiada, za uruchomienie współprogramów.

Czas zareagować na przeładowanie. Dlatego, w funkcji Update dodajemy:

Warunek wydaje się skomplikowany, ale po prawdzie jest banalny. W pierwszej części mamy dwa warunki oddzielne spójnikiem LUB (||), po lewej mamy pierwszy wariant przeładowania, czyli gdy naciskamy strzał, a stan magazynka jest równy 0. Drugi wariant, to naciśnięcie przycisku Reload.  Teoretycznie, taki warunek mógłby wystarczyć. Ale po co mamy robić przeładowanie, gdy magazynek jest pełny? Stąd pojawia się ten dodatkowy zapis, mówiący o tym, że omówioną wcześniej część uruchamiamy, tylko wtedy, gdy w magazynku mamy mniej amunicji, niż maksymalnie możemy mieć. Dodatkowo, sprawdzamy czy w ogóle, posiadamy jakiś zapas amunicji. Bez sensu uruchamiać przeładowanie, gdy nie mamy czym przeładować.

Sam kod jest prosty. Podmieniamy klip dźwiękowy na klip przeładowania i go uruchamiamy, po czym zmieniamy zmienną naszą flagę isReloading na true. Dzięki temu, uruchomi się kolejny kod, znajdujący się w funkcji Update.

Jeżeli postać ma przeładować, to zaczynamy liczyć czas, bo nie chcemy, żeby przeładowanie trwało ułamek sekundy (teraz wiadomo po co był nam timer). Jeżeli timer przekroczył czas przeładowania (który, warto ustawić na tak długi czas, ile trwa nasz dźwięk przeładowania) to zaczynamy wykonywać kod.

W zmiennej pomocniczej, sprawdzamy ile amunicji musimy załadować. Czyli od maksymalnego rozmiaru magazynka, odejmujemy jego aktualny stan.

Teraz sprawdzamy, czy w zapasie posiadamy tyle amunicji. Jeśli tak, to ładujemy aktualny stan magazynka, pełną wartością, a od zapasu odejmujemy tyle, ile załadowaliśmy. W przeciwnym wypadku, dodajemy do aktualnego stanu magazynka to co zostało, a licznik posiadanego zapasu zerujemy. Jest to chyba oczywiste.

Na koniec, ustawiamy audio.clip ponownie na wystrzał (zmienialiśmy go przy rozpoczęciu przeładowania), zerujemy timer i ustawiamy flagę przeładowania na false. Dzięki temu dajemy znać, że skończyliśmy przeładowanie, a timer mamy gotowy do działania przy następnym przeładowaniu.

Została jeszcze jedna zmiana w kodzie. Nie chcemy aby gracz mógł strzelać, w czasie przeładowania. Dodajemy więc do ifa wystrzału kolejny warunek.

Jeżeli nie przeładowujemy, można strzelać.

Teraz czas wrócić do Unity. Musimy tu załatwić dwie sprawy. Po pierwsze, uzupełnić wszystkie zmienne publiczne, które dodaliśmy w ostatnich krokach. W tym zmienną GT_Text oraz reloadSound. Druga sprawa, to przycisk Reload, który nie jest domyślnie zdefiniowany. Musimy to zrobić sami. Dlatego wybieramy [Edit -> Project Settings -> Input]. W panelu Inspector rozwijamy listę Axies. Zwiększamy Size o 1 i zmieniamy ostatni wpis, który pojawi się na samym dole listy. Zmieniamy tylko parametry Name i Positive Button, odpowiednio na Reload i r.

Ustawienia Inputów
Ustawienia Inputów

Od tej pory, powinniśmy być w stanie przeładować.

Wyświetlamy komunikaty o potrzebie przeładowania

W wielu grach, gdy skończy się nam amunicja, pojawia się komunikat o potrzebie przeładowania. My dodaliśmy opcję przeładowania strzałem, więc jest to element nieco zbędny, jednak może być pomocny dla gracza, więc jednak go zrobimy.

Będąc w Unity, dodajemy drugi GUIText. Dla wersji: 4.5.x:  [GameObject -> Create Other -> GUI Text]. Dla wersji 4.6.x: Tworzymy pusty GameObject: [Ctrl+Shift+N], a następnie dodajemy mu komponent GUIText [Component -> Rendering -> GUI Text]

Ja swojego nazwałem GT_reload. Ponownie zmieniamy rozmiar czcionki (Font Size), położenie napisu (Anchor) na middle center, wpisujemy treść komunikatu, u mnie brzmi ona „Press R or Fire to Reload”, oraz wyłączamy component, aby nie pojawił się domyślnie w grze.

Ustawienia obiektu GT_reload
Ustawienia obiektu GT_reload

Teraz czas na wrócenie do skryptu.

Najpierw musimy dodać ostatnią dzisiaj zmienną pomocniczą.

Możemy teraz szybko przeskoczyć do Unity i uzupełnić zmienną, utworzonym wcześniej obiektem. Wracamy znowu do skryptu, by dokończyć nasze dzieło:

Dodajemy prostego ifa. Jeśli obecny stan magazynka to 0, to wyświetlamy komunikat. W przeciwnym razie, zostawiamy go wyłączonego.

Podsumowanie

Zdaje sobie sprawę z tego i wy również musicie, że kod, który póki co posiadamy, nie jest perfekcyjny. Jednak chce, abyście mieli dokładny wgląd w proces powstawania gry, dlatego, wszelkie poprawki i usprawnienia kodu, będą się pojawiać później. Zastosujemy sobie bardziej zaawansowane techniki programowania, czy proste sztuczki na ułatwienie wielu rzeczy. Póki co tyle.

Na dzisiaj tyle. Nasza broń ma już ograniczony magazynek, oraz może zostać przeładowana. W kolejnej części zajmiemy się zbieraniem przedmiotów z ziemi.

Poprzednia część <- #5 – Kamera z bronią i strzelanie

Następna część -> #7 – Zbieranie przedmiotów

  • Qiuer

    Gdzie dać obiekt : GT_ammo, bo mi lata po ekranie albo wogóle się nie pojawia?

    • Położenie samego obiektu nie ma znaczenia. Do póki istnieje komponent GUIText, a kod w funkcji OnGUI jest ustawiony poprawnie, wszystko powinno się dobrze wyświetlać

  • Dominik Zedd

    W Unity 4.6.x GUIText można stworzyć przez [Crate – > Crate Empty] oraz dodać do niego komponent Rendering -> GUIText

  • Dawid Lewandowski

    proszę o pomoc!

    nie mogę przeładować klikam r i nic wszystko mam dobrze! Proszę o pomoc

    • Dawid Lewandowski

      Już sobie poradziłem! :)

    • Miło mi to słyszeć. :)

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

  • MSrebro

    Hej, mógłbyś dać cały kod, bo przepisywanie jest trochę kłopotliwe.

    • Kompletne kody są dodane później – gdy są już kompletne. Sam kod jest w fragmentach celowo. Jest to kurs, czyli ma czegoś nauczyć. Więcej można się nauczyć przerabiając kod po kawałku, niż jak by każdy kopiował całość.

      Jeżeli starczy Ci kopiowanie, to da się kod kopiować z tych okienek. ;)

  • Michał Romaszewski

    Teraz czas wrócić do Unity. Musimy to załatwić dwie sprawy. – Błąd! Popraw to!
    PS. Świetny poradnik!

  • DafiX

    Mam problem z GUI. Zdrowie, pancerz i stamina się wyświetlają prawidłowo tak już ilość amunicji i wiadomość o konieczności przeładowania już nie pojawia się. Nie pisze jakbym miał błąd. Kod jest dobry, a w Unity raczej też wszystko jest dobrze, a mimo to się nie wyświetla. Może coś poradzisz ?

    • Czy jeśli w pole Text komponentu GUITexture wpiszesz na sztywno dowolny tekst, coś się pojawia? Jeśli nie, możliwe że źle jest ustawiona pozycja tych komponentów i nie są widoczne na ekranie.

      Jeżeli wtedy tekst się pojawi, winiłbym kod wstawiający tekst.

    • DafiX

      Nie. Nic się nie pojawia.

    • Czyli problemem jest pozycja samego obiektu. Mogłeś źle ustawić np. marginesy przez co tekst pojawia się po za kamerą. Najprościej wprowadzić jakiś tekst, włączyć sobie podgląd na okienko Game i modyfikować ustawienia komponentu, aż pojawi się tekst.

    • DafiX

      Po jakimś miesiącu, kiedy się tym nie zajmowałem znalazłem dziś być może przyczynę, lecz nie wiem jak to naprawić. Otóż kiedy gra się odpala tekst z amunicją znajduje się na X -575 a Y na -289 i być może to jest przyczyną. Ale modyfikowałem tekst, poruszałem na scenie itp. i nic. Przed grą jest ustawione na X 0 Y 0

    • Może jakiś skrypt modyfikuje położenie. Odpal sobie grę i wtedy zmień ustawienie na 0, 0.

    • DafiX

      Właśnie tak próbowałem zrobić, ale automatycznie dawały się właśnie te co wcześniej podałem.

    • W sensie:
      – Dawałeś Play
      – Zaznaczałeś obiekt
      – Zmieniałeś położenie obiektu na (0, 0), a on automatycznie od razu jak kliknąłeś Enter ustawiał ponownie na te ujemne?

    • Alfred Krettino

      U mnie dzieje się tak jak powiedziałeś, co zrobić?

    • Któryś z was może mi wysłać projekt to spróbuję wymyślić o co chodzi, ale najwcześniej w poniedziałek. Bo szczerze, nie mam pojęcia czemu się tak może dziać.

    • Michał Wierzyk

      Witam, mam podobny problem. GUItext nie pojawia się na ekranie, guitexture – tak. Ustawiłem położenie na 0.5, 0.5, 0 i nadal to samo. po odpaleniu sceny, w przeciwieństwie do kolegów, to położenie się nie zmienia. Chętnie podesłałbym projekt ale zaimportowałem wszystkie assety (Stwierdziłem, że może się kiedyś przydadzą).

    • Michał Wierzyk

      Zrobiłem mały eksperyment. Stworzyłem nową scenę i dodałem tam zwykły gui text – Wyświetlał się. Wyłączyłem główną kamerę i dodałem first person controller – nie wyświetlał się. Porównałem ze sobą komponenty kamer i stwierdziłem, że w fpc brakuje 2 komponentów. – GUI Layer i flare layer. Dodałem je i wszystko było ok. Pozdrawiam!

    • Wyślij. Maila znajdziesz w zakładce współpracy albo wyślij przez prywatną wiadomość na FB. :) Sam jestem ciekaw co może to powodować.

    • DafiX

      Tak, dokładnie tak.

    • Michał Adam Wołodko

      A ja zrobiłem inaczej, W GT_reload wybrałem Layer na „Guns” i wszystko pięknie bangla ;)

  • Pingback: Unity3d FPS Tutorial #4 - Regeneracja życia i energii. Efekty trafienia | mWin GameDev()

  • Eduado

    Witam.
    Wiem, że temat jest dość stary, ale mam ten sam problem co wszyscy – mianowicie nie wyświetla mi się stan amunicji ani informacja o przeładowaniu. To drugie to jestem w stanie sobie odpuścić, ale fakt, że nie pokazuje mi ilości posiadanych naboi jest wkurzający. Próbowałem wszystkich rad, które tutaj są ale nic nie pomaga. I także u mnie w GT_ammo ustawia ujemne współrzędne. Co może być tego przyczyną?

    • Jeżeli do kamery dodany jest komponent GUILayer, a w kodzie nigdzie nie ruszasz ustawień tego elementu, to jedynie mogę chyba rzucić okiem na Twój projekt jako całość.

    • Eduado

      Byłoby super. Mogę go podesłać, ale w częściach. ponieważ trochę to waży.

    • Albo na jakiegoś dropboxa (czy inny odpowiednik) wrzuć i podeślij link. ;)
      Polecam stosować eksport projektu, bo przesłany „na żywca” czasami nie chce się odpalić na innym sprzęcie.

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

  • Jakub

    Witam,

    Problem z GUIText jest bardzo prosty do rozwiązania :)

    Wartości x i y atrybutu pixelOffset przyjmują wartości ujemne, dlatego też GUIText jest niewidoczny.

    Ten zapis : ammoText.pixelOffset = new Vector2(-Screen.width / 2 + 100, -Screen.height / 2 + 30);

    Jest błędny !

    Wystarczy taki w zupełności : ammoText.pixelOffset = new Vector2(40 , 20);

    GUIText startuje od wartości 0 dla x, 0 dla y (lewy dolny róg ekranu).
    GUIText to nie tekstura.

    Pozdrawiam,

  • Ammon

    Witam, męczę się i męczę, nie potrafię przeładować broni, przy żadnym stanie magazynka.
    Nie działa nawet reload z opcji braku pocisków

    • Sprawdź funkcję Debug.Log czy w ogóle wywołuje się u Ciebie funkcja mająca zrobić przeładowanie. W sensie czy isReloading kiedykolwiek jest równe true.

    • Ammon

      Debug.Log nie pokazuje nic,

      Podczas strzelania jest napis „Akcja 1”
      Podczas przeładowania jest jej brak.

      Ustawiełem 2 dbug”i, jeden w klikaniu klawisza a drugi w samej funkcji isReloading

    • Możesz mi pokazać swój kod?

    • Ammon

      using UnityEngine;
      using System.Collections;

      [RequireComponent(typeof(AudioSource))]
      public class Shooting : MonoBehaviour {

      public Texture2D crosshairTexture;
      public AudioClip pistolShot;
      public AudioClip reloadSound;
      public int maxAmmo = 200;
      public int clipSize = 10;
      public GUIText ammoText;
      public float reloadTime = 2.0f;

      private int currentAmmo = 30;
      private int currentClip;
      private Rect position;
      private float range = 10.0f;
      private GameObject pistolSparks;
      private Vector3 fwd;
      private RaycastHit hit;
      private bool isReloading = false;

      private float timer = 0.0f;

      void Start()
      {
      currentClip = clipSize;
      Screen.showCursor = false;
      position = new Rect((Screen.width – crosshairTexture.width) / 2,
      (Screen.height – crosshairTexture.height) /2,
      crosshairTexture.width,
      crosshairTexture.height);

      pistolSparks = GameObject.Find(„Sparks”);
      pistolSparks.particleEmitter.emit = false;
      audio.clip = pistolShot;
      }

      void OnGUI()
      {
      GUI.DrawTexture(position, crosshairTexture);
      ammoText.pixelOffset = new Vector2(-Screen.width / 2 + 100, -Screen.height / 2 + 30);
      ammoText.text = currentClip + ” / ” + currentAmmo;
      }

      void Update () {
      if(((Input.GetButtonDown(„Fire1”) && currentClip == 0) || Input.GetButtonDown(„Reload”)) && currentClip 0) {
      audio.clip = reloadSound;
      audio.Play();
      isReloading = true;
      }
      }
      }

      if(isReloading) {
      Debug.Log („Akcja 2”);
      timer += Time.deltaTime;
      if(timer >= reloadTime) {
      int needAmmo = clipSize – currentClip;

      if(currentAmmo >= needAmmo) {
      currentClip = clipSize;
      currentAmmo -= needAmmo;
      } else {
      currentClip += currentAmmo;
      currentAmmo = 0;
      }

      audio.clip = pistolShot;
      isReloading = false;
      timer = 0.0f;
      }
      }
      fwd = transform.TransformDirection(Vector3.forward);

      if(Input.GetButtonDown(„Fire1”) && currentClip > 0) {
      currentClip–;
      pistolSparks.particleEmitter.Emit();

      if (Physics.Raycast(transform.position, fwd, out hit)) {
      if(hit.transform.tag == „Enemy” && hit.distance < range) {
      Debug.Log ("Trafiony przeciwnik");

      } else if(hit.distance < range) {
      Debug.Log ("Trafiona Sciana");
      }
      }
      }
      }

      }

      Brak błędów w skrypcie, mam nadzieję że czegoś źle nie zrozumiałem albo nie dodałem w złym miejscu

    • Jeżeli dobrze liczę nawiasy klamrowę if(isReloading) i całą resztę wyrzuciłeś po za funkcję Update, więc nie miało prawa działać.

      Cały kod mający coś robić, musi być wewnątrz funkcji, którą wywołujesz. U Ciebie kawałek kodu wisiał sobie w powietrzu.

    • Ammon

      Zdam się na słowo bo dziś już nie sprawdzę.
      Możliwe, lecz kilka razy właśnie wyrzucilem funkcje poza bloki Update albo Start i wyrzucało błąd.

      Lecz z racji że lepiej się znasz, nie będę jakoś się tłumaczył głupio :p

  • franek dolas

    hello, mam pytanie: przerobiłem 6 odcinek i amunicja z komunikatem o przeładowaniu fajnie działają, poszedłem kroczek naprzód – zmieniłem pozycje wyświetlania info o stanie amunicji i dodałem teksturę naboju 9mm i też działa ale kiedy w oknie Game zaznaczam Maximize On Play to wszystko wariuje tzn tekstura naboju i info o nabojach zmienia pozycje??? Mógłbyś proszę podać funkcje na zmianę skali tekstury bo pierwotnie do imporcie mój nabój zajmował pół ekranu i musiałem ręcznie w zewnętrznym programie dopasowywać rozmiar. Bądź ewentualnie link do jakieś strony z tego typu niezbędnymi funkcjami C#.

    • Jeżeli rysujesz teksturę za pomocą funkcji GUI.DrawTexture(position, bulletTexture);
      To możesz łatwo ustawić swój pocisk w wybranym miejscu operując zmienną position. Jest ona typu Rect, czyli ma parametry: Rect(x, y, szerokosc, wysokosc). Możesz zatem wymusić położenie i rozmiar tekstury w zależności od rozmiaru ekranu.

      Rozmiar ekranu możesz pobrać ze zmienych: Screen.width i Screen.height. Podobna operacja była wykonana tu do policzenia położenia tekstu:
      ammoText.pixelOffset = new Vector2(-Screen.width / 2 + 100, -Screen.height / 2 + 30);

      Jedynie musisz sobie jeszcze w ten sposób wyliczyć rozmiar tekstury. Sam C# za Ciebie tego nie zrobi.

    • franek dolas

      dokładnie tak to robiłem, tzn narysowałem za pomocą GUI.DrawTexture, ale myślałem że może jest jakaś metoda/funkcja skalowania na zasadzie ScaleMode.ScaleToFit, której użyłeś tworząc efekt trafienia, a właśnie bo ciągle chce się o to zapytać ale zawsze wypłynie coś innego: odnośnie prefabu Sparks to u mnie wystrzał wygląda trochę jak różowo-fioletowa pikseloza, tak to miało być czy to tylko u mnie tak wygląda? jeśli docelowo taki jest efekt to jak można to przerobić żeby wyglądało faktycznie jak ogień wystrzału z lufy, ten kojarzy mi sie troche z MineCraftem :) W inspektorze Sparks jest Particle Animator i tam coś próbowałem animować kolory ale nic się nie zmieniło. Można jakoś tego prefaba ulepszyć czy pozostaje jedynie wymiana na bardziej przybajerzony?

    • W domyśle ten efekt wyglądał jak iskry lecące przy zapalaniu zapałki. Operując parametrami emitera cząsteczek powinieneś być w stanie osiągnąć taki efekt. Zawsze możesz poszukać jakiegoś innego gotowego efektu.

  • Robror

    Tekst się nie wyświetla a unity wywala błąd
    UnassignedReferenceException: The variable ammoText of shooting has not been assigned.
    You probably need to assign the ammoText variable of the shooting script in the inspector.
    UnityEngine.GUIText.Internal_SetPixelOffset (Vector2 p) (at C:/buildslave/unity/build/artifacts/generated/common/modules/TextRendering/TextRenderingBindings.gen.cs:89)
    UnityEngine.GUIText.set_pixelOffset (Vector2 value) (at C:/buildslave/unity/build/artifacts/generated/common/modules/TextRendering/TextRenderingBindings.gen.cs:95)
    shooting.OnGUI () (at Assets/shooting.cs:101)

    • W treści błędu masz wprost powiedziane co jest nie tak. Z poziomu Unity nie przypisałeś do zmiennych publicznych wartości. Dokładniej dla ammoText. Tekst się nie wyświetla bo nie ma gdzie.

  • Skydrovski

    Witam, mam taki problem że jak strzelam to kule w ogóle nie schodzą czyli jest cały czas 30/30. Może wiesz o co chodzi ?

    • Ciężko powiedzieć. Możesz wrzucić swój kod przez pastebin? Bez tego, to będzie wróżenie z fusów.

    • Skydrovski

      Już nie potrzebuje pomocy ;) skopiowałem sobie cały skrypt i zadziałało.

  • Krzysztof Cieśla

    mam pewien problem otóż zrobiłem wszystko jak w poradniku, przerobiłem chyba wszystkie porady w komentarzach ale nadal nie chce wyświetlać tekstu,niezależnie czy użyje skryptu, czy samego obiektu GUIText, manipulowałem wysokością szerokością (ręcznie w grze, nawet wywaliłem zmienne pozycyjne by to móc robić no i nic. podejrzewam żepo prostu nie zamierza wyświetlać tego tekstu

    • Krzysztof Cieśla

      ok rozwiązałem o sam.
      Do wszystkich którym to nie chce działać, rozwiązanie znalazłem na stronie unity przypadkiem. W position w naszym obiekcie wyświetlającym funkcje z reguły są jakieś abstrakcyjne liczby, tak to nie będzie działać, ustawcie sobie 0 lub 0.5, 1 to już jest pełna wartość co oznacza że ustawi się akurat na końcu szerokości lub wysokości ekranu

    • Marcin

      Kolego mógł byś nieco rozwinąć myśl bo ja mam ten sam problem i nie wiem jak go rozwiązać. OK Rozumiem mam w position zmienić wartości liczb ale w obiekcie GUI Text nie wiem w MainCamera czy może w samym skrypcie jeśli w skrypcie to gdzie co i jak? sorka jeśli moje pytanie może wydać się głupie ale jestem początkującym więc dopiero się uczę

  • FIREUP

    glupia prozba ale moge prosic caly skrypt?

    • Na samym końcu jest do pobrania kompletny projekt. Ale mimo wszystko polecam przerabiać całość pokolei. Z gotowych skryptów niczego się nie nauczysz.

  • Emil

    Cześć. Jakby ktoś się zastanawiał czemu strzelając w cube lub teren nie może w nie trafić, dopóki w nie wejdzie. Chodzi o to, że model broni jest źle zrobiony(blender używa innych osi), bo przód(niebieska oś z) jest skierowany do góry. 2h to rokminiałem, żeby do tego dojść :)
    Wystarczy dodać pusty obiekt w miejscu broni a broń umieścić w środku i do pustego obiektu przypisać skrypty.

  • TetraHydroSoft

    Mam jeszcze jedno pytanie czy jeśli ukończę projektować gre i jeśli do swojej gry wykorzystam tekstury np. z google grafiki lecz nie będę czerpał jakichkolwiek kożyści z gry to czy moja gra może być zdjęta ze względu praw autorskich a ja sam moge ponieść jakąś karę?

    • Jeśli wykorzystasz grafiki lub jakiekolwiek inne elementy, do których nie masz praw, to łamiesz prawa autorskie. W efekcie firma która dysponuje prawami, może domagać się usunięcia gry, a czasami nawet domagać się zadośćuczynienia w postaci materialnej.

      Nawet jeśli nie czerpiesz korzyści materialnych, to dalej jest kradzież. Więc polecam korzystać z grafik dostępnych na wolnych prawach, albo kupionych.

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