Unity功能篇:PCVR开发(设备:HTC Vive Pro)更新中。。。

一、传送

1、区域传送

不论是区域传送还是固定点传送,场景中必须要有TelePorting对象。

在可以移动的区域,也就是地面碰撞器上,挂TeleportArea脚本。但是这个脚本会自动修改你的材质球的属性,所以不能直接给地板挂这个脚本,新建一个Plane,挂TeleportArea脚本,将Plane对象与现有地面重合。如果不想要TeleportArea生成的边框显示出来,把MeshRenderer关掉。

Locked:禁止传送

Marker Active:区域跟随按键显示隐藏

2、固定点传送

找到TeleportPoint预制件,将它拖到场景里。

(1)TeleportType:移动类型(MoveToLocation-移动到节点位置,SwitchToNewScene-前往设定场景)。

(2)Title: 提示(会在传送点上生成提示文字)。

(3)SwitchToScene:场景名字(TeleportType选择切换场景的话,就会前往这里设定的场景)。

(4)titleVisibleColor:提示文字默认颜色。

(5)titleHighlightedColor:传送点被选中时,文字高亮的颜色。

(6)titleLockedColor:传送点不可用,文字颜色。

(7)playerSpawnPoint:将当前传送点设置为玩家初始默认点(游戏启动后,会将Player位置重置到此处。

二、射线与UI交互

SteamVR有射线与UI交互的组件,但是非常不好用,这里介绍使用插件来实现这个功能。

1、插件下载

直接在Unity商店添加资源,通过PackageManager下载即可。

地址:https://assetstore.unity.com/packages/tools/integration/vive-input-utility-64219

2、Canvas设置

Render Mode设为World Space,挂载Canvas Raycast Target组件。

3、配置射线

找到并拖入VivePointers作为Player的子物体,此时运行程序就可以正常与Button、Toggle等UI交互了(DropDown除外)。

DropDown正常交互需要做调整、展开Dropdown,找到Template(下拉框模板),为其添加Canvas Raycast Target组件,即可正常交互。

4、设置射线与UI瞄准点

找到指定手柄下的Reticle身上的Reticle Poser组件,勾选Auto Scale Reticle参数,为自动缩放瞄准点。也可以通过Size In Pixels,设置瞄准点的像素。

5、关闭手柄射线

VR交互通常要求左手(抛物线)控制位移,右手(直线)控制交互。Vive Role设置为Invalid,关闭左手柄射线。

三、射线与3D物体交互

1、软交互(射线与3D物体的进入、点击、离开)

物体需要有碰撞盒(collider),添加事件脚本Ray Detection即可。

cs 复制代码
using System.Collections.Generic;
using UnityEngine;
using HTC.UnityPlugin.Vive;
using UnityEngine.EventSystems;

public class RayDetection : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, IPointerClickHandler
{
    private readonly HashSet<PointerEventData> hovers = new();     //射线Hover哈希表

    /// <summary>
    /// 射线进入
    /// </summary>
    /// <param name="eventData"></param>
    public void OnPointerEnter(PointerEventData eventData)
    {
        if (hovers.Add(eventData) && hovers.Count == 1)
        {
            Debug.Log($"射线进入 {transform.name}");
        }
    }

    /// <summary>
    /// 射线点击
    /// </summary>
    /// <param name="eventData"></param>
    public void OnPointerClick(PointerEventData eventData)
    {
        VivePointerEventData viveEventData = eventData as VivePointerEventData;
        if (viveEventData != null)
        {
            if (viveEventData.viveButton == ControllerButton.Trigger)
            {
                Debug.Log($"射线点击 {transform.name}");
            }
        }
    }

    /// <summary>
    /// 射线离开 
    /// </summary>
    /// <param name="eventData"></param>
    public void OnPointerExit(PointerEventData eventData)
    {
        if (hovers.Remove(eventData) && hovers.Count == 0)
        {
            Debug.Log($"射线离开 {transform.name}");
        }
    }
}
相关推荐
郝学胜-神的一滴1 天前
Horse3D 游戏引擎研发笔记(七):Clydesdale——从流式日志到多输出订阅
c++·qt·unity·游戏引擎·图形渲染·unreal engine·opengl
江上闲人.2 天前
Wardogs战犬\战狗Beta测试启动报错UE崩溃卡顿?解决方法来了
游戏·游戏引擎·虚幻·战犬·战狗·wardogs
小贺儿开发2 天前
Unity 程序员编曲花絮:汪峰《河流》细节修复
科技·学习·unity·程序员·音乐·demo·写代码
598866753@qq.com2 天前
Unity UniText笔记
unity·unitext
杨丰玮4182 天前
从零手写Java飞机躲障碍游戏|Swing绘图、鼠标跟随、计时器碰撞检测实战(五)
java·python·游戏·游戏引擎·图形渲染·动画·贴图
鼎艺创新科技2 天前
不依赖 UE/Unity:我们如何从零搭建一套国产三维 GIS 渲染引擎
人工智能·算法·unity·游戏引擎·三维电子沙盘
huihui3613 天前
校友网管理软件技术选型框架:基于功能核验与系统架构的量化评估
unity·系统架构·游戏引擎
五仁烧饼3 天前
Unity性能优化系列设置篇 - URP 移动端设置基线与分档策略
unity·游戏引擎
新手unity自用笔记3 天前
unity基于Socket的网络学习
网络·网络协议·学习·unity·c#·游戏引擎
心前阳光3 天前
Unity之XR Interaction Toolkit | IPointerDownHandler问题
unity·游戏引擎·xr