menu 叫我半仙儿
关于Pico LegacyUnitySdk默认手柄射线是歪的这档事
795 浏览 | 2021-11-10 | 阅读时间: 约 2 分钟 | 分类: Unity | 标签:
请注意,本文编写于 278 天前,最后修改于 278 天前,其中某些信息可能已经过时。

在对Pico neo2的开发中,按照常规流程
1、 给Pvr_UnitySDK下Event子物体添加Pvr_InputModule组件

2、 显示PvrController1(也可以是PvrController0,但最好是1,因为编辑器模式只支持控制手柄1)的dot和ray_alpha

3、 打开ControllerManager下Pvr_ControllerManager组件的LengthAdaptiveRay

4、 建立Canvas,并添加Pvr_UICanvas组件,将Canvas模式调整至世界空间,并将Canvas的eventCamera设置为Head,最后将Canvas的调整至适当大小,并创建按钮


按常理来说,这个时候我们点击运行就应该可以和UI交互了,然而事实并非如此

可以看到,当圆点停留在按钮上时,按钮并没有变色

当把圆点稍微向下移动,按钮却变色了
经过多次实验发现,确实是PicoSDK的问题,Pico的手柄自带射线与真实射线不符,存在一定偏差,该偏差会随着距离大小而改变
该问题有两种解法
(1) 自己创建脚本
代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class FixRay : MonoBehaviour
{
    public Transform controller;

    Ray ray;
    RaycastHit hit;
    Transform dot;
    private void Start()
    {
        ray = new Ray();
        dot = controller.Find("dot");
    }
    private void Update()
    {
        ray.origin = controller.Find("start").position;
        ray.direction = controller.forward - controller.up * .25f;
        //官方认证精准射线,谁用谁知道
        if (Physics.Raycast(ray, out hit))
        {
            dot.position = hit.point;
            if (Pvr_ControllerManager.Instance.LengthAdaptiveRay)
            {
                float s = 0.178f * dot.localPosition.z / 3.3f;
                //不要问我这些数值哪来的,问就是官方也这么写
                Mathf.Clamp(s, 0.05f, 0.178f);
                dot.localScale = new Vector3(s, s, 1);
            }
        }
    }
}

随意将该脚本挂载到一物体上,并将Pvr_Controller1赋值给脚本的controller;
再次测试
可以看到,只有圆点在按钮上,才能触发按钮事件
(2) 懒人大法(平时我也这样)
直接打开Asset下Pvr_Controller/Scenes/Pvr_Controller_UI场景,复制其中的Canvas和Pvr_UnitySDK到自己的场景下,
删去不需要的UI(拿来吧你)

可以看到,复制过来的可以无缝使用,省去了一系列复杂的操作
推荐使用方法二,毕竟有句古话说得好----------“程序员要避免重复造轮子”(雾)
其实只是因为方法一本质上就是自己写了一个青春版官方Demo的脚本,所以为了提高效率,没有必要的情况下可以直接使用方法二来节省时间偷偷懒

发表评论

email
web

全部评论 (暂无评论)

info 还没有任何评论,你来说两句呐!