国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Unity VR 開發(fā)教程 OpenXR+XR Interaction Toolkit (四) 傳送

這篇具有很好參考價值的文章主要介紹了Unity VR 開發(fā)教程 OpenXR+XR Interaction Toolkit (四) 傳送。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。


此教程相關的詳細教案,文檔,思維導圖和工程文件會放入 Spatial XR 社區(qū)。這是一個高質(zhì)量知識星球 XR 社區(qū),博主目前在內(nèi)擔任 XR 開發(fā)的講師。此外,該社區(qū)提供教程答疑、及時交流、進階教程、外包、行業(yè)動態(tài)等服務。

社區(qū)鏈接:
Spatial XR 高級社區(qū)(知識星球)
Spatial XR 高級社區(qū)(愛發(fā)電)

xrrayinteractor,# XR Interaction Toolkit 系列教程,vr,unity,xr


往期回顧:
Unity VR 開發(fā)教程 OpenXR+XR Interaction Toolkit (一) 安裝和配置
Unity VR 開發(fā)教程 OpenXR+XR Interaction Toolkit (二) 手部動畫
Unity VR 開發(fā)教程 OpenXR+XR Interaction Toolkit (三) 轉(zhuǎn)向和移動

上一篇教程中,我們學習了如何用手柄來控制轉(zhuǎn)向和持續(xù)移動。在 VR 應用中,除了持續(xù)移動還有另一種比較常見的移動方式,那就是 “傳送”,即讓玩家直接到達想要傳送的地點 。相較于持續(xù)移動,傳送給人帶來的暈動感不會那么強烈。本篇教程,我們一起來學習如何實現(xiàn)傳送功能。


??教程說明

使用的 Unity 版本: 2021.3.5

使用的 VR 頭顯: Oculus Quest 2

教程使用的 XR Interaction Toolkit 版本:2.3.2

項目源碼(持續(xù)更新):https://github.com/YY-nb/Unity_XRInteractionToolkit2.3.2_Demo

前期的配置:環(huán)境配置參考教程一,手部模型參考教程二

最終實現(xiàn)的效果:向前推動手柄的搖桿然后釋放,實現(xiàn)人物的傳送。

xrrayinteractor,# XR Interaction Toolkit 系列教程,vr,unity,xr


??添加觸發(fā)傳送的腳本

傳送其實也是交互的一種。而交互的過程一般需要兩個對象,一個是可交互的對象(Interactable),一個是發(fā)起交互的對象(Interactor,一般是玩家自己)。傳送的過程也是如此,需要可傳送的區(qū)域和觸發(fā)傳送的人?,F(xiàn)在,我們先來介紹與觸發(fā)傳送相關的腳本。

Locomotion System:可以直接控制場景中的 XR Origin(在 VR 中就是我們自己的身體),從而實現(xiàn) VR 中人物的運動。

Teleportation Provider:負責傳送功能。

XR Ray Interactor:通過射線檢測實現(xiàn)與物體的遠距離交互,在傳送時可以配合可視化的射線使用。

Line Renderer:用于渲染傳送時的射線

XR Interactor Line Visual:搭配 Line Renderer 和 XR Ray Interacter,使準備傳送的射線可視化。

另外 XR Controller(Action-based) 這個腳本也是必備的,它用于跟蹤手柄的姿態(tài)和處理手柄輸入和動作的綁定。而我們的傳送功能也是通過手柄的按鍵觸發(fā)的。(這個系列中的每一篇教程都會用到它,這篇教程再次強調(diào)它是因為待會兒要對這個腳本上的一些設置做些修改)

如果你跟著此系列教程的前三篇做了一遍,那么這些腳本其實就已經(jīng)添加好了。我這里直接將上一篇教程中的大部分場景沿用下來,此時 Hierarchy 窗口如下圖所示:

xrrayinteractor,# XR Interaction Toolkit 系列教程,vr,unity,xr

不過這里還是再簡要地提一下: Locomotion System 游戲物體可以直接在 Hierarchy 面板中的 XR 下創(chuàng)建。

xrrayinteractor,# XR Interaction Toolkit 系列教程,vr,unity,xr

添加了這個游戲物體就會自帶 Teleportation Provider 和 Locomotion System 腳本。

xrrayinteractor,# XR Interaction Toolkit 系列教程,vr,unity,xr

而 XR Controller,XR Ray Interactor,Line Renderer 和 XR Interactor Line Visual 腳本在 XR Origin 下的 LeftHand Controller 和 RightHand Controller 上。

xrrayinteractor,# XR Interaction Toolkit 系列教程,vr,unity,xr

xrrayinteractor,# XR Interaction Toolkit 系列教程,vr,unity,xr

有些小伙伴可能會對上圖中 Sorting Group 的作用感到疑惑。這是創(chuàng)建 XR Origin 的時候在 Left/RightHand Controller 物體上自動添加的組件。通過控制 Sorting Group 上的參數(shù),可以保證射線渲染在 UI 的前面。這部分會在我的 UI 交互教程中具體說明,不過一般的需求下,這個組件其實是可有可無的。

雖然這些腳本可以讓 Unity 自動幫我們創(chuàng)建好,但是還是希望大家能夠記住需要用到哪些腳本,以及這些腳本大致的作用,以便日后能夠根據(jù)我們的需求靈活使用。

最后,我們還需要對 XR Ray Interactor 腳本進行一些操作:
在 Inspector 面板中將 Keep Selected Target 取消勾選。否則當你選中了一個傳送區(qū)域后,你無法切換到另一個傳送區(qū)域。

xrrayinteractor,# XR Interaction Toolkit 系列教程,vr,unity,xr

接下來,我們來介紹一下傳送需要的可交互對象。


??添加傳送區(qū)域腳本

?Teleportation Area 腳本

我們可以在地面(在本教程的場景中是 Plane)添加 Teleportation Area 腳本。
注:地面必須要有碰撞體,且碰撞體不能設為 Is Trigger,否則無法檢測到傳送區(qū)域

xrrayinteractor,# XR Interaction Toolkit 系列教程,vr,unity,xr

如果沒有給此腳本的 Colliders 手動賦值,那么它會找到任意一個子物體(包括自己)的碰撞體,將該碰撞體用于檢測是否選中了傳送區(qū)域,如果觸發(fā)傳送的射線射到了碰撞體上,則視為選中了傳送區(qū)域。

這時候我們可以運行一下程序??梢钥吹绞植繒l(fā)出一條直線。當直線射到地面上時,射線顏色會變成白色,因為這時候我們選中了傳送區(qū)域;當直線沒有射到地面上,射線的顏色會變成紅色。

xrrayinteractor,# XR Interaction Toolkit 系列教程,vr,unity,xr

按下手柄的 Grip 鍵,傳送就會生效。至于為什么是按下 Grip 鍵才能傳送,在稍后的 “向前推動手柄搖桿實現(xiàn)傳送” 這一部分會進行詳細地說明。


?Teleportation Anchor 腳本

Teleportation Anchor 可以理解成傳送的一個目標點,它能使玩家傳送到一個指定的位置和角度。

為了演示,我創(chuàng)建了一個新的 Plane,然后創(chuàng)建一個空物體叫做 “Teleportation Anchor",作為傳送目標點,然后創(chuàng)建一個它的 Cylinder 子物體來表示可傳送的區(qū)域,并且將 Cylinder 的碰撞體用于判斷是否選中了傳送區(qū)域。接著給 Teleportation Anchor 游戲物體添加 Teleportation Anchor 腳本。

為了演示能傳送到特定角度的功能,我將傳送目標點的旋轉(zhuǎn)角度調(diào)了一下,讓它 z 軸角度和相機 z 軸角度不相同。

xrrayinteractor,# XR Interaction Toolkit 系列教程,vr,unity,xr
xrrayinteractor,# XR Interaction Toolkit 系列教程,vr,unity,xr

相較于 Teleportation Area,Teleportation Anchor 多了一個重要的變量:Teleport Anchor Transform。這個變量就決定了傳送的目標點是哪一個,默認是這個腳本所掛載的那個游戲物體,當然你也可以自定義一個傳送點。

這個時候我們試著運行程序,可以發(fā)現(xiàn),當手部的射線射到我們設定的圓柱體上時,射線顏色才會變成白色,說明我們選中了傳送區(qū)域。然后我們按下手柄的 Grip 鍵,我們就會被傳送到圓柱體的那個位置,準確來說就是我們提前設定的 Teleportation Anchor 的位置(可能會有一點點的偏差),嘗試多次傳送到 Teleportation Anchor,每次傳送的位置都是非常相近的,至少都能傳送到我們指定的區(qū)域。

不過我們可以發(fā)現(xiàn),雖然每次傳送的 Position 是相近的,但是傳送后人物面朝向的角度卻還是傳送前面朝向的那個角度。而我們的需求是傳送后面朝向指定的角度,也就是傳送后眼睛看向的方向和 Teleportation Anchor 的 z 軸所指向的方向一樣,那這要怎么實現(xiàn)呢?

xrrayinteractor,# XR Interaction Toolkit 系列教程,vr,unity,xr

xrrayinteractor,# XR Interaction Toolkit 系列教程,vr,unity,xr

回到 Teleportation Anchor 腳本,找到 Match Orientation,改成 Target Up and Forward,意思是傳送到目標點后的角度以目標點正上方為 y 軸,目標點正前方為 z 軸,這就與我們的需求匹配了。

xrrayinteractor,# XR Interaction Toolkit 系列教程,vr,unity,xr

現(xiàn)在我們再運行一下程序看看效果:

xrrayinteractor,# XR Interaction Toolkit 系列教程,vr,unity,xr

現(xiàn)在就成功傳送到了特定的位置,特定的角度。


??向前推動手柄搖桿實現(xiàn)傳送

值得注意的是,目前是只有按下手柄的 Grip 鍵,傳送才會生效。那么是在什么地方定義了 “按下 Grip 鍵開始傳送” 呢?

我們來看 XR Controller 這個腳本(以左手為例),原因就出在這個 Select Action 當中:

xrrayinteractor,# XR Interaction Toolkit 系列教程,vr,unity,xr

我們打開這個 Reference,可以看到 Select 這個動作綁定的是 “Grip 鍵按下” 這個操作

xrrayinteractor,# XR Interaction Toolkit 系列教程,vr,unity,xr

但是,按照大多數(shù) VR 游戲的習慣,傳送一般是向前推動手柄搖桿的時候被激活,然后釋放搖桿進行觸發(fā),那么要怎么更改成這種方式來觸發(fā)傳送呢?

其實在 Input Action Asset 里,就有相關的動作。我們找到 XRI LeftHand Locomotion 的 Teleport Select 或者 Teleport Mode Activate,這兩個動作都綁定了 Primary2DAxis,它表示的是搖桿的坐標位置(把搖桿的推動范圍看作一個坐標系,不動搖桿的時候搖桿位于原點,推動搖桿后搖桿在 x 和 y 軸上的位置會發(fā)生偏移。

xrrayinteractor,# XR Interaction Toolkit 系列教程,vr,unity,xr

它們的區(qū)別可以看界面最右邊的 Binding Properties

Teleport Select:

xrrayinteractor,# XR Interaction Toolkit 系列教程,vr,unity,xr

Teleport Mode Activate:

xrrayinteractor,# XR Interaction Toolkit 系列教程,vr,unity,xr

可以觀察上面兩幅圖用紅框標出的部分,最顯著的區(qū)別是這個 Directions。
Teleport Select 是 Everything,意為搖桿推向任何方向都能激活傳送。
Teleport Mode Activate 是 North,意為搖桿向北(向前)推才能激活傳送。

因為我們想要通過向前推動搖桿來激活傳送,所以我們將要選擇的是 Teleport Mode Activate。然后,我們把 XR Controller 中的 Select Action 和 Select Action Value 都換成 Teleport Mode Activate

xrrayinteractor,# XR Interaction Toolkit 系列教程,vr,unity,xr

接下來可以運行程序,選中了傳送區(qū)域后,向前推動搖桿,再松開搖桿,人物就能夠傳送了!??

?為什么向前推動搖桿時角色不會立刻位移,而是等到松開搖桿才位移(Teleport Trigger)

這里可能有些小伙伴會有些疑問,我們向前推動搖桿會觸發(fā) XR Controller 的 Select Action,也就是觸發(fā)了傳送,但是角色為什么不會立刻位移,而是要等到松開搖桿后才進行位移呢?
原因出在 Teleportation Area/Teleportation Anchor 腳本上的 Teleport Trigger 上,我們看腳本的 Inspector 面板:

xrrayinteractor,# XR Interaction Toolkit 系列教程,vr,unity,xr

因為 Teleport Trigger 默認是 On Select Exited,所以會在退出 Select,也就是松開向前推的搖桿后才會激活傳送的位移功能。


??讓傳送的射線變成曲線

在大多數(shù)游戲中,傳送時的射線是曲線,或者是貝塞爾曲線。我們可以更改 XR Ray Interactor 腳本的配置來實現(xiàn)這個需求。

xrrayinteractor,# XR Interaction Toolkit 系列教程,vr,unity,xr

我們可以選擇 Projectile Curve 或者 Bezier Curve,它們都能實現(xiàn)曲線的效果,只不過底層原理會有些不同。我這邊選擇 Projectile Curve,然后將 Velocity 減小到了 8,Velocity 越大,曲線射到的距離就越遠。感興趣的小伙伴也可以調(diào)試一下曲線的其他數(shù)值以及貝塞爾曲線的各個數(shù)值,調(diào)出適合自己的曲線。

xrrayinteractor,# XR Interaction Toolkit 系列教程,vr,unity,xr

然后運行程序,可以看到射線變成了曲線:

xrrayinteractor,# XR Interaction Toolkit 系列教程,vr,unity,xr


??在射線末端添加輔助瞄準區(qū)域

英文的說法是添加 Reticle,Reticle 有十字線、瞄準線的意思,大家可以聯(lián)想瞄準鏡的樣子。

xrrayinteractor,# XR Interaction Toolkit 系列教程,vr,unity,xr

在大部分 VR 游戲中,傳送的射線末端一般會有一個圓形的區(qū)域,也就是這個 Reticle,用于輔助瞄準,這樣讓傳送看起來更直觀。

那么我們就來簡單地制作一個 Reticle。我創(chuàng)建一個 Cylinder 來表示 Reticle,然后更改縮放值,移除掉它的碰撞體。然后把這個物體做成 Prefab(預制體)。

xrrayinteractor,# XR Interaction Toolkit 系列教程,vr,unity,xr

?法一:在 XR Interactor Line Visual 腳本上添加 Reticle

把剛剛制作的 Reticle 預制體拖到 XR Interactor Line Visual 的 Reticle 當中:

xrrayinteractor,# XR Interaction Toolkit 系列教程,vr,unity,xr

因為大部分 VR 游戲是只用一邊手柄來觸發(fā)傳送,所以我這里先規(guī)定左手負責傳送,因此我把右手的傳送功能關閉,只需把 XR Ray Interactor 腳本關閉就行了。那么我們來看一下實際的效果:

xrrayinteractor,# XR Interaction Toolkit 系列教程,vr,unity,xr

xrrayinteractor,# XR Interaction Toolkit 系列教程,vr,unity,xr

射線末端這個圓形的區(qū)域,就是我們自己添加的 Reticle。

?法二:在 Teleportation Area 或者 Teleportation Anchor 腳本上添加 Reticle

如圖所示, 將我們準備好的 Reticle 賦到 Custom Reticle 處,最終呈現(xiàn)的效果和法一是一樣的:

xrrayinteractor,# XR Interaction Toolkit 系列教程,vr,unity,xr

xrrayinteractor,# XR Interaction Toolkit 系列教程,vr,unity,xr


??實現(xiàn)向前推動搖桿才能顯示傳送射線

大部分 VR 游戲中,只有向前推動手柄的搖桿,才會顯示傳送的射線,然后釋放手柄的搖桿,傳送射線消失。

但是目前為止我們的 Demo 是在程序一運行的時候就會顯示傳送的射線。不過因為射線是由 XR Ray Interactor 控制的,所以改進的思路其實也比較簡單,就是我們可以自定義一個腳本,去控制 XR Ray Interacter 腳本的開啟和關閉。因為射線的打開和關閉是實時檢測的,所以我們應該每一幀去判斷手柄是否觸發(fā)了傳送,以及一個傳送的過程是否結束。


2023.1.18更新:
上面的思路在 2.1.1 版本的 XR Interaction Toolkit 可以奏效,但是新版的 XR Interaction Toolkit 經(jīng)嘗試,控制 XR Ray Interacter 腳本的開啟和關閉的思路已經(jīng)失效,即使能控制射線的打開和關閉,也無法觸發(fā)傳送。因此,為了能向上兼容,我們換一種思路:去控制 XR Ray Interacter 腳本所在游戲物體的顯示和隱藏


因為輸入的動作是基于 Input System的,所以需要一些 Input System 方面的知識。
腳本代碼如下:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.XR.Interaction.Toolkit;

public class TeleportationController : MonoBehaviour
{
    public InputActionProperty m_teleportModeActivate;
    public InputActionProperty m_teleportModeCancel;

    private InputAction teleportModeActivate;
    private InputAction teleportModeCancel;

    public XRRayInteractor teleportInteractor;

    
    void Start()
    {
        teleportModeActivate = m_teleportModeActivate.action;
        teleportModeCancel = m_teleportModeCancel.action;
        EnableAction();
    }

  

    private void OnDestroy()
    {
        DisableAction();

    }

    void Update()
    {
        if (CanEnterTeleport())
        {
            SetTeleportController(true);
            return;
        }
        if (CanExitTeleport())
        {
            SetTeleportController(false);
            return;
        }
    }

    private void SetTeleportController(bool isEnable)
    {
        if (teleportInteractor != null)
        {
            teleportInteractor.gameObject.SetActive(isEnable);
        }
        
    }
    private bool CanEnterTeleport()
    {
        bool isTriggerTeleport = teleportModeActivate != null && teleportModeActivate.triggered;
        bool isCancelTeleport = teleportModeCancel != null && teleportModeCancel.triggered;
        return isTriggerTeleport && !isCancelTeleport; //判斷是否觸發(fā)傳送且沒有按下取消傳送的鍵
    }
    private bool CanExitTeleport()
    {
        bool isCancelTeleport = teleportModeCancel != null && teleportModeCancel.triggered;
        bool isReleaseTeleport = teleportModeActivate != null && teleportModeActivate.phase == InputActionPhase.Waiting;
        return isCancelTeleport || isReleaseTeleport; //判斷是否按下取消傳送的鍵或者釋放了之前推動的搖桿
    }
    private void EnableAction()
    {
        if (teleportModeActivate != null && teleportModeActivate.enabled)
        {
            teleportModeActivate.Enable();
        }
    }
    private void DisableAction()
    {
        if (teleportModeActivate != null && teleportModeActivate.enabled)
        {
            teleportModeActivate.Disable();
        }
    }
}



腳本解釋:

  • Input Action Asset 中有一個 Teleport Mode Cancel 的動作,綁定的是“按下 Grip 鍵”這個操作,也就是按下手柄的 Grip 鍵可以取消傳送,我們也將這個功能加入腳本。

xrrayinteractor,# XR Interaction Toolkit 系列教程,vr,unity,xr

  • 觸發(fā)傳送(顯示傳送射線)的條件:向前推動手柄搖桿,并且沒有按下 Grip 鍵
  • 不顯示傳送射線的條件:按下 Grip 鍵或者手柄的搖桿處于原始的位置(向前推動搖桿并且釋放最終也是回到了原始位置)
  • EnableAction 的作用:InputAction 類的變量需要調(diào)用它的 Enable 方法后才能被激活。
teleportModeActivate.Enable();

這是使用 InputSystem 的一種好習慣。不過實際上,這邊不手動調(diào)用 Enable 方法也是可以的。如果我們的 InputAction 所屬的配置文件被添加到了 Input Action Manager 腳本中(上面用到的 Input Action 來自于 XR Interaction Toolkit 提供的 XRI Default Input Actions 配置文件,如下圖所示),就不需要手動調(diào)用 Enable 方法。

xrrayinteractor,# XR Interaction Toolkit 系列教程,vr,unity,xr

xrrayinteractor,# XR Interaction Toolkit 系列教程,vr,unity,xr

因為場景中的 Input Action Manager 腳本(這個腳本在第一篇環(huán)境配置教程中添加過)已經(jīng)幫我們配置好了,如下圖所示:

xrrayinteractor,# XR Interaction Toolkit 系列教程,vr,unity,xr
xrrayinteractor,# XR Interaction Toolkit 系列教程,vr,unity,xr

可以看到 Input Action Manager 腳本中的 EnableInput 方法已經(jīng)為每一個配置的動作調(diào)用了 Enable 方法。因為擔心大家之后用了其他 Input Action Asset 文件中的動作配置會忘記手動調(diào)用 Enable 方法導致無法接收輸入,或者忘了添加到 Input Action Manager 中,所以這邊提一下這個細節(jié)。


因為是控制游戲物體的顯隱,所以 Teleportation Controller 腳本和 XR Ray Interactor 腳本不能掛載到同一個物體上。否則 XR Ray Interactor 所在的游戲物體隱藏時無法調(diào)用 Teleportation Controller 的功能。

因此,我們稍微改變一下 XR Origin 游戲物體的層級結構:

xrrayinteractor,# XR Interaction Toolkit 系列教程,vr,unity,xr

首先在 LeftHand Controller 或者 RightHand Controller 下創(chuàng)建 Teleport Interactor 物體(這取決于你設定哪只手負責傳送,我這邊為了日后拓展,干脆先在兩邊上都添加上這個物體,實際上我設定的是左手負責傳送),先把 Teleport Interactor 物體隱藏掉,它的顯示與隱藏會由我們剛寫的 Teleport Controller 腳本進行控制。然后將之前教程中與傳送有關的腳本挪到 Teleport Interactor 游戲物體上。

xrrayinteractor,# XR Interaction Toolkit 系列教程,vr,unity,xr

接下來我們要在 LeftHand Controller 上添加兩個腳本(因為我這邊設定左手負責傳送),如下圖所示:

xrrayinteractor,# XR Interaction Toolkit 系列教程,vr,unity,xr

解釋一下,就是把剛剛寫的 Teleportation Controller 腳本掛載到 LeftHand Controller 上,將 Input Action Asset 里的 Teleport Mode Activate 和 Teleport Mode Cancel 賦上。把手部的模型作為 LeftHand Controller 的子物體。需要注意的是,手部模型的父物體必須要有 XR Controller (Action-based) 腳本,且要開啟 Enable Input Tracking 。因為需要用到設備輸入的游戲物體需要 XR Controller 腳本的支持,并且打開 Tracking 才能正確追蹤手柄控制器的姿態(tài),從而讓作為子物體的手部模型能跟著手柄運動,所以我們需要給 LeftHand Controller 物體額外添加一個 XR Controller(Action-based)腳本,其中的動作配置先用默認的就行,與之前負責傳送的 XR Controller 不同。

這個時候,LeftHand Controller 和 Teleport Interactor 都有 XR Controller (Action-based) 腳本,如果我們運行程序,會發(fā)現(xiàn)傳送射線的起始點位置不對。這是因為父子物體上的 XR Controller 都開啟了 Tracking 導致的沖突。因此如下圖所示,我們需要點擊子物體 Teleport Interactor 上的 XR Controller (Action-based),把 Enable Input Tracking 取消勾選。

xrrayinteractor,# XR Interaction Toolkit 系列教程,vr,unity,xr

注:我們在 Teleportation Controller 腳本中賦值的兩個 Input Action Reference 作用僅僅是為了顯示和隱藏射線,真正觸發(fā)傳送的還是 Teleport Interactor 物體上 XR Controller (Action-based) 中的 Select Action(我們之前已經(jīng)設置好了)

xrrayinteractor,# XR Interaction Toolkit 系列教程,vr,unity,xr

然后我們可以運行一下程序,這時候,只有向前推動搖桿才會顯示傳送的射線。

注:如果你是 XR Interaction Toolkit 2.3 之前的版本,需要關注一下選用了哪種方式在射線末端添加 Reticle。如果選用的是在 XR Interactor Line Visual 腳本上添加 Reticle,那么你會發(fā)現(xiàn)這個 Reticle 在沒有觸發(fā)傳送的時候會位于你的腳下(新版的 XR Interaction Toolkit 不會有這個問題),而我們希望的是和傳送射線一樣,只有向前推動搖桿的時候顯示 Reticle。
其中一種方式是修改腳本,獲取 Reticle 的引用,然后在 SetTeleportController 方法中去控制 Reticle 的顯示和隱藏。
不過,如果選用的是在 Teleportation Area 或者 Teleportation Anchor 腳本上添加 Reticle,無需任何修改。只要把 Reticle 做成預制體賦給 Custom Reticle,在射線選中可傳送區(qū)域后,就會在可傳送區(qū)域的碰撞體表面生成 Reticle。

但是此時還有一個小問題,如果你照著這篇教程制作了 Teleportation Anchor,就會發(fā)現(xiàn)射到圓柱體表面的時候也會顯示 Reticle

xrrayinteractor,# XR Interaction Toolkit 系列教程,vr,unity,xr

這看起來有一些奇怪,因為傳送的 Reticle 一般是顯示在傳送區(qū)域的上表面。不過,這個圓柱體只是我在本篇教程的前半段演示用的。在實際的開發(fā)中, Teleportation Anchor 一般都是地面上的某一塊區(qū)域,碰撞體也應該是高度非常小的一塊,這個圓柱體也一般是透明的,類似于光柱的效果。因此在實際的項目中需要調(diào)試 Teleprtation Anchor 所檢測的碰撞體的高度,讓 Reticle 能夠顯示在目標區(qū)域的上表面。

我這邊將原來的圓柱體改成方體,因為方體的碰撞體更好調(diào)試一點。那么方體的上表面面積就代表了用于演示 Teleportation Anchor 的可傳送區(qū)域。

最終效果:

xrrayinteractor,# XR Interaction Toolkit 系列教程,vr,unity,xr

??美化傳送射線的方法

如果你想美化傳送射線,可以更改 XR Interactor Line Visual 和 Line Renderer 腳本的配置。

先來看 XR Interactor Line Visual 腳本:

xrrayinteractor,# XR Interaction Toolkit 系列教程,vr,unity,xr

常用的有調(diào)整射線寬度(Line Width),選中傳送區(qū)域時射線的顏色(Valid Color Gradient),未選中傳送區(qū)域時射線的顏色(Invalid Color Gradient)

而 Line Renderer 是 Unity 中原有的組件,每個設置具體是什么意思可以參考官方文檔。不過在美化傳送射線上經(jīng)常用的是更改射線的材質(zhì),如果你想讓射線的材質(zhì)效果看起來更好看,可以自定義材質(zhì),然后更改下圖中標出的這個部分:

xrrayinteractor,# XR Interaction Toolkit 系列教程,vr,unity,xr

那么本篇教程的內(nèi)容就到此為止啦!大家快去制作屬于自己的傳送功能吧!??文章來源地址http://www.zghlxwxcb.cn/news/detail-516871.html

到了這里,關于Unity VR 開發(fā)教程 OpenXR+XR Interaction Toolkit (四) 傳送的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包