• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z emiterem cząstek - Unity

Object Storage Arubacloud
0 głosów
575 wizyt
pytanie zadane 4 września 2015 w C# przez Zaglowiec Dyskutant (9,200 p.)

Witam wszystkich. Nazywam się Zaglowiec.


Otóż mam problem w Unity 3 a mianowicie wersji 3.7.5. Uczę się tj wersji ponieważ mam książkę pt: "Programowanie w środowisku unity 3.x" i najpierw chce zrozumieć ogólnie cały mechanizm, a następnie przejść na najnowsze Unity 5.


Do rzeczy. Mam problem z włączeniem systemu cząstek w czasie gry. Mianowicie w książce jest napisane, że mam wyłączyć "emit" cząstek, a w moim panelu mam emitter (to jeszcze można skojarzyć, ale nie jestem pewien czy to to). Wyłączałem nawet "Play On Awake" ale to też nie pomogło(ponieważ nie chce później się uruchomić, nawet po zmianie kodu, który zmieniałem już wiele razy, próbując różnych sposobów).
Tutaj jest podgląd mojego widoku inspectora:

Inspector cz1
Inspector cz2

Następnie miałem napisać kod uruchamiający emit cząstek (kod jest napisany w c#, i jest podłączony w postaci gracza, a nie bez pośrednio w campfre(ognisku), ale wysyłanie instrukcji między obiektami nie sprawia problemu). W kodzie nie ma błędu gra uruchamia się a w trakcie nie wyskakuje żaden błąd, tyle że program omija instrukcje foreach wykonując od razu dźwięk usunięcie tekstury na ekranie itp.

void LightFire(GameObject campfire)
 {
  
  ParticleEmitter[] fireEmitters;
  fireEmitters = campfire.GetComponentsInChildren<ParticleEmitter>();
  
  foreach(ParticleEmitter emitter in fireEmitters)
  {
   emitter.emit = true;
  }
  
  campfire.audio.Play();
  Destroy(matchGUI);
  haveMatches=false;
 }

W czym tkwi problem, a raczej co muszę wyłączyć, a następnie jaki kod wpisać, aby włączyć emit cząstek.
Sprawdziłem już wiele stron, nawet samo unity, tylko że nigdzie nie ma wyjaśnionego tego problemu.

Mam nadzieje, że niczego nie pomiąłem, gdyby coś mi umknęło powiecie, a dorzucę więcej przydatnych(mam nadzieje) informacji.

Z góry dziękuje za pomoc w jakiejkolwiek postaci(link do strony, czy wyjaśnienie wszystkiego po kolei)

Zaglowiec

2 odpowiedzi

0 głosów
odpowiedź 4 września 2015 przez zmiennoimienny Mądrala (5,540 p.)

Witam smiley
Jeżeli chcesz włączyć emitowanie cząstek możesz spróbować z:
http://docs.unity3d.com/ScriptReference/ParticleEmitter-enabled.html
czy też wyłączyć cały obiekt będący emiterem. 
Troche chaotycznie napisałeś ale myśle że w tym tkwi problem ;)

Poza tym, dlaczego uczysz się 3.x ? Zacznij odrazu od 5.x.
W gruncie rzeczy nie ma sensu uczyć się starej wersji silnika podczas gdy na najnowszą masz setki poradników w internecie jak i samą dokumentacje.  Nie ma też ogromnych zmian przy kodowaniu.

Pozdrawiam ;) 

komentarz 4 września 2015 przez zmiennoimienny Mądrala (5,540 p.)

PS. Jeżeli chodzi o pętle foreach to prawdopodobnie do tablicy nie został dodany żaden obiekt. 
Jeżeli chcesz sprawdzić czy cokolwiek dodaje możesz użyć:

if (campfire.GetComponentsInChildren<ParticleEmitter>())
{
Debug.Log("Dodało");
}

Nie jestem pewny czy zadziała, ale wiem że można w ten sposób sprawdzić czy pojedyńczy obiekt posiada dany kompontent.
komentarz 5 września 2015 przez Zaglowiec Dyskutant (9,200 p.)
Dziękuje za odpowiedź i przepraszam za moją 'chaotyczną' składnie.

Problem w tym, że nie wiem w którym miejscu najpierw wyłączyć emitowanie cząstek, aby zadziałało tak jak w linku, który otrzymałem od ciebie.

Także mam problem z włączeniem obiektu w kodzie, po jego wyłączeniu.

Pętla foreach nie wykonuje się, a sprawdzenie czy dodał obiekt w tym przypadku nie chce zadziałać (używałem już tego sposobu do sprawdzenie czy coś działa).

A jeśli chodzi o Unity 3.x uczę się ponieważ kupiłem książkę do tej wersji (nie pomyślałem), a kolejne mają inny interfejs, który nie 'współpracuje' z tym z książki. Poza tym już kończę moją pierwszą grę w tej wersji.

Jeśli masz jakieś inne pomysły lub mógłbyś podać więcej wyjaśnień do pierwszego pomysłu, było by miło.
komentarz 5 września 2015 przez zmiennoimienny Mądrala (5,540 p.)

Najpierw trzeba zdiabnozować problem. Moim zdaniem poprostu tablica jest pusta przez co pętla foreach się nie wykonuje.
Zrób publiczną tablice (public przed deklaracją tablicy) i po wykonaniu:
 

 ParticleEmitter[] fireEmitters; 
 fireEmitters = campfire.GetComponentsInChildren<ParticleEmitter>(); 

Dodaj zawartość tablicy fireEmitters do tablicy publicznej.
Dzięki temu będziesz mógł zobaczyć czy cokolwiek po wykonaniu kodu się tam znajduje.

A to kiedy emitter ma się wyłączyć a kiedy włączyć zależy od twojej gry smiley

komentarz 5 września 2015 przez Zaglowiec Dyskutant (9,200 p.)
Problem tkwi w tablicy – jest pusta, przez co pętla foreach nie wykonuje się. Zrobiłem jak pisałeś i tablica jest pusta w czasie gry. Ale co jest tego powodem nie mam zielonego pojęcia. Szczególności, że robiłem krok po kroku wszystko tak jak było w książce.
komentarz 5 września 2015 przez zmiennoimienny Mądrala (5,540 p.)

Wiem chyba w czym problem. Chcesz pobrać "ParticleEmitter" a w obiekcie masz "ParticleSystem". 
Zrób coś takiego:
 

 ParticleSystem[] fireEmitters; 
  fireEmitters = campfire.GetComponentsInChildren<ParticleSystem>(); 
   
  foreach(ParticleSystem emitter in fireEmitters) 
  { 
   emitter.play();
  } 


Wybacz za ewentualne błędy ale pisze z głowy.

Potem użyj:
ParticleSystem.Play - uruchamia symulacje
ParticleSystem.Stop - stopuje symulacje
ParticleSystem.Clear - czyści wszystkie cząsteczki
Mam nadzieje że zrozumiale to napisałem smiley

komentarz 6 września 2015 przez Zaglowiec Dyskutant (9,200 p.)
Na początku gdy chciałem rozwiązać ten problem samodzielnie też o tym pomyślałem, ale w Unity wyskakuje błąd, mówiący o tym że nie rozpoznaje ParticleSystem, dla przykładu gdy jest ParticleEmitter w edytorze jest napisane niebieską czcionką, a gra się włącza, bez żadnych problemów, tyle że ognisko nie ma animacji palenia się, po skełnieniu warunku jaki jest w kodzie.

Także emitter.play(); wyskakuje mi jako błąd.
komentarz 6 września 2015 przez zmiennoimienny Mądrala (5,540 p.)
Wiesz co? Przeżuć się na Unity 5.
Książka książką ale staconych godzin już nie odzyskasz.
Powinieneś w miare się połapać, bo nie ma aż tak więlkich zmian.
komentarz 6 września 2015 przez Zaglowiec Dyskutant (9,200 p.)
Na Unity 5 i tak miałem zamiar przejść. Nad problemem jeszcze pomyśle może dostane jakiegoś olśnienia.

Nie uważam tego za stracony czas. Człowiek zawszę czegoś się nauczy nawet jeśli uczyłem się na starszej wersji to i tak będzie mi w prostszy sposób zrozumieć mechanikę kolejnej wersji (wiem bo już sprawdzałem Unity 5).

Bardzo dziękuje za twój czas który poświeciłeś by mi pomóc (nawet jeśli problem nie został rozwiązany).

Zaglowiec
komentarz 10 września 2015 przez Zaglowiec Dyskutant (9,200 p.)
Błąd znaleziony . Po części miałeś racje jeśli chodzi o 'ParticleSystem', ale sprawa rozchodziła się jeszcze o 'emitter', który trzeba było zastąpić 'emission', dzięki temu nie wyskoczył żaden błąd, a ognisko się rozpaliło.
0 głosów
odpowiedź 10 września 2015 przez Zaglowiec Dyskutant (9,200 p.)
edycja 10 września 2015 przez Zaglowiec
Problem rozwiązany. Poniżej zostawiam prawidłowe rozwiązanie, gdyby ktoś miał podobny problem do mojego.

 

void LightFire(GameObject campfire)
 {
  
  ParticleSystem[] fireEmitters;
  fireEmitters = campfire.GetComponentsInChildren<ParticleSystem>();
  
  foreach(ParticleSystem emission in fireEmitters)
  {
   emission.Play();
  }
  
  campfire.audio.Play();
  Destroy(matchGUI);
  haveMatches=false;
 }

Podobne pytania

0 głosów
2 odpowiedzi 188 wizyt
pytanie zadane 27 sierpnia 2021 w C# przez Jakusss Początkujący (410 p.)
0 głosów
1 odpowiedź 304 wizyt
pytanie zadane 24 lutego 2021 w C# przez patryk8 Początkujący (300 p.)
0 głosów
0 odpowiedzi 126 wizyt
pytanie zadane 15 grudnia 2020 w C# przez kubaa322 Użytkownik (710 p.)

92,615 zapytań

141,465 odpowiedzi

319,782 komentarzy

61,997 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...