>백엔드 개발 >C++ >내 Unity 게임 관리자 스크립트가 한 번만 실행되는 이유는 무엇이며 장면 전체에 걸쳐 지속되도록 하려면 어떻게 해야 합니까?

내 Unity 게임 관리자 스크립트가 한 번만 실행되는 이유는 무엇이며 장면 전체에 걸쳐 지속되도록 하려면 어떻게 해야 합니까?

Barbara Streisand
Barbara Streisand원래의
2025-01-14 08:06:43816검색

Why Does My Unity Game Manager Script Only Run Once, and How Can I Make It Persistent Across Scenes?

Unity Game Manager: 시나리오 간 지속성 문제 및 솔루션

질문:

여러 장면에 걸쳐 지속되도록 설계된 게임 관리자 스크립트는 모든 장면에 존재하더라도 프로젝트 초기화 시 한 번만 실행됩니다.

이유:

모든 Unity 프로젝트에는 영구 개체 및 시스템의 중앙 허브로 "사전 로드 장면"이 필요합니다. 이 시나리오는 빌드 설정에서 시나리오 0으로 지정되어야 합니다.

해결책:

  1. 미리 로드된 장면 만들기:

    • 빌드 설정에서 "preload"라는 새 장면을 추가하고 장면 0으로 지정합니다.
  2. 미리 로드된 게임 개체 추가:

    • 사전 로드 장면에서 "__app"이라는 빈 게임 개체를 만듭니다.
  3. DontDestroyOnLoad 적용:

    • "DontDestroyOnLoad" 스크립트(또는 구성 요소)를 "__app" 게임 개체에 추가합니다. 이 스크립트는 개체와 해당 구성 요소가 장면 전환 시에도 지속성을 유지하도록 보장합니다.
  4. 사전 로드 장면에 일반적인 동작 배치:

    • 데이터베이스 연결, 음향 효과, 채점 등 모든 공유 게임 로직은 미리 로드된 장면의 "__app" 게임 개체에 배치되어야 합니다.

다른 장면의 구성요소 찾기:

다른 장면에서 이러한 영구 구성 요소에 액세스하려면 정적 메서드 "Object.FindObjectOfType()"을 사용할 수 있습니다. 예:

<code class="language-C#">SoundEffects sound = Object.FindObjectOfType<SoundEffects>();
GameState state = Object.FindObjectOfType<GameState>();</code>

선택적 최적화:

코드 중복을 줄이려면 다음 전역 스크립트 사용을 고려하세요.

<code class="language-C#">public static class App
{
    public static SoundEffects SoundEffects { get; private set; }
    public static GameState GameState { get; private set; }

    static App()
    {
        GameObject appObject = GameObject.Find("__app");
        SoundEffects = appObject.GetComponent<SoundEffects>();
        GameState = appObject.GetComponent<GameState>();
    }
}</code>

이 스크립트를 사용하면 단순화된 구문을 사용하여 이러한 구성 요소에 액세스할 수 있습니다.

<code class="language-C#">App.SoundEffects.PlayExplosion();
App.GameState.CurrentLevel = 5;</code>

개발 편의성 :

개발 효율성을 높이기 위해 "preload" 장면에 스크립트를 추가하는 것을 고려할 수 있습니다. "__app" 개체가 존재하지 않으면 프로젝트 초기화 중에 "preload" 장면이 자동으로 로드됩니다. 이렇게 하면 "Play"를 클릭할 때마다 게임이 "preload" 장면에서 시작됩니다.

위 내용은 내 Unity 게임 관리자 스크립트가 한 번만 실행되는 이유는 무엇이며 장면 전체에 걸쳐 지속되도록 하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.