Unity'de Platform Modunu Taşıma

Hareketli Platform Modu, HoloLens 2 gemiler, petrol platformları ve diğer araçlar gibi hareketli platformlarda düzgün çalışmasını sağlar.

Platform Modunu Taşıma hakkında daha fazla bilgi edinin

Kavramsal Genel Bakış

Karma gerçeklik sistemlerinin doğru çalışması için mikrofonlu kulaklığın ortama göre izlenmesi gerekir. Bu göreli izleme, grafiklerin mikrofonlu kulaklığın kullanıcısına ortamda katı bir şekilde kilitlenmesi için işlenmelerini sağlar. İzleme genellikle, Atayılan Ölçüm Birimi'nden (IMU) dışa dönük kameralar ve ölçümler kullanılarak hesaplanan pozlar birleştirilerek elde edilir. Ortam, ilk başvuru çerçevesinde olduğunda bu yöntem iyi çalışır. Gezegen hareketi gibi küçük etkiler genellikle ihmal edilir.

Ortam, ilk başvuru çerçevesinde olmadığında normal baş izleme sistemi başarısız olur. Hareketli Platform Modu özelliği, ortamın hareket durumunun atsız çerçeveye göre hesaplanarak bu sorunu çözer. Böylece, Hareketli Platform Modu'nda HoloLens 2 ortam gizlenmiş bir gemi olsa bile ortama sabit görünen hologramları işleyebilir!

Hareketli Platform Modu'nu nasıl etkinleştirmeliyim?

Bir dizi kullanım örneğini etkinleştirmek için, Hareketli Platform Modu'nu etkinleştirmek için çeşitli yöntemler sağlanmıştır. Hangi yöntemi seçeceğinizi dikkatle düşünmeniz önemlidir. Sormanız gereken önemli bir soru şudur: HoloLens 2 şu anda hareketli bir platform içinde olup olmadığını kim bilebilir? Örnek için aşağıdaki tabloya bakın:

HL2'nin hareketli bir platformda olup olmadığını kim bilir Hareketli Platform Modu'nu ayarlamak için en iyi yöntem Avantajlar Maliyetler
Sistem Yöneticisi Mobil Cihaz Yönetimi Kullanıcının dahil edilmesi gerekmez. Herhangi bir uygulama değiştirilmeden çalışır. Cihaz yanlış moda girmeden korunabilir. Kullanıcı ve Uygulamalar modu değiştiremez.
Son Kullanıcı Ayarlar Uygulaması Kullanıcı genellikle cihazı ne zaman ve nerede kullandığı konusunda en bilgili kullanıcıdır. Herhangi bir uygulama değiştirilmeden çalışır. Kullanıcı modun mevcut olduğunu bilmiyor olabilir.
Uygulama Bu makalede açıklanan SDK'yi kullanın. Kullanım örneğine özgü ipuçları, ortam önceden bilinmediğinde modu değiştirmek için kullanılabilir. Kullanıcının bu kararı verme ve ayarları değiştirme gereksinimini kaldırır. Kötü tasarlanmış bir uygulama çok kötü bir deneyim sağlayabilir ve cihazı beklenmedik bir modda bırakabilir.

Platform Modunu Taşıma için en iyi yöntemler

Asıl Description
Kullanıcı seçimine saygı Modu değiştirmeden önce kullanıcıya seçim sunmalısınız ve uygulamanın çalışma zamanı için bu seçime saygı sunmaya devam etmelisiniz
Kullanıcıya bir uyarı sağlayın Uygulamanın başlatılması/sürdürülmesi için modu hemen değiştirmekten kaçının. Bu, kullanıcı cihazın izlemeyi neden kaybettiğini bilmediğinden kötü bir kullanıcı deneyimi sunar.
Değiştirme modunu simge durumuna küçültme Hareketli Platform Modu ayarlarını değiştirirken cihaz izlemeyi kaybeder ve olumsuz bir kullanıcı deneyimine neden olur. Bu nedenle modu değiştirdiğiniz sıklığı en aza indirmeniz önerilir. İdeal olarak modun değiştirilmesi için cihazın sabit bir ortamdan hareket eden bir ortama (veya tam tersi) geçmesi gerekir.
Ortam hakkında emin değilseniz Platform Modunu Taşıma'yı kullanın Platform Modu'nu taşımak hem sabit ortamlarda hem de hareketli ortamlarda çalışabilir. Normal izleme algoritmaları yalnızca sabit ortamlarda çalışır, bu nedenle ortamın hareket edip etmediği konusunda emin değilseniz Platform Modunu Taşıma seçeneği daha güvenli bir seçim olabilir.
Platform Modunu Taşıma modunu bilinen sabit ortamlarda kullanmayın Platform Modu'nu taşımak, sabit ortamlarda standart moddan daha az iyi performans gösterir. Bu küçük bir düşüş olsa da çoğu kullanıcı tarafından fark edilir.
Cihazı hangi modda bırakabilirsiniz göz önünde bulundurun Bu SDK, geliştiricilerin cihazın önyüklemesinde güçlü deneyimler tasarlamasına olanak tanır. Cihazın bir sonraki önyüklemesinde hareketli bir platformda olup olmadığını göz önünde bulundurun ve cihazı uygun modda bırakın.

SDK'yi nereden edinebilirim?

Hareketli Platform SDK'sı, C# ve C++ için dil projeksiyonlarını destekleyerek geliştiricilerin Win32 veya UWP platformları için uygulama geliştirmesine olanak tanır. Karma Gerçeklik Özellik Aracı ile SDK'yi indirin ve yükleyin.

bu SDK'Nasıl yaparım? kullanın

SDK'yı yükledikten sonra, betiğinizi aşağıdaki gibi MovingPlatformManger kullanacak şekilde ayarlayabilirsiniz:

// Top of file
using Microsoft.MixedReality.MovingPlatform;
// Code body
m_movingPlatformManager = new MovingPlatformManager();

Geçerli modu okuma

Modun geçerli değeri şu şekilde okunabilir:

MovingPlatformMode currentMode = m_movingPlatformManager.Mode;

MovingPlatformMode aşağıdaki gibi tanımlanan bir sabit listesidir:

public enum MovingPlatformMode
{
    Standard,                // The legacy mode that devices use out-of-the-box.
    MovingPlatformOptimized  // Allows tracking on moving platforms.
}

VR cihazları ve HoloLens 1 gibi Hareketli Platform Modu bulunmayan cihazlar her zaman 'Standart' döndürür.

Modu ayarlama

Hareketli Platform Modu değerini aşağıdaki gibi ayarlayabilirsiniz:

bool success = m_movingPlatformManager.TrySetMode(MovingPlatformMode.MovingPlatformOptimized);

Cihaz modu artık istenen modla eşleşiyorsa TrySetMode true değerini döndürür. Mod zaten istenen durumdaysa hiçbir şey yapılmaz ve cihaz izlemeyi kaybetmez.

Mod değişikliğinde geri çağırma

Bazen başka bir uygulamanın veya kullanıcının Hareketli Platform Modu değerini değiştirip değiştirmediğini bilmek yararlı olabilir. Bunu aşağıdaki gibi yapabilirsiniz.

// Code Body
m_movingPlatformManager.ModeChanged += CallbackOnMPMChanged;
...
void CallbackOnMPMChanged(object sender, MovingPlatformEventArgs args)
{
    movingPlatformModeChanged = true;
    movingPlatformModeValue = args.ModeEntered;
}
...
void Update()
{
    // It's not reccomended to do work in the callback.
    if (movingPlatformModeChanged)
    {
        movingPlatformModeChanged = false;
        // Do some work
    }
}

Modun ayarlanabilir olup olmadığını denetleme

Bazen modu değiştirmeye çalışmadan önce modun ayarlanıp ayarlanmadığını bilmek yararlı olabilir. Örneğin, kullanıcıya tercihini sormanın bir değeri olup olmadığını bilmek istiyorsanız. Platform modunu taşımanın IsSetModeSupported işleviyle ayarlanabilir olup olmadığını bulabilirsiniz:

bool supported = m_movingPlatformManager.IsSetModeSupported();

Cihaz modları değiştirebiliyorsa bu işlev true, mümkün değilse false değerini döndürür. Bu işlev, Mobil Cihaz Yönetimi (MDM) ilkelerini hesaba ekler. Örneğin, MDM MovingPlatformMode'u "Açık" olarak zorlarsa, bu işlev false döndürür.

Tanıtım betiği

Bu betik, SDK'nın tüm önemli öğelerini tek bir yerde gösterir. Örnek, yukarıda gösterilen en iyi yöntemleri izlemez.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Microsoft.MixedReality.MovingPlatform;
using System;

public class MovingPlatformDemo : MonoBehaviour
{
    public GameObject cube; // A simple cube to display colors.
    private MovingPlatformManager m_movingPlatformManager;
    private Renderer cubeRenderer;
    private bool movingPlatformModeChanged;
    private MovingPlatformMode movingPlatformModeValue;

    // Start is called before the first frame update
    void Start()
    {
        m_movingPlatformManager = new MovingPlatformManager();
        cubeRenderer = cube.GetComponent<Renderer>();

        // Get initial value of mode, 
        // Just this mechanism would be adequate if a one time check is acceptable. 
        MovingPlatformMode initialMovingPlatformMode = m_movingPlatformManager.Mode;

        // Find if It's possible to change the mode. 
        bool isSettable = m_movingPlatformManager.IsSetModeSupported();

        // Here you would add some use case specific logic using initialMovingPlatformMode and isSettable
        // to decide if you should ask the user if they want to change the mode. 

        // To set the mode.
        bool success = m_movingPlatformManager.TrySetMode(MovingPlatformMode.MovingPlatformOptimized);

        // Visual indicator of current state: Green = Moving Platform Optimized, Red = Regular.
        SetColourFromState(m_movingPlatformManager.Mode, cubeRenderer);

        // We set a callback to be notified if there's a change in mode. This is typically optional.
        m_movingPlatformManager.ModeChanged += CallbackOnMPMChanged;
        movingPlatformModeChanged = false;
    }

    // Update is called once per frame
    void Update()
    {
        // This must be done in the UI thread.
        if (movingPlatformModeChanged)
        {
            movingPlatformModeChanged = false;
            SetColourFromState(movingPlatformModeValue, cubeRenderer);
        }
    }

    // Sets renderer to:
    // Green = Moving Platform Mode Enabled
    // Red = Moving Platform Mode Disabled
    void SetColourFromState(MovingPlatformMode mode, Renderer thisRend)
    {
        if (mode == MovingPlatformMode.MovingPlatformOptimized)
        {
            thisRend.material.color = new Color(0f, 1f, 0f, 1f);
        }
        else
        {
            thisRend.material.color = new Color(1f, 0f, 0f, 1f);
        }
    }

    void CallbackOnMPMChanged(object sender, MovingPlatformEventArgs args)
    {
        movingPlatformModeChanged = true;
        movingPlatformModeValue = args.ModeEntered;
    }
}

Ayrıca bkz.