unity pico开发 四 物体交互 抓取 交互层级

文章目录

手部设置

为手部(LeftHandController)添加XRDirInteractor脚本

并添加一个球形碰撞盒,勾选isTrigger,调整大小为0.1

物体交互

创建一个cube当桌子,再创建一个cube当交互物体,交互cube建议大小为0.1

创建三个材质球,将交互物体的材质改为红色

为交互物体添加刚体,

为交互物体添加一个XRSimpleInteractable脚本,注意不需要拖拽Colliders

然后如下设置交互事件,在事件上右键可以复制粘贴

此时运行,手碰到cube会变成绿色,按下抓取键会变成换色,手离开cube会重新变红

物体抓取

添加抓取

创建一个新cube,添加刚体,添加XR Grab Interactable组件,不需要拖拽colliders属性

取消勾选retain Transform Parent,这会让物体在结束抓取时重新返回原来的父物体下,到那时如果父物体的缩放xyz值不同,会导致模型顶点选择错误

此时运行即可抓取

抓取三种类型

VelocityTracking:不能穿过桌子,使用碰撞盒进行物理交互

Kinematic:可以穿过桌子,使用碰撞盒进行物理交互

Instantaneous:可以穿过桌子,使用碰撞盒进行物理交互,但是会不精确

抓取点偏移

创建一个空物体作为抓取对象的子物体,然后放在合适的抓取点上,将空物体拖拽给XRGrabInteractable上的AttachTransform上

抓取事件

可以通过在XRGrabInteractor脚本直接拖拽的方式绑定事件

也可以使用脚本绑定,例如

csharp 复制代码
public class FireBulletOnActivate : MonoBehaviour
{

    // Start is called before the first frame update
    void Start()
    {
        //被抓取物体的交互组件
        XRGrabInteractable grabable = GetComponent<XRGrabInteractable>();
        grabable.activated.AddListener(FireBullet);
    }

    public void FireBullet(ActivateEventArgs arg)
    {
        print("射击");
    }
}

抓取时不让物体吸附到手部

对于interaction Toolkit2.1以上的版本,可以直接勾选Use Dynamic Attach

对于旧版本,我们可以自己重写抓取脚本,将抓取点放到手上,即可实现不吸附的效果

csharp 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.Interaction.Toolkit;

public class XROffsetGrabInteractable : XRGrabInteractable
{
    private void Start()
    {
        if (!attachTransform)
        {
            GameObject attachPoint = new GameObject("Offset Grab Pivot");
            attachPoint.transform.SetParent(transform,false);
            attachTransform = attachPoint.transform;
        }
    }

    protected override void OnSelectEntered(SelectEnterEventArgs args)
    {
        print("进入");
        attachTransform.position = args.interactorObject.transform.position;
        attachTransform.rotation = args.interactorObject.transform.rotation;
        base.OnSelectEntered(args);
    }
}

直接挂载,不需要其他操作

射线抓取

就是普通的射线,默认就可以进行抓取操作

右键XR/RayInteractor(Action-base),然后设置好XRController组件的预制数据,对准需要抓取的物体,按下抓取键即可进行抓取

射线抓取和手部的XR Direct Interactor同时使用会造成可以抓两次的错误

如果将射线的XR Interactor Line Visual的颜色透明度改为0,那么将只在只想可抓取物体时,才会显示射线

如果取消勾选射线的XR Ray Interactor组件上的ForceGrab,那么抓取时将保持射线的距离

抓取时可以用摇杆控制旋转和远近

交互层级

射线本身是多功能的,既可以用来移动也可以用来抓取

但是我们希望有些射线只能用来移动,有些只能用来抓取

可以使用分层功能

注意,不是Unity本身的layer,而是interaction toolkit自己的layer

使用方法

找到手上的XR Direct Interactor 或者射线的XR Ray Interactor,选择层级,点开,添加新层级,然后设置

为需要交互的物体找到各自的层级设置,如地面,可抓取物体等,设置好要响应的层级,此时他们将只响应对应层级的交互器

相关推荐
枯萎穿心攻击7 小时前
响应式编程入门教程第二节:构建 ObservableProperty<T> — 封装 ReactiveProperty 的高级用法
开发语言·unity·c#·游戏引擎
X_StarX15 小时前
【Unity笔记02】订阅事件-自动开门
笔记·学习·unity·游戏引擎·游戏开发·大学生
Thomas_YXQ1 天前
Unity URP法线贴图实现教程
开发语言·unity·性能优化·游戏引擎·unity3d·贴图·单一职责原则
徐子竣1 天前
[学习记录]Unity-Shader-几何着色器
unity·游戏引擎·着色器
EQ-雪梨蛋花汤1 天前
【Part 3 Unity VR眼镜端播放器开发与优化】第四节|高分辨率VR全景视频播放性能优化
unity·音视频·vr
与火星的孩子对话2 天前
Unity进阶课程【六】Android、ios、Pad 终端设备打包局域网IP调试、USB调试、性能检测、控制台打印日志等、C#
android·unity·ios·c#·ip
幻世界2 天前
【Unity智能模型系列】Unity + MediaPipe + Sentis + ArcFace模型:构建高效人脸识别比对系统
unity·游戏引擎
死也不注释2 天前
【Unity 编辑器工具开发:GUILayout 与 EditorGUILayout 对比分析】
unity·编辑器·游戏引擎
小赖同学啊3 天前
物联网中的Unity/Unreal引擎集成:数字孪生与可视化控制
物联网·unity·游戏引擎
Zlzxzw3 天前
使用unity创建项目,进行动画制作
unity·游戏引擎