DontDestroyOnLoad nie do końca działa.

DontDestroyOnLoad nie do końca działa.
T1
  • Rejestracja:około 3 lata
  • Ostatnio:około rok
  • Postów:37
0

Witam.
Mam pewien problem, który zdaje się nie był poruszany nigdzie na żadnym forum.
Otóż DontDestroyOnLoad działa dobrze, nie niszczy obiektu, jednakże skrypt, który jest do niego dołączony wykonuje się po załadowaniu sceny.
Nie ważne czy robię LoadScene, czy loadSceneAsync, czy LoadSceneAsync Additive...
Zawsze po wczytaniu sceny wykonuje się Awake, Start i pozostałe.
Czy da radę jakoś tego uniknąć?
Singleton mam z pierwszej sceny a w kolejnej ten sam plik, z tym samym skryptem chce na nowo przypisać Singletona i pokazuje mi stosowny komunikat.
(SendToTerminal to pokazuje na konsoli informacje)
(Kod w Awake)

Kopiuj
        if (!instance)
        {
            DontDestroyOnLoad(this.gameObject); // Póki działa gra to consola będzie działać
            instance = this.gameObject.GetComponent<TerminalCommand>();
        }
        else
        {
            Destroy(this.gameObject.GetComponent<TerminalCommand>());
            SendToTerminal("Game try create more than one Terminal Commands in scene.\n" +
                "Game remove Terminal component from object: " + this.name, MesseageType.Warring, this.gameObject);
        }
edytowany 1x, ostatnio: tdx110
Spine
  • Rejestracja:prawie 22 lata
  • Ostatnio:około godziny
  • Postów:6631
0

Dlaczego w 8 linijce robisz Destroy komponentu TerminalCommand?
Powinieneś zniszczyć this.gameObject.

Poza tym ja dla pewności bym napisał if (instance == null) zamiast if (!instance).

I po co używasz GetComponent()?
this to powinien być Twój komponent, więc w linii 4 piszesz instance = this;


🕹️⌨️🖥️🖱️🎮
edytowany 4x, ostatnio: Spine
T1
  • Rejestracja:około 3 lata
  • Ostatnio:około rok
  • Postów:37
0
Spine napisał(a):

Dlaczego w 8 linijce robisz Destroy komponentu TerminalCommand?
Powinieneś zniszczyć this.gameObject.

Niszczę tylko komponent ten a obiekt ma zostać.

Poza tym ja dla pewności bym napisał if (instance == null) zamiast if (!instance).

Przecież to jest to samo.

Spine napisał(a):

I po co używasz GetComponent()?
this to powinien być Twój komponent, więc w linii 4 piszesz instance = this;

Moim komponentem do instance jest dany skrypt a nie gameobject.

Singleton ma być zabezpieczeniem na ewentualne użycie tego skryptu w innym obiekcie i scenie a nie na użycie tego samego obiektu w scenie.

edytowany 1x, ostatnio: tdx110
Boski
this powinno być typu Twojego komponentu/skryptu, więc powinno zadziałać jak @Spine napisał. Używasz this.gameObject[..], ale jak skasujesz wszystko po this to będzie okej.
Boski
  • Rejestracja:prawie 6 lat
  • Ostatnio:około 2 godziny
  • Postów:132
0

A czy jak zapauzujesz i sobie zobaczysz w hierarchii, to wszystko jest okej?
Bo z tego co pamiętam to destroy najpierw sobie kolejkuje, a działa fizycznie dopiero na koniec klatki lub w kolejnej.
Czyli mogłoby być tak, że mimo, że skasowałeś komponent, to jeszcze zdążył się zrobić start
(awake na pewno, bo w nim robisz kasowanie).
Ustawienie zwykłego bool'a isDestroying i sprawdzanie go w starcie powinno rozwiązać problem.

A jeśli w hierarchii jest źle to sprawdź czy instance na pewno jest static

T1
  • Rejestracja:około 3 lata
  • Ostatnio:około rok
  • Postów:37
0

Instance na pewno jest static. Bardziej mnie martwi to że wykonuje się skrypt obiektu który był wczytany w poprzedniej scenie i jest DontDestroyOnLoad
Możliwe że kompilator rozpoznaje że obiekt ma być zniszczony, ponieważ jak w scenie którą wczytuje jest ten sam skrypt to tylko jedno ostrzeżenie pokazuje a komunikat w terminalu jest dwa razy napisany (debug warring jest w dołączone do skryptu SendToTerminal).
Jest jakiś sposób aby obiekt który jest DontDestroyOnLoad nie wykonywał pętli Start i Awake jak jest wczytywania kolejna scena?
To wygląda tak jakby ten obiekt był niszczony i jeszcze raz tworzony ponieważ wartości niestatyczne są null

edytowany 1x, ostatnio: tdx110
Boski
  • Rejestracja:prawie 6 lat
  • Ostatnio:około 2 godziny
  • Postów:132
0

No właśnie nie powinien już robić tego startu i awake, to nie jest normalne. Nigdy nie miałem takich problemów, z tym że: swoje singletony trzymam tylko na wejściowej scenie, do której nie wracam (jeszcze przed menu), a na kolejnych scenach już ich nie umieszczam.
Ale wracając do problemu: może gdzieś kasujesz parenta tego singletona z poprzedniej sceny? wtedy dontdestroy nie pomoże
jeszcze jeden pomysł: wrzuć tam private void OnDestroy() { Debug.log("XX"); }
i zobacz czy i kiedy sie wywoluje, i na którym

edytowany 1x, ostatnio: Boski
T1
  • Rejestracja:około 3 lata
  • Ostatnio:około rok
  • Postów:37
0

Ok, nie wiem dlaczego ale problem rozwiązał się sam. Wcześniej jak wczytywałem skrypt i jeden miałem w LoadScene (tak jak kolega to robi) a drugi we wczytywanej scenie dla testu czy wszytko działa i jak wcześniej skrypt Awake był wykonywany 3 razy, tak teraz 2 razy.
Taki OFT:
Pewnie większość o tym wie, albo sami zrobili terminal rodem z Quake, 7Days to Die itp. Do pobrania jest Tutaj0
Oczywiście za darmo.
Tak to pytanko takie. Jest gdzieś może tutaj na forum jakiś dział dla przydatnych narzędzi do Unity, C# czy innych języków?

Spine
  • Rejestracja:prawie 22 lata
  • Ostatnio:około godziny
  • Postów:6631
0
tdx110 napisał(a):

Tak to pytanko takie. Jest gdzieś może tutaj na forum jakiś dział dla przydatnych narzędzi do Unity, C# czy innych języków?

Najbardziej zbliżony jest ten dział...
Co rozumiesz przez "przydatne narzędzia"?

A jeśli chodzi o Twój terminal, to można się obejść bez singletona na Scenie... Wystarczy zwykły prefab dodany do wszystkich scen (tak jak obecnie), który swoje dane zachowuje w jakimś statycznym obiekcie. I z tego obiektu ładuje dane po załadowaniu sceny.


🕹️⌨️🖥️🖱️🎮
edytowany 6x, ostatnio: Spine
T1
  • Rejestracja:około 3 lata
  • Ostatnio:około rok
  • Postów:37
0
Spine napisał(a):
tdx110 napisał(a):

A jeśli chodzi o Twój terminal, to można się obejść bez singletona na Scenie... Wystarczy zwykły prefab dodany do wszystkich scen (tak jak obecnie), który swoje dane zachowuje w jakimś statycznym obiekcie. I z tego obiektu ładuje dane po załadowaniu sceny.

Dokładnie to nie mój terminal, ale uznałem że jest przydatny to warto się nim podzielić.
Dodałem sam Singletona, ponieważ tworzy się on dopiero w Start, a Instance początkowych obiektów dodaje w Awake, wiec dlatego wczytywanie sceny zrobiłem.
Oczywiście musiałem także kilka linii kodu zmienić aby wszystko działało...

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)