Pico VR 開(kāi)發(fā)筆記(基礎(chǔ)篇)
XR Interaction Tooikit 版本 2.3.2
一、環(huán)境搭建
其實(shí)官方文檔已經(jīng)寫(xiě)的很詳細(xì)了,這里只是不廢話快速搭建,另外有一項(xiàng)官方說(shuō)明有誤的,補(bǔ)充說(shuō)明一下,在開(kāi)發(fā)工具部分說(shuō)明
插件安裝——安裝pico的sdk和XR Interaction Tooikit
環(huán)境配置——在場(chǎng)景里添加頭顯和手柄,并進(jìn)行配置和項(xiàng)目配置
開(kāi)發(fā)工具——Pico提供的串流開(kāi)發(fā)工具,可以在不打包的情況的,使用手柄和頭顯進(jìn)行調(diào)試。
1、插件安裝
pico SDK安裝
pico SDK下載地址:SDK - PICO 開(kāi)發(fā)者平臺(tái) (pico-interactive.com)
SDK下載后解壓
打開(kāi)unity→Window→PackgeManager→Add Package From disk(左上角+)→選擇解壓后文件里的package.json
XR Interaction Tooikit安裝
在packgeManager里搜索XR Interaction Tooikit
選擇版本盡量高版本,不要低于2.1.0。
打開(kāi)Samples 面板,導(dǎo)入 Starter Assets、**XR Device Simulater **和 Tunneling Vignette。
2、環(huán)境配置
場(chǎng)景配置
添加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、開(kāi)發(fā)工具
SDK安裝
下載地址:SDK - PICO 開(kāi)發(fā)者平臺(tái) (PICO Unity Live Preview Plugin)
SDK下載后解壓
打開(kāi)unity→Window→PackgeManager→Add Package From disk(左上角+)→選擇解壓后文件里的package.json
windows下載客戶(hù)端
下載地址:SDK - PICO 開(kāi)發(fā)者平臺(tái) (PICO Developer Center)
在本地安裝后會(huì)安裝steam串流工具
為一體機(jī)開(kāi)啟開(kāi)發(fā)者模式
- 開(kāi)啟 PICO VR 一體機(jī)。
- 前往 設(shè)置 > 通用。
- 射線對(duì)準(zhǔn) 設(shè)置 字段并連續(xù)點(diǎn)擊多次,直到左側(cè)導(dǎo)航欄下方出現(xiàn) 開(kāi)發(fā)者 選項(xiàng)。
- 點(diǎn)擊 開(kāi)發(fā)者,進(jìn)入開(kāi)發(fā)者選項(xiàng)界面。
- 打開(kāi)右上角的 USB 調(diào)試開(kāi)關(guān)。
*這里官方文檔有誤,開(kāi)啟開(kāi)發(fā)者模型要多次點(diǎn)擊設(shè)置鍵
項(xiàng)目設(shè)置
選擇:Edit→Project Settings→XR Plug-in Management→ PC Standalone Settings→選擇 PICO Live Preview
二、開(kāi)發(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è)置
射線的類(lèi)型
類(lèi)型 | 說(shuō)明 |
---|---|
Staight Line | 直線 |
Projectile Curve | 拋物線 |
Bezier Curve | 貝塞爾曲線 |
修改方法
rayInteractor.lineType = XRRayInteractor.LineType.ProjectileCurve;
不同類(lèi)型的射線還有自己的參數(shù)可以修改,比如Stailght Line的MaxRaycastDistance(最遠(yuǎn)射線距離)和ProjectileCurve的Additional Flight Time(射線飛行時(shí)間)都可以直接賦值。
有效射線和無(wú)效射線
當(dāng)射線觸碰到可觸發(fā)的UI或者模型時(shí),射線為有效射線,反饋則是使用了ValidColorGradient。否則是使用InvalidColorGradient。
無(wú)效射線和有效射線觸碰到有碰撞的模型時(shí)同樣可以返回RaycastHit,區(qū)別在XR射線本身的設(shè)置上,比如碰撞Reticle。
實(shí)現(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ǔ)場(chǎng)景搭建的前提下,需要掛載兩個(gè)腳本。
在Canvas上增加Tracked Device Graphic Raycaster
替換EventSystem上的Standalone Input Module為XR UI Input Module(模型上添加的Tracked Device Physics Raycaster腳本也是受XR UI Input Module影響的)
注意事項(xiàng)
Canvas的Order in Layer 最好設(shè)置為負(fù)值。如果為0或者正值,十字線可能會(huì)被UI遮擋。
為0時(shí)
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-621631.html
為-1時(shí)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-621631.html
到了這里,關(guān)于【unity】Pico VR 開(kāi)發(fā)筆記(基礎(chǔ)篇)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!