장면 추가

페이지 업데이트 :
페이지 생성 날짜 :

검증 환경

윈도우
  • 윈도우 11
Unity 에디터
  • 2020.3.25f1
입력 시스템 패키지
  • 1.2.0

이 팁의 전제 조건

이 팁에 대한 설명의 전제로 다음 설정이 미리 이루어졌습니다.

장면 추가 정보

Unity를 사용하면 여러 장면을 동시에 표시할 수 있습니다. 단순히 장면을 오버레이하거나 도면을 다른 텍스처로 내보내고 싶을 때 사용합니다.

이번에는 게임이 실행되는 동안 전경에 메뉴 화면이 표시된다고 가정하고 게임이 실행되는 장면의 중첩 표시에 대해 설명하고자합니다.

여러 장면을 표시할 때는 다음 사항에 유의해야 합니다.

  • EventSystem은 두 개 이상 없어야 합니다.
  • 오디오 리스너는 두 개 이상 없어야 합니다.
  • 여러 대의 카메라를 다룰 때는 주의하십시오

장면 준비

이번에는 2 개의 장면을 준비합니다. 하자 , SampleSceneParent추가로 표시할 장면 SampleSceneChild 은 입니다. 두 장면을 준비하는 방법은 이전 팁과 동일하므로 참고하시기 바랍니다.

이번에는 다음과 같은 레이아웃을 만듭니다. 부모 장면에서 버튼을 클릭하면 자식 장면을 추가하는 것 외에는 문제가 없습니다. 그리고 나중에 보게 될 증상을 더 쉽게 Canvas 이해할 수 있도록 스프라이트가 배치됩니다.

SampleScene부모

SampleSceneChild(샘플씬차일드)

여러 장면이 표시되는 경우 개체의 컨텍스트는 장면 단위에 관계없이 각 개체의 "레이어 순서"에 따라 달라집니다. 초기값이 모두 0이므로 no와 스프라이트를 "1"로 설정합니다 SampleSceneChild Canvas .

빌드 설정에서 두 장면을 설정하는 것을 잊지 마십시오.

장면 처리

장면 전환과 동일한 방식으로 코드에서 처리됩니다. 이번에도 버튼을 클릭하면 처리되지만 장면 전환이 아닌 추가로 처리됩니다.

스크립트 파일의 이름은 임의로 지정할 수 있지만 여기 SceneAdd 에서는 .

스크립트는 다음과 같습니다.

using UnityEngine;
using UnityEngine.SceneManagement;  // 追加

public class SceneAdd : MonoBehaviour
{
  /// <summary>ボタンをクリックしたときに呼ばれます。</summary>
  public void OnClick()
  {
    // 指定したシーンを追加します
    SceneManager.LoadScene("SampleSceneChild", LoadSceneMode.Additive);
  }
}

장면을 LoadSceneMode 전환 할 때 로 Single 설정했지만 이번에는 Additive . 그것이 차이점의 전부입니다.

스크립트를 저장한 후 SampleSceneParent 에 첨부합니다. EventSystem

버튼에서 OnClick 방법을 설정합니다.

게임을 실행하여 어떻게 작동하는지 확인하십시오. 버튼을 클릭하면 자식 장면이 보입니다.

또한 계층 구조를 보면 두 개의 장면이 있음을 알 수 있습니다.

그러나 장면이 추가 된 것에도 불구하고 부모 장면의 Canvas의 내용이 표시되지 않는 것 같습니다. 반대로, 부모 씬의 스프라이트가 레이어의 순서에 따라 뒷면에 표시되는 것을 볼 수 있습니다.

또한 콘솔을 보면 로그가 지속적으로 출력되는 것을 볼 수 있습니다.

내용은 다음 두 가지입니다.

  • 장면에는 2개의 이벤트 시스템이 있습니다. 장면에 항상 정확히 하나의 이벤트 시스템이 있는지 확인하십시오
  • 장면에는 2개의 오디오 리스너가 있습니다. 장면에 항상 정확히 하나의 오디오 리스너가 있는지 확인하십시오.

여러 장면을 사용하는 경우 이 두 지점과 카메라에 대응해야 합니다.

EventSystem 오류 수정

로그의 내용은 다음과 같습니다.

장면에는 2개의 이벤트 시스템이 있습니다. 장면에 항상 정확히 하나의 이벤트 시스템이 있는지 확인하십시오

(장면에는 두 개의 이벤트 시스템이 있습니다.) 장면에 항상 하나의 이벤트 시스템이 있는지 확인하십시오.)

작성된 대로 EventSystem을 하나의 솔루션으로 결합하면 문제가 해결됩니다.

SampleSceneParent 항상 존재하는SampleSceneChild 것으로 간주되므로 열 때 EventSystem 삭제하십시오.

물론 단독SampleSceneChild 으로 실행하면 버튼 등의 UI가 작동하지 않으므로주의하시기 바랍니다.

실행할 때 EventSystem 로그가 사라진 것을 볼 수 있습니다.

SampleSceneParent 또한, 존재 EventSystem 하기 때문에, 자식 장면 내의 버튼들이 활성화될 수 있다.

AudioListeners 오류 수정

로그의 내용은 다음과 같습니다.

장면에는 2개의 오디오 리스너가 있습니다. 장면에 항상 정확히 하나의 오디오 리스너가 있는지 확인하십시오.

(장면에는 두 개의 오디오 리스너가 있습니다.) 장면에 항상 오디오 리스너가 하나만 있는지 확인합니다. )

Main Camera 의 구성 요소를 살펴보면 오디오 리스너가 존재한다는 것을 확실히 알 수 있으므로 에서 오디오 리스너를 삭제할 수 있습니다 SampleSceneChild . 다음 항목의 카메라 제어로 해결할 수 있으므로 거기에서 처리합니다.

카메라를SampleSceneChild 유지하려면 이 오디오 리스너를 삭제해야 합니다.

두 장면을 표시하도록 카메라 변경

자식 장면을 추가할 때 자식 장면의 캔버스만 표시되는 원인은, 이는 캔버스에 부모 장면과 자식 장면이 설정된 두 대의 카메라가 있고 하나의 카메라만 표시되기 때문입니다.

이에 대한 해결책은 부모 장면의 카메라로 두 장면의 캔버스를 표시하는 것입니다. 이 프로세스는 자식 장면이 추가된 후 자식 장면의 캔버스에 있는 카메라를 부모 장면의 카메라로 교체하는 것입니다.

스크립트를 만들어 보겠습니다. 이름은 임의적이지만 이 경우에는 ChildSceneCamera .

스크립트는 다음과 같습니다. Canvas 에 연결하기 위한 필수 구성 요소 프로세스입니다.

using System.Linq;
using UnityEngine;
using UnityEngine.SceneManagement;

public class ChildSceneCamera : MonoBehaviour
{
  /// <summary>シーンに追加されたタイミングで処理されます。</summary>
  void Awake()
  {
    // 親のシーンのキャンバスを取得
    var parentScene = SceneManager.GetSceneByName("SampleSceneParent");
    var parentCanvas = parentScene.GetRootGameObjects().First(obj => obj.GetComponent<Canvas>() != null).GetComponent<Canvas>();

    // 子のシーンのキャンバスを取得
    var childCanvas = GetComponent<Canvas>();

    // 子のシーンのカメラを削除
    Object.Destroy(childCanvas.worldCamera.gameObject);

    // 子のシーンのキャンバスのカメラを親のシーンのカメラに置き換えます
    childCanvas.worldCamera = parentCanvas.worldCamera;
  }
}

Awake 이 메서드는 개체가 장면에 처음 존재할 때 실행됩니다. Start 메서드 앞에서 실행됩니다. 자주 사용한다는 것을 기억하는 것이 좋습니다. 이번에는 자식 장면이 추가될 때 실행된다고 가정합니다.

/// <summary>シーンに追加されたタイミングで処理されます。</summary>
void Awake()
{
  // 処理
}

부모 장면 캔버스와 자식 장면 캔버스를 가져와서 카메라를 대체합니다. 방법은 여러가지가 있습니다만, 주된 주제가 아니기 때문에, 우선 이대로 하면 받을 수 있다고 생각할 수 있습니다.

// 親のシーンのキャンバスを取得
var parentScene = SceneManager.GetSceneByName("SampleSceneParent");
var parentCanvas = parentScene.GetRootGameObjects().First(obj => obj.GetComponent<Canvas>() != null).GetComponent<Canvas>();

// 子のシーンのキャンバスを取得
var childCanvas = GetComponent<Canvas>();

먼저 자식 장면의 카메라를 Object.Destroy 파괴합니다. 없어져도 부모의 장면의 카메라에 가릴 수 있기 때문에 문제 없습니다. 삭제 대상 Canvas.worldCamera 은 에서 검색됩니다. 이 시점에서 장면과 동일한 카메라가 설정되어 쉽게 획득 할 수 있기 때문입니다. 실제로 삭제하려면 장면에서 카메라를 가져 오는 것이 좋습니다.

// 子のシーンのカメラを削除
Object.Destroy(childCanvas.worldCamera.gameObject);

마지막으로 자식 장면 Canvas.worldCamera 이 부모의 카메라로 바뀝니다.

// 子のシーンのキャンバスのカメラを親のシーンのカメラに置き換えます
childCanvas.worldCamera = parentCanvas.worldCamera;

스크립트를 저장한 후 SampleSceneChild 에 첨부합니다. Canvas

자식 장면을 실행하고 추가한 결과가 아래 그림과 같으면 OK입니다. 로그도 없는지 확인하십시오.