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

Unity SteamVR 開發(fā)教程:用搖桿/觸摸板控制人物持續(xù)移動(2.x 以上版本)

這篇具有很好參考價值的文章主要介紹了Unity SteamVR 開發(fā)教程:用搖桿/觸摸板控制人物持續(xù)移動(2.x 以上版本)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

持續(xù)移動是 VR 開發(fā)中的一個常用功能。一般是用戶推動手柄搖桿,或者觸摸手柄觸摸板,來控制人物持續(xù)地移動。Unity SteamVR 插件中只提供了傳送的移動功能,而沒有用搖桿或觸摸板控制人物持續(xù)移動的功能。因此,持續(xù)移動的功能需要我們自己開發(fā)。


??教程說明

使用的 Unity 版本: 2021.3.5

使用的操作系統(tǒng):Windows 11

使用的設備:Meta Quest 2

SteamVR 版本:2.7.3

因為我用的是 Quest 手柄,所以我會用 Quest 手柄的搖桿控制人物移動。而像 Htc Vive 手柄上只有觸摸板 Touchpad,但是它的作用和搖桿是一樣的。

最終實現(xiàn)的效果:能通過搖桿控制人物持續(xù)移動,人物能與其他物體有碰撞,能上階梯。

Unity SteamVR 開發(fā)教程:用搖桿/觸摸板控制人物持續(xù)移動(2.x 以上版本),# Unity SteamVR,unity,游戲引擎文章來源地址http://www.zghlxwxcb.cn/news/detail-718281.html


??場景搭建

我們新建一個場景,刪除原本場景中的 Main Camera,在場景中放置一個平面,然后用方塊制作一個階梯,用于后續(xù)的測試。接下來,我們需要添加一個 VR 中代表玩家自己的物體。我可以打開 Assets/SteamVR/InteractionSystem/Core 文件夾,將 Player 物體拖入場景:

Unity SteamVR 開發(fā)教程:用搖桿/觸摸板控制人物持續(xù)移動(2.x 以上版本),# Unity SteamVR,unity,游戲引擎

Unity SteamVR 開發(fā)教程:用搖桿/觸摸板控制人物持續(xù)移動(2.x 以上版本),# Unity SteamVR,unity,游戲引擎

也許你之前會在 Assets/SteamVR/Prefabs 文件夾下看到一個 [CameraRig] 預制體,它也能代表 VR 中的玩家自己,能夠追蹤頭顯和手柄的位置和旋轉角度。但是 Player 這個預制體相當于功能更加豐富的 [CameraRig],因此,推薦大家使用 Player 這個預制體。


??創(chuàng)建移動的動作

SteamVR 的輸入系統(tǒng)是基于動作的,我們需要在代碼中判斷動作是否發(fā)生,或者獲取動作返回的值,然后在配置文件中配置動作和設備按鍵的綁定關系,輸入系統(tǒng)的詳細介紹可以參考這篇教程:Unity SteamVR 開發(fā)教程:SteamVR Input 輸入系統(tǒng)(2.x 以上版本)。

我們可以打開 Unity 編輯器菜單欄的 Windows/SteamVR Input 窗口:

Unity SteamVR 開發(fā)教程:用搖桿/觸摸板控制人物持續(xù)移動(2.x 以上版本),# Unity SteamVR,unity,游戲引擎

然后點擊 Open Binding UI 打開動作按鍵綁定界面:

Unity SteamVR 開發(fā)教程:用搖桿/觸摸板控制人物持續(xù)移動(2.x 以上版本),# Unity SteamVR,unity,游戲引擎
Unity SteamVR 開發(fā)教程:用搖桿/觸摸板控制人物持續(xù)移動(2.x 以上版本),# Unity SteamVR,unity,游戲引擎

我們在場景中默認會激活 default 這個動作集。然而這個動作集里并沒有綁定搖桿相關的動作。因此,我們需要自己創(chuàng)建一個搖桿移動相關的動作,并且將它與搖桿鍵進行綁定。

在 VR 游戲中,經(jīng)常是一只手控制移動,另一只手控制轉向。轉向一般是將手柄搖桿向左或者向右推動來觸發(fā)。SteamVR 默認的輸入配置是兩只手都能轉向,因此,我們需要取消其中一只手的轉向綁定。那么我規(guī)定一下,在本篇教程中,我使用左搖桿進行持續(xù)移動,右搖桿進行轉向。

首先,我們需要取消勾選鏡像模式,這樣可以為左右手柄分別綁定動作。

Unity SteamVR 開發(fā)教程:用搖桿/觸摸板控制人物持續(xù)移動(2.x 以上版本),# Unity SteamVR,unity,游戲引擎

然后刪除左手柄上 snapturnright 和 snapturnleft 的按鍵綁定:

Unity SteamVR 開發(fā)教程:用搖桿/觸摸板控制人物持續(xù)移動(2.x 以上版本),# Unity SteamVR,unity,游戲引擎

接下來,我們要在 default 動作集下創(chuàng)建一個新的動作,用來表示我們的搖桿移動?;氐?SteamVR Input 窗口,新鍵一個 Vector2 類型的動作。因為搖桿推向的位置是用一個二維向量來表示。

Unity SteamVR 開發(fā)教程:用搖桿/觸摸板控制人物持續(xù)移動(2.x 以上版本),# Unity SteamVR,unity,游戲引擎

然后打開 Binding UI,將 MovePlayer 動作與左搖桿位置進行綁定(記得取消鏡像模式)。

Unity SteamVR 開發(fā)教程:用搖桿/觸摸板控制人物持續(xù)移動(2.x 以上版本),# Unity SteamVR,unity,游戲引擎

現(xiàn)在,我們的 Vector2 類型的動作就和左手柄搖桿綁定成功了。


??移動腳本

我們新建一個腳本,然后掛載到 Player 物體上:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Valve.VR;
using Valve.VR.InteractionSystem;

public class ContinousMoveController : MonoBehaviour
{
    [SerializeField] private SteamVR_Action_Vector2 moveAction;
    [SerializeField] private float speed = 1;
    [SerializeField] private float gravity = 9.81f;
    [SerializeField] private float minHeight = 0;
    [SerializeField] private float maxHeight = float.PositiveInfinity;
    [SerializeField] private CharacterController characterController;
    void Start() 
    {
        if(characterController == null)
        {
            characterController = GetComponent<CharacterController>();  
        }
    }

    void Update()
    {
        HandleHeight();
        Move();
    }
    private void Move()
    {
        if(moveAction.axis.magnitude > 0.1f)
        {
            Vector3 direction = Player.instance.hmdTransform.TransformDirection(new Vector3(moveAction.axis.x, 0, moveAction.axis.y));            
            characterController.Move(speed * Time.deltaTime * Vector3.ProjectOnPlane(direction, Vector3.up) - new Vector3(0, gravity, 0) * Time.deltaTime);
        }
        
    }
    private void HandleHeight()
    {       
        float headHeight = Mathf.Clamp(Player.instance.hmdTransform.position.y, minHeight, maxHeight);
        characterController.height = headHeight;

        Vector3 newCenter = Player.instance.transform.InverseTransformPoint(Player.instance.hmdTransform.position);
        newCenter.y = characterController.height / 2 + characterController.skinWidth;
        characterController.center = newCenter;
    }
}


然后將 CharacterController 組件掛載到 Player 物體上,參數(shù)設置可以參考我的,大家也可以根據(jù)實際情況進行調整:

Unity SteamVR 開發(fā)教程:用搖桿/觸摸板控制人物持續(xù)移動(2.x 以上版本),# Unity SteamVR,unity,游戲引擎

?移動

解釋一下核心方法 Move:

首先我們?nèi)宋锏囊苿舆x擇用 CharactrrController 碰撞體的 Move 方法來移動,因為人物添加上 CharactrrController 后,可以與場景中的其他物體發(fā)生碰撞,比如碰到一堵墻會卡住,或者擁有上臺階的功能。這樣身體在移動的過程中就不會穿過其他碰撞體。并且 CharacterController 組件擁有一個 Move 方法,可以用于移動身體。

Move 方法需要傳入一個移動向量。因為移動相當于一段距離,所以移動的距離可以看作移動速度×移動時間×移動方向。移動方向可以通過以下代碼獲?。?/p>

 Vector3 direction = Player.instance.hmdTransform.TransformDirection(new Vector3(moveAction.axis.x, 0, moveAction.axis.y));  

Player 就是原本掛載在 Player 物體上的 Player 腳本:

Unity SteamVR 開發(fā)教程:用搖桿/觸摸板控制人物持續(xù)移動(2.x 以上版本),# Unity SteamVR,unity,游戲引擎

通過 Player.instance.hmdTransform 可以獲取頭部相機的位置。TransformDirection 方法可以將相對于指定對象自身坐標系的方向向量轉換為相對于世界坐標系方向向量,即一個物體自己坐標系的 direction 方向,相當于世界坐標系的什么方向。我們的持續(xù)移動功能一般是相對于自己的頭部移動,因為移動的輸入原本是一個世界坐標系下的向量,我們需要用 TransformDirection 方法將移動輸入轉換為相對于玩家頭部的方向,其結果是用世界坐標系下的一個向量來表示。比如頭部看向右邊,然后向前推動搖桿,這時候人物要朝著頭部看向的右側移動,大家可以參考下圖理解。

Unity SteamVR 開發(fā)教程:用搖桿/觸摸板控制人物持續(xù)移動(2.x 以上版本),# Unity SteamVR,unity,游戲引擎

但是因為我們要限制玩家在水平面上前后左右移動,而頭看向的方向可以是任一方向,所以我們要用以下代碼對移動方向進行限制:

Vector3.ProjectOnPlane(direction, Vector3.up)

這個方法可以將將向量投影到由法線定義的平面上(法線與該平面正交),因此我們就把移動方向限制在了水平面上。ProjectOnPlane 方法的第二個參數(shù)是平面的法向量,所以用 Vector3.up 表示合適。

在 CharacterController 的 Move 方法中,我們傳入的移動向量減去了一個 new Vector3(0, gravity, 0) * Time.deltaTime,這是為了模擬重力,讓玩家在能夠從高處落下。

腳本寫完后,我們需要在 Inspector 面板中對變量進行賦值:

Unity SteamVR 開發(fā)教程:用搖桿/觸摸板控制人物持續(xù)移動(2.x 以上版本),# Unity SteamVR,unity,游戲引擎

?實時調整 CharacterController 的高度

移動腳本中還有個 HandleHeight 方法,這個方法用于實時調整 CharacterController 的高度。如果沒有這個方法,我們的 CharacterController 的高度是不變的,比如游戲中有一個比較矮的洞,按照現(xiàn)實生活中的常識,我們可能會蹲下來走過去,但是游戲中人物的碰撞由 CharacterController 決定,如果我們在現(xiàn)實中蹲下而游戲中的 CharacterController 高度不變的話,我們在游戲中還是過不了洞,人物會因為 CharacterController 的高度卡在洞外。

因此我們希望比如在現(xiàn)實中蹲下,游戲中人物的 CharacterController 的高度會隨之變低。也就是 CharacterController 的高度會隨著頭部相機的高度變化而變化

private void HandleHeight()
    {       
        float headHeight = Mathf.Clamp(Player.instance.hmdTransform.position.y, minHeight, maxHeight);
        characterController.height = headHeight;

        Vector3 newCenter = Player.instance.transform.InverseTransformPoint(Player.instance.hmdTransform.position);
        newCenter.y = characterController.height / 2 + characterController.skinWidth;
        characterController.center = newCenter;
    }

首先將 CharacterController 的高度設為與頭部相機一樣,最小高度和最大高度可以自己在 Inspector 面板定義。

但是因為調整 CharacterController 的高度會讓 CharacterController 的兩頭都進行伸縮,所以還要調整它的 center 讓它與人物匹配。

首先我們要讓 CharacterController 的中心位置和頭部相機位置匹配。因為此時的 CharacterController 的 center 是相對于玩家角色的局部坐標,所以我們也要得到頭部相機相對于玩家角色的局部坐標,利用 InverseTransformPoint 方法將頭部相機的位置從世界坐標系轉換為相對于玩家角色的局部坐標系。然后調整 center 的高度,相當于頭部相機高度的一半加上 CharacterController 的 skinWidth。skinWidth表示角色控制器的皮膚寬度。皮膚寬度是一個用于處理碰撞的邊界區(qū)域,加上后 center 的高度更加準確。

Unity SteamVR 開發(fā)教程:用搖桿/觸摸板控制人物持續(xù)移動(2.x 以上版本),# Unity SteamVR,unity,游戲引擎

可以看到 CharacterController 的高度和中心位置會在游戲運行過程中根據(jù)頭部相機的位置而改變。


??取消手部和 CharacterController 的碰撞

如果這時候運行代碼,你會發(fā)現(xiàn)手部和身體(CharacterController)產(chǎn)生了碰撞。為了解決這個問題,我們可以把 Player 這個物體的 Layer 設為 Player(或者任意一個你喜歡的名字)

Unity SteamVR 開發(fā)教程:用搖桿/觸摸板控制人物持續(xù)移動(2.x 以上版本),# Unity SteamVR,unity,游戲引擎

只需要將掛載了 CharacterController 的物體的 Layer 設為 Player 就行。

Unity SteamVR 開發(fā)教程:用搖桿/觸摸板控制人物持續(xù)移動(2.x 以上版本),# Unity SteamVR,unity,游戲引擎

然后在 Assets/SteamVR/InteractionSystem/Core/Prefabs 文件夾下找到 HandColliderLeft 和 HandColliderRight 預制體。這兩個物體會在游戲運行的時候自動創(chuàng)建,作為手部的碰撞體。

Unity SteamVR 開發(fā)教程:用搖桿/觸摸板控制人物持續(xù)移動(2.x 以上版本),# Unity SteamVR,unity,游戲引擎

游戲運行時自動添加:

Unity SteamVR 開發(fā)教程:用搖桿/觸摸板控制人物持續(xù)移動(2.x 以上版本),# Unity SteamVR,unity,游戲引擎

這兩個物體的實例化是在什么時候進行的呢?我們可以找到 Player 物體的子物體 LeftHand 或者 RightHand,這兩個物體上掛載了 HandPhysics 腳本:

Unity SteamVR 開發(fā)教程:用搖桿/觸摸板控制人物持續(xù)移動(2.x 以上版本),# Unity SteamVR,unity,游戲引擎

Unity SteamVR 開發(fā)教程:用搖桿/觸摸板控制人物持續(xù)移動(2.x 以上版本),# Unity SteamVR,unity,游戲引擎

我們可以打開 HandPhysics 腳本,看看源碼:

Unity SteamVR 開發(fā)教程:用搖桿/觸摸板控制人物持續(xù)移動(2.x 以上版本),# Unity SteamVR,unity,游戲引擎

可以看到在 Start 方法中就通過 Instantiate 方法實例化了 Hand Collider 的 Prefab 預制體。

現(xiàn)在,我們將手部碰撞體的預制體(HandColliderLeft 和 HandColliderRight)的 Layer 設為 Hand(隨便取一個名字就行),這次需要選擇 Yes,因為手部碰撞體所有的子物體都不能與 CharacterController 發(fā)生碰撞。

Unity SteamVR 開發(fā)教程:用搖桿/觸摸板控制人物持續(xù)移動(2.x 以上版本),# Unity SteamVR,unity,游戲引擎
Unity SteamVR 開發(fā)教程:用搖桿/觸摸板控制人物持續(xù)移動(2.x 以上版本),# Unity SteamVR,unity,游戲引擎

Unity SteamVR 開發(fā)教程:用搖桿/觸摸板控制人物持續(xù)移動(2.x 以上版本),# Unity SteamVR,unity,游戲引擎

然后打開編輯器菜單欄的 Edit/Project Settings:

Unity SteamVR 開發(fā)教程:用搖桿/觸摸板控制人物持續(xù)移動(2.x 以上版本),# Unity SteamVR,unity,游戲引擎

找到 Physics,取消勾選 Player 和 Hand 之間的交叉點:

Unity SteamVR 開發(fā)教程:用搖桿/觸摸板控制人物持續(xù)移動(2.x 以上版本),# Unity SteamVR,unity,游戲引擎

這樣,Layer 是 Player 的物體和 Layer 是 Hand 的物體就不會發(fā)生碰撞,也就是我們手部的碰撞體不會與 CharacterController 發(fā)生碰撞。我們?yōu)槭植颗鲎搀w單獨設置一個 Hand Layer 是因為我們希望手與手之間可以發(fā)生碰撞,但是手和 CharacterController 不能發(fā)生碰撞。

??取消手部模型的抖動

但是這個時候如果運行程序,你可能會發(fā)現(xiàn)一個問題:有時候移動或者轉向時手部模型會有抖動的現(xiàn)象。

Unity SteamVR 開發(fā)教程:用搖桿/觸摸板控制人物持續(xù)移動(2.x 以上版本),# Unity SteamVR,unity,游戲引擎

這個時候我們需要找到 HandColliderLeft 和 HandColliderRight 預制體,取消勾選 Rigidbody 組件上的 Use gravity,然后將 Interpolate 選項設為 Interpolate

Unity SteamVR 開發(fā)教程:用搖桿/觸摸板控制人物持續(xù)移動(2.x 以上版本),# Unity SteamVR,unity,游戲引擎

重要的是這個 Interpolate 插值選項。它可以平滑消除固定幀率運行物理導致的現(xiàn)象。因為在 Unity 中,物理的計算通常是以固定的時間步長進行更新,然后應用的實際幀率是不一定的。當物理計算和應用實際幀率不同步時,可能會導致對象出現(xiàn)視覺抖動。而 Interpolate 插值運算可以一定程度上解決抖動問題。(Unity 官方說明:https://docs.unity.cn/2023.2/Documentation/Manual/rigidbody-interpolation.html)

最終效果:

Unity SteamVR 開發(fā)教程:用搖桿/觸摸板控制人物持續(xù)移動(2.x 以上版本),# Unity SteamVR,unity,游戲引擎

到了這里,關于Unity SteamVR 開發(fā)教程:用搖桿/觸摸板控制人物持續(xù)移動(2.x 以上版本)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關文章

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包