Sahne ekleme

Sayfa güncel :
Sayfa oluşturma tarihi :

Doğrulama ortamı

Windows
  • Pencereler 11
Birlik Editörü
  • 2020.3.25f1
Giriş Sistemi Paketi
  • 1.2.0

Bu ipucu için önkoşullar

Aşağıdaki ayarlar, bu ipucunun açıklaması için bir öncül olarak önceden yapılmıştır.

Sahne ekleme hakkında

Unity, aynı anda birden fazla sahneyi görüntülemenizi sağlar. Yalnızca sahneleri bindirmek veya çizimlerinizi farklı bir dokuya dışa aktarmak istediğinizde kullanın.

Bu kez, oyun çalışırken oyun çalışırken menü ekranının ön planda görüntülendiğini varsayarak sahnenin üst üste bindirilmiş görüntüsünü açıklamak istiyorum.

Birden fazla sahne görüntülerken aşağıdakilere dikkat etmeniz gerekir:

  • Birden fazla EventSystem olmamalıdır
  • Birden fazla Ses Dinleyicisi olmamalıdır
  • Birden fazla kamerayı kullanırken dikkatli olun

Sahneyi hazırlayın

Bu sefer iki sahne hazırlayacağız. Olsun, ve SampleSceneParentek olarak görüntülenecek sahne SampleSceneChild . İki sahne hazırlama yöntemi önceki ipuçlarıyla aynıdır, bu yüzden lütfen onlara bakın.

Bu sefer aşağıdaki düzeni oluşturacağız. Üst sahnedeki düğmeyi tıklatırsanız, alt sahneyi eklemek dışında bir sorun yoktur. ve sprite'lar daha sonra göreceğiniz semptomları anlamayı Canvas kolaylaştırmak için yerleştirilir.

SampleSceneParent

SampleSceneChild

Birden fazla sahne görüntülendiğinde, nesnelerin bağlamı, sahne biriminden bağımsız olarak her nesnenin "katman sırasına" bağlıdır. Başlangıç değerlerinin tümü 0 olduğundan, hayır ve hareketli grafik değerlerini "1" olarak bırakın SampleSceneChild Canvas .

İki sahneyi yapı ayarlarında ayarlamayı unutmayın.

Sahneleri İşleme

Kod içinde, sahneler arasında geçiş yapmakla aynı şekilde işlenir. Bu sefer de, düğmeye tıklandığında işlenir, ancak sahne anahtarı yerine ek olarak işlenir.

Komut dosyasının adı keyfidir, ancak işte burada SceneAdd .

Komut dosyası şöyle görünür:

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

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

Sahneleri değiştirirken, , olarak ayarladım, LoadSceneMode Single ama bu sefer Additive . Aradaki farkın hepsi bu kadar.

Komut dosyasını kaydettikten sonra SampleSceneParent konumuna ekleyin. EventSystem

Düğmedeki OnClick yöntemi ayarlayın.

Nasıl çalıştığını görmek için oyunu çalıştırmayı deneyin. Düğmeye tıklarsanız, alt sahneyi göreceksiniz.

Ayrıca, hiyerarşiye bakarsanız, iki sahne olduğunu görebilirsiniz.

Ancak, sahnenin eklenmiş olmasına rağmen, üst sahnenin Kanvasının içeriğinin görüntülenmediği görülüyor. Tersine, üst sahnedeki hareketli grafiklerin katmanların sırasına göre arka tarafta görüntülendiğini görebilirsiniz.

Ayrıca, konsola bakarsanız, günlüklerin sürekli olarak çıkarıldığını görebilirsiniz.

İçerik aşağıdaki iki noktadır.

  • Olay yerinde 2 adet olay sistemi bulunmaktadır. Lütfen sahnede her zaman tam olarak bir etkinlik sistemi olduğundan emin olun
  • Sahnede 2 adet ses dinleyicisi bulunmaktadır. Lütfen sahnede her zaman tam olarak bir ses dinleyicisi olduğundan emin olun.

Birden fazla sahne kullanırken, bu iki noktaya ve kameraya karşılık gelmek gerekir.

EventSystem hatalarını düzeltme

Günlüğün içeriği aşağıdaki gibidir.

Olay yerinde 2 adet olay sistemi bulunmaktadır. Lütfen sahnede her zaman tam olarak bir etkinlik sistemi olduğundan emin olun

(Sahnede iki olay sistemi vardır.) Sahnenizde her zaman bir etkinlik sistemi olduğundan emin olun)

Yazıldığı gibi, EventSystem'i tek bir çözümde birleştirmek sorunu çözecektir.

SampleSceneParent her zaman var olduğu varsayılır,SampleSceneChild bu nedenle açtığınızda silin EventSystem .

Tabii ki, kendi başına çalıştırırsanız,SampleSceneChild düğmeler gibi kullanıcı arayüzünün çalışmayacağını lütfen unutmayın.

Çalıştırdığınızda EventSystem günlüklerinin kaybolduğunu görebilirsiniz.

SampleSceneParent Ayrıca, mevcut olduğundanEventSystem, çocuk sahnesindeki düğmeler etkinleştirilebilir.

AudioListeners hatalarını düzeltme

Günlüğün içeriği aşağıdaki gibidir.

Sahnede 2 adet ses dinleyicisi bulunmaktadır. Lütfen sahnede her zaman tam olarak bir ses dinleyicisi olduğundan emin olun.

(Sahnede iki ses dinleyicisi vardır.) Sahnede her zaman yalnızca bir ses dinleyicisi olduğundan emin olun. )

Main Camera 'nin bileşenlerine bakarsanız, Ses Dinleyicisinin var olduğunu kesinlikle görebilirsiniz, böylece SampleSceneChild Ses Dinleyicisini . Bir sonraki öğenin kamera kontrolü ile çözülebilir, bu yüzden orada ele alacağız.

Kamerayı tutmak istiyorsanız,SampleSceneChild bu Ses Dinleyicisini sileceksiniz.

Fotoğraf makinesini iki sahne gösterecek şekilde değiştirme

Bir alt sahne eklerken yalnızca alt sahnenin tuvalinin görüntülenmesinin nedenine gelince, Bunun nedeni, tuval üzerinde ayarlanmış üst sahne ve alt sahne olmak üzere iki kamera olması ve yalnızca bir kameranın görüntülenmesidir.

Bunun çözümü, her iki sahnenin tuvalini ana sahnenin kamerasıyla görüntülemektir. İşlem, alt sahne eklendikten sonra alt sahnenin tuvalindeki kamerayı üst sahnenin kamerasıyla değiştirmektir.

Bir komut dosyası oluşturalım. Adı keyfidir, ancak bu durumda ChildSceneCamera .

Komut dosyası şöyle görünür: Canvas 'ye eklemek için bir önkoşul işlemidir.

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 Yöntem, nesne sahnede ilk kez bulunduğunda yürütülür. Start Yöntemden önce yürütür. Sık sık kullandığınızı hatırlamak iyidir. Bu kez, alt sahne eklendiğinde yürütüleceği varsayılmaktadır.

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

Kamerayı değiştirmek için üst sahne tuvalini ve alt sahne tuvalini edinin. Bunu yapmanın çeşitli yolları vardır, ancak ana konu bu değildir, bu yüzden şu an için bu şekilde yaparsanız elde edebileceğinizi düşünebilirsiniz.

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

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

Önce çocuk sahnesinin kamerasını Object.Destroy yok edin. Gitmiş olsa bile, sorun yok çünkü ebeveynin sahnesinin kamerası tarafından kaplanabilir. Silme hedefi Canvas.worldCamera şuradan alınır: . Bunun nedeni, sahnenin bu noktada sahip olduğu aynı kameranın ayarlanmış olması ve kolayca elde edilebilmesidir. Gerçekten silmek istiyorsanız, kamerayı sahneden alsanız iyi olur.

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

Son olarak, çocuk sahnesi Canvas.worldCamera ebeveynin kamerasıyla değiştirilir.

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

Komut dosyasını kaydettikten sonra SampleSceneChild konumuna ekleyin. Canvas

Bir alt sahnenin yürütülmesinin ve eklenmesinin sonucunun aşağıdaki şekilde gösterildiği gibi olması sorun değildir. Günlük olmadığından da emin olun.