씬이 바뀌어도 오브젝트가 파괴되지 않게 해주는 DontDestroyOnLoad | 유니티

Поделиться
HTML-код
  • Опубликовано: 12 янв 2025

Комментарии • 30

  • @old_cleanwater
    @old_cleanwater Год назад

    GameManager 스크립트가 들어있는 오브젝트를 DontDestroyOnLoad 로 사용하는 경우도 있을까요?

  • @JASON-wy4lk
    @JASON-wy4lk 2 года назад +1

    DontDestoryObject가 중복되지 않고 하나만 생기도록 하는것은 가능하나 GameManager처럼 참조가 많이 있는 오브젝트의 경우 씬을 전환하면 참조가 다 끊긴 GameManager오브젝트를 남기고 참조가 연결되어 있었던 GameManager 오브젝트를 Destroy하게 되는데요 해결법이 있을까요?

    • @wergia
      @wergia  2 года назад

      여러가지 방법이 있을 수 있습니다.
      간단한 방법을 생각해보자면 게임 매니저가 생성될 당시의 시간을 기록해두고 새로운 게임 매니저가 생성되면 생성 시간을 비교해서 제일 오래된 게임 매니저만 남기고 다른 오브젝트들을 제거하는 방법이 있을 수 있습니다.

  • @민즈
    @민즈 11 месяцев назад

    혹시 UI오브젝트들도 되는법이 있을까요...

  • @choiwol0729
    @choiwol0729 4 года назад +1

    좋은 영상이네요 감사합니다 좋은 거 배우고 갑니다 :)

  • @user-ns4yg9lp7o
    @user-ns4yg9lp7o 3 года назад +1

    와 진짜 이런거 알려주시는 분 은 베르님 밖에 없는거 같아요.. 와 진짜 너무 감사합니다

  • @skdngs
    @skdngs 3 года назад +2

    안녕하세요!DontDestroyObject사용 후 시작 씬으로 되돌아갈때마다 계속 타이머나 체력이 누적되어서 이를 해결할 방법을 찾다가 베르님 영상을 보게되었습니다🥺
    이렇게 댓글을 작성하게된 이유는
    if(objs.Length == 1) 부분에서 Length 에 빨간 줄이 그어지며, DontDestroyObject에는 Length에 대한 정의가 포함되어있지않고 DontDestroyObject 형식의 첫 번째 인수울 허용하는 액세스 가능한 확장 메서드 Length가 없다고 떠서인데요😭😭해결방법을 알수있을까하여 이렇게 댓글달아 여쭈어봅니다ㅠㅠ!

    • @wergia
      @wergia  3 года назад +1

      objs를 찾은 함수 이름이 어떻게 되나요?
      FindObjectOfType 인지 FindObjectsOfType 인지 확인해보세요.
      s가 붙어있는 함수를 써야 해당 컴포넌트가 붙어있는 모든 오브젝트를 찾아서 배열로 줍니다.
      그래야 Length 프로퍼티를 사용할 수 있어요.

    • @skdngs
      @skdngs 3 года назад +1

      @@wergia 알람이 안떠 늦게확인합니다🥺🥺답글주셔서 너무감사드립니다
      헉 그러네요 몇번 검토했는데도 발견하지못한 오타...........한번에 콕 찝어줏셔서 넘 감사드립니다🙇‍♀️!!!!///!!!

  • @BinderColor
    @BinderColor Год назад

    강의 보는 중 질문드립니다
    만약에 씬 1에서 DontDestroyOnLoad된 오브젝트가 씬 2를 거쳐 씬 3에서 파괴되게 하려면 어떻게 해야 할까요 ? 대부분의 영상들에서 DontDestroyOnLoad가 씬 2개에서 움직여서 한 번 질문드려봅니다 !

  • @ryanson739
    @ryanson739 2 года назад +1

    좋은 강의 감사합니다^^
    실무에서는 어떤 상황에서 DontDestoryObject를 사용하나요? 실제 사용 케이스가 궁금합니다.

    • @wergia
      @wergia  2 года назад +1

      보통 여러 씬에 걸쳐서 오브젝트를 유지해야 될 때 사용합니다. 특히 하드웨어와 연결되는 오브젝트를 유지할 때 사용합니다.

  • @ooj5652
    @ooj5652 3 года назад +1

    안녕하세요 매번 영상 보며 공부하고 있는 학생인데 여쭤볼 것이 있어서요!
    현재 여러 가지 힌트를 조합하여 보스를 물리치는 아케이드 추리 게임을 만들고 있는데 씬은 4가지이며, 1층, 2층, 3층, 계단으로 제작했습니다. 각 층에는 여러 가지의 힌트들이 있는데 예를 들어 1층에서 힌트를 얻고, 2층에 갔다가 1층으로 돌아왔을 때 데이터를 유지(각 방의 문을 열고 갔으면 열린 채로 있거나, 얻은 힌트는 사라지고, 얻지 못한 힌트는 그 자리에 있도록) 하고 싶은데 어떻게 해야 할까요?

    • @wergia
      @wergia  3 года назад +1

      게임 진행 상황을 저장할 수 있는 객체를 만들어야겠죠?
      영상처럼 DontDestroyOnLoad로 지정된 오브젝트에 저장하는 방법도 있고 static 클래스에 저장하는 방법도 있을 겁니다.
      그렇게 저장되어 있는 값을 다른 층으로 이동했을 때 불러와서 세팅해주면 될 거에요!

  • @네임-g6n
    @네임-g6n 4 года назад +1

    유익한 강의 감사합니다! 1번째 방식으로 따라했는데, 오브젝트가 하나로 유지되는 건 성공했는데, 안에 연결되어있던 게임매니저가 사라졌습니다ㅠㅠ 이럴 땐 어떻게 해야하나요?

    • @wergia
      @wergia  4 года назад

      안에 연결되어 있는 게임 매니저도 게임오브젝트였다면 아마 사라질 겁니다.
      게임 매니저 역시 사라지지 않으려면 DontDestoryOnLoad로 설정해줘야 합니다.

    • @네임-g6n
      @네임-g6n 4 года назад +1

      @@wergia 게임매니저가 유지되는 건 성공했는데... 씬2에서 씬1으로 넘어갈 때 Time.timeScale = 0으로 두었다가 씬1에서 다시 Time.timeScale = 1를 하도록 하는데 이게 작동을 안 합니다.... 그래서 다시 씬 2로 이동이 안 됩니다.... ㅠㅠ

    • @wergia
      @wergia  4 года назад

      @@네임-g6n Time.timeScale = 1을 어디서 호출하고 있나요?

    • @네임-g6n
      @네임-g6n 4 года назад +1

      @@wergia 씬1의 awake에서 호출하고 있습니다

    • @네임-g6n
      @네임-g6n 4 года назад +1

      지금 2번째 스트립트에는
      void Awake()
      {
      var obj = FindObjectsOfType();
      if (obj.Length == 1)
      {
      DontDestroyOnLoad(gameManager);
      DontDestroyOnLoad(gameObject);
      }
      else
      {
      Destroy(gameObject);
      Destroy(gameManager);
      }
      }
      가 있고 1번쨰 스크립트에는
      void Awake()
      {
      Time.timeScale = 1;
      rigid = GetComponent();
      SpriteRenderer = GetComponent();
      anim1 = GetComponent();
      }
      이렇게 되어있습니다 스프라이트랜더만 작동하는 걸 봐선 타임이 0으로 되어있는 것 같아서 추가로 적어요,,,ㅠㅠ

  • @jaewonlee4480
    @jaewonlee4480 4 года назад +1

    안녕하세요, 영상 잘보고 있습니다! 저는 약간 다른 문제인데 하나의 scene(1) 에서 스코어를 저장하고 다음 scene(2) 에서 그 스코어를 표기하고 그대로 가져와 표기하고 싶은데, 그 스코어들을 Script(1) 에 public int score1로 저장을 했는데, 그 스코어를 Script(2)에서 불러오게 해서 scene2에 보여지게 하고싶은데 혹시 이때도 DontDestoryOnLoad 사용이 가능한가요? 감사합니다 :)

    • @wergia
      @wergia  4 года назад

      음 차라리 Script(1)을 DontDestroyOnLoad로 만들어서 scene(2)에서도 사용하는게 어떨까 싶네요.
      scene(1)에서는 Script(1)을 쓰고 scene(2)에서는 Script(2)를 사용하는 구조를 완전히 유지하고 싶다면
      1. DontDestroy로 된 중간 오브젝트를 만들어서 Script(1) -> 중간 오브젝트 -> Script(2) 로 전달하는 구조를 만들던지
      2. Script(1)의 public int score1을 public static int score로 정적 변수로 만들어서 객체 생성과 관계없이 Script(2)에서 꺼내서 쓸 수 있게 만들던지(단, static은 모든 Script(1) 클래스의 객체들이 공유하기 때문에 여러 Script(1) 오브젝트의 점수를 저장하지 못하게 될 겁니다.)
      3. 다른 방법은 각 스테이지별 점수를 저장하는 static 객체를 만들어서 scene(1)의 Script(1)에서는 Scorer.scene1Score = 10;으로 접근해서 저장하고 scene(2)의 Script(2)에서는 Scorer.scene2Score = Scorer.scene1Score 식으로 가져와서 사용하는 방법
      정도가 당장 생각나네요.
      구조는 얼마든지 자유롭게 생각하시면 됩니다. 그 중에서 가장 적절하다고 생각하는 구조를 선택하시면 됩니다.

  • @wkwldwldskful
    @wkwldwldskful 3 года назад +1

    와.. 찾던 기능인데 이렇게 찾을 줄이야. 제가 구현하다가 약간의 오류?가 생겨서 이렇게 댓글을 남깁니다. 캐릭터를 DontDestroyOnLoad기능을 이용해서 씬이 넘어가도 삭제되지 않게 만들었는데, 씬이 바뀌면 캐릭터가 자꾸 떨어지더라구요... 무엇이 문제인지 잘 모르겠어서 이렇게 댓글을 남깁니다

    • @wergia
      @wergia  3 года назад

      캐릭터가 이동된 다음 위치 문제인 듯 하네요
      씬을 이동한 다음에 캐릭터를 씬의 시작 지점으로 재이동시키는 기능을 추가해보세요

  • @서아빠-x8d
    @서아빠-x8d 4 года назад +1

    와우 감사합니다.

  • @wergia
    @wergia  4 года назад

    아 썸네일...

  • @마로가마따
    @마로가마따 3 года назад +1

    너가 최고야!