Öğ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:

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.

  1. git deposunu kopya edin veya Azure Remote Rendering,indirme işlemiyle zip'i bilinen bir konuma ayıklarsanız.
  2. Unity projesinde Varlıklar -> Paketi İçeri Aktar -> Özel Paket'i seçin.
  3. 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
  4. Paketin içeriğini projenize içeri aktaracak İçeri Aktar düğmesini seçin.
  5. 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.

  1. Sahne hiyerarşisinde MixedRealityToolkit GameObject öğesini seçin.
  2. Denetçi'de MixedRealityToolkit bileşeni altında yapılandırma profilini ARRMixedRealityToolkitConfigurationProfile olarak ayarlayın.
  3. 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.

  1. Assets/RemoteRenderingTutorial/Prefabs/AppMenu içinde AppMenu önfazını bulun

  2. AppMenu prefab'ı sahneye sürükleyin.

  3. 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.

  4. 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.

    Atlamayı kaldır.

  5. Unity Düzenleyicisi'nde Oynat'a basarak görünüm denetleyicisini test etmek.

  6. 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.

  7. Cihazda AppMenu'ya yükseltmek için cihazınızı yukarı yükseltebilirsiniz. Unity Düzenleyicisi'nde 'M' kısayol anahtarını kullanın.

  8. 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.

  9. 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.

    KULLANıCı arabirimi yetkilendirmesi

  10. Öğ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.

  1. 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.

  1. Sahnede yeni bir boş Oyun Nesnesi oluşturun ve modele ModelStage adını girin.

  2. ModelStage'e World Anchor bileşeni ekleme

    WorldAnchor bileşeni ekleme

  3. ModelStage'in alt adı olarak boş bir Oyun Nesnesi oluşturun ve bunu TestModel olarak adlandırabilirsiniz.

  4. TestModel'e RemoteRenderedModel betiği ekleyin.

    RemoteRenderedModel bileşeni ekleme

  5. ve ifadesini Model Display Name sırasıyla Model Path "TestModeli" ve "builtin://Engine" ile doldurun.

    Model ayrıntılarını belirtme

  6. TestModel nesnesini kameranın önüne, x = 0, y = 0, z = 3 konumunda konuma getirin.

    Nesne konumlandırma

  7. AutomaticallyLoad'ın açık olduğundan emin olun.

  8. Uygulamayı test etmek için Unity Düzenleyicisi'nde Oynat'a basın.

  9. 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.

Unity günlüğü

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

  1. Sahnede yeni bir boş Oyunobject oluşturun ve özel modelinize benzer şekilde adlandırın.

  2. Remoterenderedmodel betiğini yeni oluşturulan oyunobject öğesine ekleyin.

    RemoteRenderedModel bileşeni ekleme

  3. Model Display NameModelinize uygun bir adla girin.

  4. Model PathYukarıdaki giriş adımlarında oluşturduğunuz modelin paylaşılan erişim IMZASı (SAS) URI 'siyle birlikte girin.

  5. X = 0, y = 0, z = 3 konumundaki oyunun önünde kameranın önüne konumlandırın.

  6. Automaticallyload 'un açık olduğundan emin olun.

  7. 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.

  8. Ö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.