Wpis z mikrobloga

Mirki z #unity #gamedev i #naukaprogramowania mam #pytanie pomożecie? Zaczynam ogarniać Unity i zauważyłem dziwne zachowanie. Mam dwa obiekty: GameManager i Gracza. Gracz jest prefabem, posiada skrypt w którym trzymam imię gracza. GameManager posiada skrypt w którym dodałem referencję do Gracza, przeciągając w edytorze prefab Gracza z zakładki projektu (nie z hierarchii). Utworzyłem proste UI za pomocą którego chcę edytować nazwę gracza. Metoda wygląda bardzo prosto:

public void OnEditPopupOkClick(){
player.GetComponent().playerName = playerNameInputField.text;
}

Dziwne zachowanie to to, że jeśli zmienię w ten sposób nazwę gracza, to zmiana ta *zostaje* po wyjściu z Play Mode, tzn nazwa gracza zmieniana jest również w prefabie w strukturze projektu (nie w hierarchii). Co dziwniejsze, jeśli zmienie w inspektorze nazwe gracza z łapy, po wyjściu z Play Mode nazwa nie jest zapisywana w prefabie (co jest pożądanym zachowaniem).
Ktoś mógłby mnie oświecić co robię źle? Bo oczywiście nie chciałbym żeby prefab zapisywał się po jakichkolwiek zmianach w Play Mode.
  • 5
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@jigsaw96: dzięki za pro tipa, chyba mnie oświeciło. W moim kodzie "player" jest odwolaniem do prefaba przeciągnietego z Project View. Na starcie w GameManager robię tylko "Instantiate(player)" ale nie trzymam nigdzie odwołania do obiektu który tworzę. Jak rozumiem, koszernym rozwiązaniem byłoby w GameManager dorobić prywatną zmienną np playerInstance i na tym działać?
  • Odpowiedz
@hamster151: Jak przeciągnąłeś prefaba to zmienia nazwę w prefabie. Nie zmienia się w play mode bo to co jest w hierarchii jest kopią prefeba z momentu utworzenia. Jeśli zmieniasz coś w prefabie w play mode to w instancji się nie zmiani. Przeciągnij jeśli możesz obiekt gracza z herarchii lub ze skryptu referencję podepnij.
  • Odpowiedz
@Kozun: Dzięki również za odpowiedź. Zmieniłem to już na chyba poprawną wersję - w GameManager mam teraz:

public GameObject playerPrefab;
private GameObject playerInstance;

void Start
  • Odpowiedz