장면 추가
검증 환경
- 윈도우
-
- 윈도우 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입니다. 로그도 없는지 확인하십시오.