Unity上的Oculus Quset2开发(2) —— 在VR里打棒球

在安装完Oculus的插件后,能在Assets/Oculus/文件夹下看到插件包含的所有资源和脚本。当然有耐心的话,可以配合官方文档一起一个一个去看,另一方面在Assets/Oculus/SampleFramework/Usage下有官方搭建的几个demo场景,实现和演示了一些基本功能。可以直接将场景打包出来放实机里看看效果。
有以下几个场景:
1.AppDeeplink : 演示从游戏内外联到其他APP上
2.CustomControllers: 演示VR相机和Touch控制器
3.CustomHands:演示VR相机和虚拟手
4.DebugUI:演示在场景里做Debug显示,因为Quest2好像都要打包出来测试。
5.DistanceGrab:演示远程抓取
6.HandsInteractionTrainScene:演示手部追踪。注意在打包时要把Hand Tracking Support改成Hands only或者Controller And Hands。默认时Controller only的会没有效果。感觉这是几个演示场景里最有趣的
7.Locomotion:演示基本移动方法
8.MixedRealityCapture:混合现实的演示,没试过。应该是用来做外部拍摄视频把人像合成到游戏场景里的演示。
9.OVROverlay:UIOverLay效果的演示。开启OverLay,就会让UI永远显示再最前面,可能会因为距离不匹配造成UI的违和感。

这次我们利用CustomHands场景来实现VR里的基本交互——看和抓取,最后实现一个类似打棒球的基本演示。
首先复制CustomHands场景并重命名为其他名字,然后双击打开它。
在场景里只有个地板和OVRCameraRig的预制体实例。

1.实现看的功能

OVRCameraRig是提供了Oculus优化的VR摄像机是Oculus插件里用来实现VR显示的最基本的物体,来取代unity原生的Camera。在结构上有6个Anchor用来表示追踪左右眼,两眼中心,身体和左右控制器。只要在场景里放入一个这个物体,就可以实现基本的VR四处看的功能。
在这里插入图片描述

接着看下OVRCameraRig上的脚本。
OVRCameraRig.cs //用来控制3D渲染和头显定位的脚本
在这里插入图片描述OVRManager.cs //VR头显主要的interface
在这里插入图片描述OVRHeadsetEmulator.cs //用来在unity里开发时用按键模拟头显转动

至此已经实现了看的功能。

2. 实现碰和抓

在OVRCameraRig的LeftHandAnchor/RightHandAnchor下有附加的预制体实例——CustomHandLeft/Right用来实现手部的模拟。我们来看下这个物体的结构
在这里插入图片描述
根物体上挂着主要的控制脚本,一个是OVRGrabber.cs 用来实现抓,一个是Hand.cs用来控制手模型的动画。
GripTrans控制抓到物体的位置
GrabVolume是用来检测抓的碰撞盒。
最后一个是手部模型

1.碰的功能:
由于在手部预制体上已经有了刚体和子物体上的碰撞盒,所以自动可以实现碰撞有碰撞盒的物体。
2.抓的功能
在这个预制体上也已经挂有了插件里实现的抓的OVRGrabber脚本。
在这里插入图片描述但光有抓取脚本不行,要在被抓取物体上挂上能被抓的OVRGrabbable脚本,同时被抓取物体要有碰撞盒和刚体。
在这里插入图片描述于是,看和抓两个功能就实现了。

3.做一个棒球小demo

1.做一个球
在场景里拖一个Sphere,在上面挂上RigidBody和sphereCollider 。
为了实现弹性碰撞,创建一个物理材质,将bounciness设为1。
2.做一个发球器
在场景里拖一个Cube,再这个cube下拖一个空物体作为发射点,摆好位置。随手写一个每几秒发射一个球的脚本。

public class PitchingMachine : MonoBehaviour
{
    
    
    [Tooltip("球的引用")]
    public Rigidbody Ball;
    [Tooltip("发射点")]
    public Transform Point;
    [Tooltip("发射间隔时间")]
    public float delayTime;
    [Tooltip("发射力量")]
    public float force;

    private float timer;
    private void Awake()
    {
    
    
        timer = delayTime;
    }
    void Update()
    {
    
    
        timer += Time.deltaTime;
        if (timer >= delayTime)
        {
    
    
            Ball.gameObject.SetActive(true);
            Ball.transform.position = Point.position;
            Ball.AddForce(Vector3.back * force,ForceMode.Impulse);
            timer = 0;
        }
    }
}

3. 做一个球棒,调整抓取的设置
拖一个cube,调整大小形成一个球棒的形状。
挂上OVRGrabbable脚本,将上面的AllowOffHandGrab关闭。
再将之前在两只手模型上的ParentHeldObject打开。

4.打包运行
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/farcor_cn/article/details/117388714