Öğretici: Arabirimler ve özel modeller
Bu öğreticide şunların nasıl yapıldığını öğreneceksiniz:
- Projeye Karma Gerçeklik Araç Seti ekleme
- Model durumunu yönetme
- Model Azure Blob Depolama için yapılandırma
- İşleme için modelleri karşıya yükleme ve işleme
Önkoşullar
Kullanmaya başlayın Araç Seti (MRTK) ile birlikte kullanma
Karma Gerçeklik Araç Seti (MRTK), karma gerçeklik deneyimleri için platformlar arası bir araç setidir. MrTK 2.5.1'i etkileşim ve görselleştirme özellikleri için kullan kullanıruz.
MRTK eklemek için MRTK Yükleme Kılavuzu'nda listelenen Gerekli adımları izleyin.
Bu adımlar şunlardır:
- En son MRTK Unity paketlerini al
- "En son" de olsa MRTK sürüm sayfasından 2.5.1 sürümünü kullanın.
- Bu öğreticide yalnızca Foundation paketini kullanıyoruz. Uzantılar, Araçlar ve Örnekler paketleri gerekli değildir.
- MRTK paketlerini Unity projenize aktarma
- Unity projenizi hedef platforma değiştirme
- Bu adımı ilk bölümde zaten yapmış olması gerekir, ancak şimdi bir kez daha kontrol etmek için iyi bir zaman!
- MRTK'yi yeni bir sahneye veya yeni projeye ekleme
- MRTK'yi yeni bir sahneye ekleyebilir ve koordinatör ve model nesnelerinizi/betiklerinizi yeniden ekleyebilir veya Karma Gerçeklik Araç Seti -> Sahneye Ekle ve Yapılandır menü komutunu kullanarak MRTK'yi mevcut sahnenize ekleyebilirsiniz.
Bu öğretici tarafından kullanılan varlıkları içeri aktarma
Bu bölümden başlayarak ele alan malzemenin büyük bölümü için basit bir model-görünüm-denetleyici deseni uygulayacak. Modelin model bölümü, Azure Remote Rendering ilgili belirli kod ve durum yönetimi Azure Remote Rendering. Düzenin görünüm ve denetleyici bölümleri MRTK varlıkları ve bazı özel betikler kullanılarak uygulanır. Bu öğreticide, burada uygulanan görünüm denetleyicisi olmadan modeli kullanmak mümkündür. Bu ayrım, bu öğreticide bulunan kodu kendi uygulamanıza kolayca tümleştirebilirsiniz. Burada tasarım deseninin görünüm denetleyicisi bölümünü alır.
MRTK'nin tanıtımıyla birlikte etkileşimleri ve görsel geri bildirimleri desteklemek için projeye eklen bir dizi betik, önfaz ve varlık vardır. Öğretici Varlıkları olarak adlandırılan bu varlıklar,'\Unity\TutorialAssets\TutorialAssets.unitypackage' konumundaki Azure Remote Rendering GitHub'da bulunan bir UnityVarlık Paketi içinde paket haline gelir.
- git deposunu kopya edin veya Azure Remote Rendering,indirme işlemiyle zip'i bilinen bir konuma ayıklarsanız.
- Unity projesinde Varlıklar -> Paketi İçeri Aktar -> Özel Paket'i seçin.
- Dosya gezgininde, Azure Remote Rendering deposunu kopyaladık veya sıkıştırmasını açtıktan sonra Unity -> TutorialAssets -> TutorialAssets.unitypackage içinde bulunan .unitypackage öğesini seçin
- Paketin içeriğini projenize içeri aktaracak İçeri Aktar düğmesini seçin.
- Unity Düzenleyicisi'nde, üst menü çubuğundan Karma Gerçeklik Araç Seti -> Yardımcı Programlar -> MRTK Standart Gölgelendiriciyi Basit İşleme İşlem Hattı için Yükselt'i seçin ve gölgelendiriciyi yükseltmek için yönergeleri izleyin.
MRTK ve Öğretici Varlıkları projeye dahil edildiktan sonra, MRTK profilini öğretici için daha uygun bir taneye değiştirelim.
- Sahne hiyerarşisinde MixedRealityToolkit GameObject öğesini seçin.
- Denetçi'de MixedRealityToolkit bileşeni altında yapılandırma profilini ARRMixedRealityToolkitConfigurationProfile olarak ayarlayın.
- Değişikliklerinizi kaydetmek için Ctrl+S tuşlarına basın.
Bu, MRTK'yi öncelikle varsayılan HoloLens 2 profilleriyle yapılandıracak. Sağlanan profiller aşağıdaki yollarla önceden yapılandırılmıştır:
- Profilleyiciyi kapatın (açıp kapatmak için 9'a basın veya cihazda "ProfilLeyiciyi Göster/Gizle" diyelim).
- Göz bakışı imlecini kapatın.
- Simülasyon el yerine fareyle MRTK kullanıcı arabirimi öğelerine tıklamak için Unity fare tıklamalarını etkinleştirin.
Uygulama Menüsü Ekleme
Bu öğreticide yer alan görünüm denetleyicilerinin çoğu, somut sınıflar yerine soyut temel sınıflara karşı çalışır. Bu düzen daha fazla esneklik sağlar ve bir yandan sizin için görünüm denetleyicilerini sağlamamıza olanak sağlarken diğer yandan da bu kodu öğrenme Azure Remote Rendering sağlar. Kolaylık olması için RemoteRenderingCoordinator sınıfının soyut bir sınıfı sağlanmaz ve görünüm denetleyicisi doğrudan somut sınıfa karşı çalışır.
Artık geçerli oturum durumuyla ilgili görsel geri bildirim için sahneyi önceden eklemek için AppMenu'ya eklemeye devam edin. Bu görünüm denetleyicisi, sahneyle daha fazla ARR özelliği uygulayan ve tümleştirilemediklerinden daha fazla alt menü görünümü denetleyicisinin kilidini "açabilir". AppMenu şimdilik ARR durumunun görsel bir göstergesine sahip olacak ve kullanıcının uygulamayı ARR'ye bağlanmak için yetkilendirmek için kullandığı kalıcı paneli sunacak.
Assets/RemoteRenderingTutorial/Prefabs/AppMenu içinde AppMenu önfazını bulun
AppMenu prefab'ı sahneye sürükleyin.
Büyük olasılıkla TMP İçeri Aktarıcı için bir iletişim kutusu görüntülenir çünkü bu sahneye ilk kez Text Mesh Pro varlıklarını dahil ediyoruz. TMP Essentials'i İçeri Aktarma yönergelerini izleyin. Ardından içeri aktarıcı iletişim kutusunu kapatın; örnekler ve ek özellikler gerekli değildir.
AppMenu, otomatik olarak bağlanacak ve oturuma bağlanmaya onay veren kalıcı bilgileri sağlayacak şekilde yapılandırılmıştır. Bu nedenle, daha önce yerleştirilen atlayı kaldırabiliriz. RemoteRenderingCoordinator GameObject'te, Yetkilendirme İsteğiNde olayında '-' düğmesine basarak daha önce gerçekleştirdik yetkilendirme atla'sini kaldırın.
.Unity Düzenleyicisi'nde Oynat'a basarak görünüm denetleyicisini test etmek.
Düzenleyici'de MRTK yapılandırıldığından, görünümünüzle ilgili konumu değiştirmek ve sağ fare düğmesini basılı tutarak + görünüm yönünü değiştirmek için fareyi hareket ettiren WASD anahtarlarını kullanabilirsiniz. Denetimler hakkında bilgi almak için sahne etrafında biraz "sürüş" yapmaya çalışabilirsiniz.
Cihazda AppMenu'ya yükseltmek için cihazınızı yukarı yükseltebilirsiniz. Unity Düzenleyicisi'nde 'M' kısayol anahtarını kullanın.
Menüyü gözden kaybolduysanız menüyü çağırmak için 'M' tuşuna basın. Menü, kolayca etkileşim için kameranın yanına yerleştirilir.
Yetkilendirme artık AppMenu'nun sağ tarafından bir istek olarak göstereceğiz. Bundan sonra bunu kullanarak uygulamayı uzaktan işleme oturumlarını yönetme yetkisi vereceksiniz.

Öğreticiye devam etmek için Unity'nin oynaması durdurun.
Model durumunu yönetme
Şimdi durumu izlemek, olaylara yanıt verme, olayları ve yapılandırmayı uygulamak için RemoteRenderedModel betiği uygulayan yeni bir betik uygulay ediyoruz. Temelde RemoteRenderedModel, model verileri için uzak yolu içinde modelPath depolar. RemoteRenderingCoordinator'daki durum değişikliklerini dinler ve tanımladığı modeli otomatik olarak yüklemesi veya kaldırması gerekip gerekmey edemeyr. RemoteRenderedModel'in bağlı olduğu GameObject, uzak içeriğin yerel üst öğesi olur.
RemoteRenderedModel betiğinde, Öğretici Varlıkları'ndan dahil edilen BaseRemoteRenderedModel'i uygulamaya dikkat edin. Bu, uzak model görünüm denetleyicisinin betiğinize bağlamasını sağlar.
RemoteRenderingCoordinator ile aynı klasörde RemoteRenderedModel adlı yeni bir betik oluşturun. İçeriğin tamamını aşağıdaki kodla değiştirin:
// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See LICENSE in the project root for license information. using Microsoft.Azure.RemoteRendering; using Microsoft.Azure.RemoteRendering.Unity; using System; using UnityEngine; using UnityEngine.Events; public class RemoteRenderedModel : BaseRemoteRenderedModel { public bool AutomaticallyLoad = true; private ModelState currentModelState = ModelState.NotReady; [SerializeField] [Tooltip("The friendly name for this model")] private string modelDisplayName; public override string ModelDisplayName { get => modelDisplayName; set => modelDisplayName = value; } [SerializeField] [Tooltip("The URI for this model")] private string modelPath; public override string ModelPath { get => modelPath.Trim(); set => modelPath = value; } public override ModelState CurrentModelState { get => currentModelState; protected set { if (currentModelState != value) { currentModelState = value; ModelStateChange?.Invoke(value); } } } public override event Action<ModelState> ModelStateChange; public override event Action<float> LoadProgress; public override Entity ModelEntity { get; protected set; } public UnityEvent OnModelNotReady = new UnityEvent(); public UnityEvent OnModelReady = new UnityEvent(); public UnityEvent OnStartLoading = new UnityEvent(); public UnityEvent OnModelLoaded = new UnityEvent(); public UnityEvent OnModelUnloading = new UnityEvent(); public UnityFloatEvent OnLoadProgress = new UnityFloatEvent(); public void Awake() { // Hook up the event to the Unity event LoadProgress += (progress) => OnLoadProgress?.Invoke(progress); ModelStateChange += HandleUnityStateEvents; } private void HandleUnityStateEvents(ModelState modelState) { switch (modelState) { case ModelState.NotReady: OnModelNotReady?.Invoke(); break; case ModelState.Ready: OnModelReady?.Invoke(); break; case ModelState.Loading: OnStartLoading?.Invoke(); break; case ModelState.Loaded: OnModelLoaded?.Invoke(); break; case ModelState.Unloading: OnModelUnloading?.Invoke(); break; } } private void Start() { //Attach to and initialize current state (in case we're attaching late) RemoteRenderingCoordinator.CoordinatorStateChange += Instance_CoordinatorStateChange; Instance_CoordinatorStateChange(RemoteRenderingCoordinator.instance.CurrentCoordinatorState); } /// <summary> /// Listen for state changes on the coordinator, clean up this model's remote objects if we're no longer connected. /// Automatically load if required /// </summary> private void Instance_CoordinatorStateChange(RemoteRenderingCoordinator.RemoteRenderingState state) { switch (state) { case RemoteRenderingCoordinator.RemoteRenderingState.RuntimeConnected: CurrentModelState = ModelState.Ready; if (AutomaticallyLoad) LoadModel(); break; default: UnloadModel(); break; } } private void OnDestroy() { RemoteRenderingCoordinator.CoordinatorStateChange -= Instance_CoordinatorStateChange; UnloadModel(); } /// <summary> /// Asks the coordinator to create a model entity and listens for coordinator state changes /// </summary> [ContextMenu("Load Model")] public override async void LoadModel() { if (CurrentModelState != ModelState.Ready) return; //We're already loaded, currently loading, or not ready to load CurrentModelState = ModelState.Loading; ModelEntity = await RemoteRenderingCoordinator.instance?.LoadModel(ModelPath, this.transform, SetLoadingProgress); if (ModelEntity != null) CurrentModelState = ModelState.Loaded; else CurrentModelState = ModelState.Error; } /// <summary> /// Clean up the local model instances /// </summary> [ContextMenu("Unload Model")] public override void UnloadModel() { CurrentModelState = ModelState.Unloading; if (ModelEntity != null) { var modelGameObject = ModelEntity.GetOrCreateGameObject(UnityCreationMode.DoNotCreateUnityComponents); Destroy(modelGameObject); ModelEntity.Destroy(); ModelEntity = null; } if (RemoteRenderingCoordinator.instance.CurrentCoordinatorState == RemoteRenderingCoordinator.RemoteRenderingState.RuntimeConnected) CurrentModelState = ModelState.Ready; else CurrentModelState = ModelState.NotReady; } /// <summary> /// Update the Unity progress event /// </summary> /// <param name="progressValue"></param> public override void SetLoadingProgress(float progressValue) { LoadProgress?.Invoke(progressValue); } }
En temel terimle RemoteRenderedModel, modeli yüklemek için gereken verileri (bu durumda SAS veya builtin:// URI'sı) tutar ve uzak model durumunu izler. Yükleme zamanı geldiğinde LoadModel RemoteRenderingCoordinator üzerinde yöntemi çağrılır ve modeli içeren Varlık başvuru ve kaldırma için döndürülür.
Test Modelini Yükleme
Şimdi test modelini yeniden yükerek yeni betiği test diyelim. Betiği içeren ve test modelinin üst öğesi olacak bir Oyun Nesnesi ekleyebilirsiniz. Ayrıca modeli içeren bir sanal aşama da oluşturuz. Aşama, WorldAnchorkullanarak gerçek dünyaya göre sabit kalır. Modelin daha sonra taşınmaya devam eder olması için sabit bir aşama kullanıyoruz.
Sahnede yeni bir boş Oyun Nesnesi oluşturun ve modele ModelStage adını girin.
ModelStage'e World Anchor bileşeni ekleme

ModelStage'in alt adı olarak boş bir Oyun Nesnesi oluşturun ve bunu TestModel olarak adlandırabilirsiniz.
TestModel'e RemoteRenderedModel betiği ekleyin.

ve ifadesini
Model Display NamesırasıylaModel Path"TestModeli" ve "builtin://Engine" ile doldurun.
TestModel nesnesini kameranın önüne, x = 0, y = 0, z = 3 konumunda konuma getirin.

AutomaticallyLoad'ın açık olduğundan emin olun.
Uygulamayı test etmek için Unity Düzenleyicisi'nde Oynat'a basın.
Uygulamanın oturum oluşturmasına izin vermek için Bağlan düğmesine tıklayarak yetkilendirme izni verme. Oturuma bağlanacak ve modeli otomatik olarak yükleyecek.
Uygulama durumlarında ilerlerken konsolu izleyin. Dikkat edin, bazı durumların tamamlanması biraz zaman alabilir ve ilerleme durumunu göstermez. Sonuç olarak, model yüklemeden günlükleri görürsünüz ve sonra test modeli sahnede işlenir.
Testmodel oyunnesnesi 'ni Inspector 'daki dönüştürme yoluyla veya sahne görünümünde taşımayı ve döndürmeyi deneyin. Modelin taşınmakta olduğunu ve oyun görünümünde döndürüleceğini görürsünüz.

Azure 'da BLOB depolama sağlama ve özel model alımı
Şimdi kendi modelinizi yüklemeyi deneyebilirsiniz. Bunu yapmak için, blob depolamayı yapılandırmanız ve Azure 'da, bir modeli karşıya yüklemeniz ve dönüştürmeniz gerekir, sonra da bu modeli Remoterenderedmodel betiği kullanarak yükleyeceğiz. Özel model yükleme adımları, şu anda yüklemek için kendi modeliniz yoksa güvenli bir şekilde atlanabilir.
Hızlı başlangıç: bir modeli işleme Için dönüştürmebölümünde belirtilen adımları izleyin. Bu öğreticinin amacı doğrultusunda hızlı başlangıçta yeni model Ekle örnek uygulama bölümüne atlayın. Tanımladığınız modelin paylaşılan erişim imzası (SAS) URI 'si olduktan sonra, aşağıdaki sonraki adıma geçin.
Özel bir model yükleme ve işleme
Sahnede yeni bir boş Oyunobject oluşturun ve özel modelinize benzer şekilde adlandırın.
Remoterenderedmodel betiğini yeni oluşturulan oyunobject öğesine ekleyin.

Model Display NameModelinize uygun bir adla girin.Model PathYukarıdaki giriş adımlarında oluşturduğunuz modelin paylaşılan erişim IMZASı (SAS) URI 'siyle birlikte girin.X = 0, y = 0, z = 3 konumundaki oyunun önünde kameranın önüne konumlandırın.
Automaticallyload 'un açık olduğundan emin olun.
Uygulamayı test etmek için Unity düzenleyicisinde oynat ' a basın.
Konsolun geçerli durumla doldurulmaya başlayacağı ve sonuç olarak, model yükleme ilerleme durumu iletileri görüntülenir. Özel modeliniz daha sonra sahneye yüklenir.
Özel model nesnenizin sahneyi kaldırın. Bu öğreticide en iyi deneyim, test modelini kullanacaktır. ARR 'de çok sayıda model kesinlikle desteklenirken, bu öğretici tek seferde tek bir uzak modeli destekleyecek şekilde yazılmıştır.
Sonraki adımlar
Artık kendi modellerinizi Azure uzaktan Işleme 'ye yükleyebilir ve bunları uygulamanızda görüntüleyebilirsiniz! Ardından, modellerinizi düzenleme konusunda size kılavuzluk ederiz.