Pico VR 開發(fā)筆記(基礎(chǔ)篇)
XR Interaction Tooikit 版本 2.3.2
一、環(huán)境搭建
其實官方文檔已經(jīng)寫的很詳細(xì)了,這里只是不廢話快速搭建,另外有一項官方說明有誤的,補(bǔ)充說明一下,在開發(fā)工具部分說明
插件安裝——安裝pico的sdk和XR Interaction Tooikit
環(huán)境配置——在場景里添加頭顯和手柄,并進(jìn)行配置和項目配置
開發(fā)工具——Pico提供的串流開發(fā)工具,可以在不打包的情況的,使用手柄和頭顯進(jìn)行調(diào)試。
1、插件安裝
pico SDK安裝
pico SDK下載地址:SDK - PICO 開發(fā)者平臺 (pico-interactive.com)
SDK下載后解壓
打開unity→Window→PackgeManager→Add Package From disk(左上角+)→選擇解壓后文件里的package.json
XR Interaction Tooikit安裝
在packgeManager里搜索XR Interaction Tooikit
選擇版本盡量高版本,不要低于2.1.0。
打開Samples?面板,導(dǎo)入?Starter Assets、**XR Device Simulater **和?Tunneling Vignette。
2、環(huán)境配置
場景配置
添加XR Origin:Hierarchy→Add(左上角+)→XR→XR Origin(VR)
手柄設(shè)置
-
選中Hierarchy的XR Origin子物體LeftHand Controller
-
配置LeftHand Controller的控件XR Controller,點(diǎn)擊在右上角的預(yù)設(shè),選擇XRI Default Left Controller (右手柄同樣配置,選擇XRI Default Right Controller )
-
選擇手柄模型,在XR Controller的Model Prefab選擇LeftControllerModel(Tranform)
打包設(shè)置
選擇:Edit→Player→settings for Android→other Setting
Minimum API Level 選擇Android 10.0
Target API Level 選擇Automatic(Highest installed)
Scripting Backend 選擇IL2CPP
勾選ARM64
選擇:Edit→Project Settings→XR Plug-in Management→Android Standalone Settings→選擇PICO
3、開發(fā)工具
SDK安裝
下載地址:SDK - PICO 開發(fā)者平臺 (PICO Unity Live Preview Plugin)
SDK下載后解壓
打開unity→Window→PackgeManager→Add Package From disk(左上角+)→選擇解壓后文件里的package.json
windows下載客戶端
下載地址:SDK - PICO 開發(fā)者平臺 (PICO Developer Center)
在本地安裝后會安裝steam串流工具
為一體機(jī)開啟開發(fā)者模式
- 開啟 PICO VR 一體機(jī)。
- 前往?設(shè)置?>?通用。
- 射線對準(zhǔn)?設(shè)置?字段并連續(xù)點(diǎn)擊多次,直到左側(cè)導(dǎo)航欄下方出現(xiàn)?開發(fā)者?選項。
- 點(diǎn)擊?開發(fā)者,進(jìn)入開發(fā)者選項界面。
- 打開右上角的?USB 調(diào)試開關(guān)。
*這里官方文檔有誤,開啟開發(fā)者模型要多次點(diǎn)擊設(shè)置鍵
項目設(shè)置
選擇:Edit→Project Settings→XR Plug-in Management→ PC Standalone Settings→選擇 PICO Live Preview
二、開發(fā)
1、手柄輸入
得到手柄
InputDevice deviceLeft;//左手柄
InputDevice deviceRight;//右手柄
private void Start()
{
deviceLeft = InputDevices.GetDeviceAtXRNode(XRNode.LeftHand);
deviceRight = InputDevices.GetDeviceAtXRNode(XRNode.RightHand);
}
手柄觸發(fā)核心方法?TryGetFeatureValue
手柄扳機(jī)鍵觸發(fā)
/// <summary>
/// 扳機(jī)鍵
/// </summary>
/// <param name="inputDevice">手柄</param>
/// <param name="action">觸發(fā)委托</param>
/// <param name="Value">觸發(fā)參數(shù)</param>
void triggerButton(InputDevice inputDevice, ref bool Value, Action action)
{
if (inputDevice.TryGetFeatureValue(CommonUsages.triggerButton,out Value)&&Value)
{
action();
}
}
扳機(jī)鍵力度
/// <summary>
/// 扳機(jī)鍵力度
/// </summary>
/// <param name="inputDevice">手柄</param>
/// <param name="action">觸發(fā)委托</param>
/// <param name="Value">觸發(fā)參數(shù)</param>
void trigger(InputDevice inputDevice, ref float Value, Action<float> action)
{
if (inputDevice.TryGetFeatureValue(CommonUsages.trigger, out Value)&& !Value.Equals(0))
{
action(Value);
}
}
抓握鍵
/// <summary>
/// 抓握鍵
/// </summary>
/// <param name="inputDevice"></param>
/// <param name="action"></param>
/// <param name="Value"></param>
void gripButton(InputDevice inputDevice, ref bool Value, Action action)
{
if (inputDevice.TryGetFeatureValue(CommonUsages.gripButton, out Value) && Value)
{
action();
}
}
抓握鍵力度
/// <summary>
/// 抓握鍵力度
/// </summary>
/// <param name="inputDevice"></param>
/// <param name="action"></param>
/// <param name="Value"></param>
void grip(InputDevice inputDevice, ref float Value, Action<float> action)
{
if (inputDevice.TryGetFeatureValue(CommonUsages.grip, out Value) && !Value.Equals(0))
{
action(Value);
}
}
搖桿方向
/// <summary>
/// 搖桿方向
/// </summary>
/// <param name="inputDevice"></param>
/// <param name="action"></param>
/// <param name="Value"></param>
void primary2DAxis(InputDevice inputDevice, ref Vector2 Value, Action<Vector2> action)
{
if (inputDevice.TryGetFeatureValue(CommonUsages.primary2DAxis, out Value) && !Value.Equals(Vector2.zero))
{
action(Value);
}
}
搖桿
/// <summary>
/// 搖桿
/// </summary>
/// <param name="inputDevice"></param>
/// <param name="Value"></param>
/// <param name="action"></param>
void primary2DAxisClick(InputDevice inputDevice, ref bool Value, Action action)
{
if (inputDevice.TryGetFeatureValue(CommonUsages.primary2DAxisClick, out Value) && Value)
{
action();
}
}
X/A
/// <summary>
/// X/A
/// </summary>
/// <param name="inputDevice"></param>
/// <param name="Value"></param>
/// <param name="action"></param>
void primaryButton(InputDevice inputDevice, ref bool Value, Action action)
{
if (inputDevice.TryGetFeatureValue(CommonUsages.primaryButton, out Value) && Value)
{
action();
}
}
Y/B
/// <summary>
/// Y/B
/// </summary>
/// <param name="inputDevice"></param>
/// <param name="Value"></param>
/// <param name="action"></param>
void secondaryButton(InputDevice inputDevice, ref bool Value, Action action)
{
if (inputDevice.TryGetFeatureValue(CommonUsages.secondaryButton, out Value) && Value)
{
action();
}
}
2、射線
得到射線的方法
XRRayInteractor.TryGetCurrent3DRaycastHit(out hit)
XRRayInteractor
是手柄上掛載的XRRayInteractor腳本。
Demo
public XRRayInteractor rayInteractor;
RaycastHit hit;
Vector3 getRayPoint()
{
if (rayInteractor.TryGetCurrent3DRaycastHit(out hit))
{
string name = hit.collider.name;
Debug.Log(name);
return hit.point;
}
else
{
return Vector3.zero;
}
}
補(bǔ)充設(shè)置
射線的類型
類型 | 說明 |
---|---|
Staight Line | 直線 |
Projectile Curve | 拋物線 |
Bezier Curve | 貝塞爾曲線 |
修改方法
rayInteractor.lineType = XRRayInteractor.LineType.ProjectileCurve;
不同類型的射線還有自己的參數(shù)可以修改,比如Stailght Line的MaxRaycastDistance(最遠(yuǎn)射線距離)和ProjectileCurve的Additional Flight Time(射線飛行時間)都可以直接賦值。
有效射線和無效射線
當(dāng)射線觸碰到可觸發(fā)的UI或者模型時,射線為有效射線,反饋則是使用了ValidColorGradient。否則是使用InvalidColorGradient。
無效射線和有效射線觸碰到有碰撞的模型時同樣可以返回RaycastHit,區(qū)別在XR射線本身的設(shè)置上,比如碰撞Reticle。
實現(xiàn)有效碰撞,需要另外在模型上添加Tracked Device Physics Raycaster腳本等
Reticle (十字線)
Reticle 是射線和模型(UI)碰撞的點(diǎn)。
添加方法:
在手柄的上找到XR Interactor Line Visual腳本,創(chuàng)建Reticle 預(yù)制體后直接添加上。
3、UI觸發(fā)
觸發(fā)條件
手柄射線要觸發(fā)到UI,在完成VR基礎(chǔ)場景搭建的前提下,需要掛載兩個腳本。
在Canvas上增加Tracked Device Graphic Raycaster
替換EventSystem上的Standalone Input Module為XR UI Input Module(模型上添加的Tracked Device Physics Raycaster腳本也是受XR UI Input Module影響的)
注意事項
Canvas的Order in Layer 最好設(shè)置為負(fù)值。如果為0或者正值,十字線可能會被UI遮擋。
為0時
文章來源:http://www.zghlxwxcb.cn/news/detail-756124.html
為-1時文章來源地址http://www.zghlxwxcb.cn/news/detail-756124.html
到了這里,關(guān)于【unity】Pico VR 開發(fā)筆記(基礎(chǔ)篇)包括射線的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!