오늘 학습 키워드

GameObject 찾기

오늘 학습 한 내용을 나만의 언어로 정리하기

다음 씬에서 GameObject 찾기

그러려면 씬이 로딩되었는지를 알아야 함. 씬이 로딩되었을 때 실행할 함수를 만들 수 있음.

// 씬이 로딩될때마다 불러질 함수를 추가
SceneManager.sceneLoaded += OnSceneLoaded;
 
...
 
public void OnSceneLoaded(Scene scene, LoadSceneMode mode)
{
    if (scene.name == "HorrorGameScene")
    { 
        CursorFaster.instance.HorrorSceneAgain();
    }
}

여기서 scene은 불러와진 씬 데이터를, mode는 불러온 방법을 의미함 기본값은 single임.

public enum LoadSceneMode
{
    Single, // 씬 하나만 불러왔을 때
    Additive // 현재 씬 위에 다른 씬을 또 불러온 형태일 때 
}

학습하며 겪었던 문제점 & 에러

문제 1

  • 문제&에러에 대한 정의

팀원분께서 이런 오류가 뜨셨음

The type or namespace name 'EditorApplication' does not exist in the namespace 'UnityEditor' (are you missing an assembly reference?)
  • 내가 한 시도

Editor 폴더에 파일을 집어넣는 방법을 쓰셨는데… 문제는 이렇게하면 GameObject에 안올라감

  • 해결 방법
  1. Edit Preferences External Tools Regenerate Project Files로 패키지 다시 동기화.
    • 실패!
  2. Window Package Manager Visual Studio Editor 재설치
    • 실패!
  3. 전처리 구문 끼워넣기
    • 성공!
  • 새롭게 알게 된 점
// 전처리 구문
#if UNITY_EDITOR
UnityEditor.EditorApplication.isPlaying = false;
#endif

Editor 폴더에 스크립트를 써야했던 이유는, Editor 안에 넣으면 자동으로 빌드 때 빠지니까 그럼.

  • 이 문제&에러를 다시 만나게 되었다면?

전처리문을 확실하게 확인해봐야겠다!

문제 2

  • 문제&에러에 대한 정의

마우스를 따라오는 객체가 마우스랑 부딪힌 뒤에 잠깐의 시간이 지난 후 게임을 강제종료 하려고 했으나, Destroy로 gameobject를 삭제하다보니 게임 종료 구문이 실행이 안됐음.

  • 내가 한 시도

ienumerator 로 코루틴 만들어서 OnDestroy 때 invoke 했는데, 그게 사라지면서 애초에 안되나봄.

  • 해결 방법

GameObject OnDestroy에서 GameManager한테 신호 주고, GameManager는 신호 받으면 일정 초 후에 게임 꺼지게 했음.

  • 새롭게 알게 된 점

OnDestroy에 Invoke가 있어도 실행이 안된다. 이미 죽어버려서..

  • 이 문제&에러를 다시 만나게 되었다면?

다른 살아있는 오브젝트한테 위임(?) 해야 할 듯

문제 3

  • 문제&에러에 대한 정의

씬을 넘겨서 부르려는 함수가 너무 자주 불러졌음.

...
SceneManager.sceneLoaded += OnSceneLoaded;
...
 
public void OnSceneLoaded(Scene scene, LoadSceneMode mode)
{
    if (scene.name == "HorrorGameScene")
    { 
        CursorFaster.instance.HorrorSceneAgain();
    }
}
  • 해결 방법

이벤트에 등록만 하고 삭제를 안해서 계속 등록만 되고 있었음.
그래서 삭제시켜줘야됨

public void OnSceneLoaded(Scene scene, LoadSceneMode mode)
{
    if (scene.name == "HorrorGameScene")
    { 
        CursorFaster.instance.HorrorSceneAgain();
    }
	SceneManager.sceneLoaded -= OnSceneLoaded;
}
  • 새롭게 알게 된 점

이벤트를 계속 등록만 하면 여러번 불린다

  • 이 문제&에러를 다시 만나게 되었다면?

함수 부르고 삭제하는거 잊지않기

내일 학습 할 것은 무엇인지

유니티 내장 함수 실행 순서를 조금 더 공부해 봐야 할 것 같다.