You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中无需OnClick触发事件:Cardboard VR凝视3秒 teleport实现

实现Cardboard VR凝视3秒传送功能的步骤

1. 基础环境搭建

  • 打开Unity,通过Package Manager搜索并安装Google Cardboard SDK
  • 开启VR模式:依次点击Edit > Project Settings > XR Plug-in Management,勾选Cardboard作为XR插件
  • 导入Cardboard核心预制体:在Package的Google/Cardboard/Prefabs路径下,将CardboardMain拖入场景,这会自动生成带头部追踪的相机系统
  • 创建传送目标:用Sphere或带圆形纹理的Plane制作目标区域,放在场景不同位置作为传送点

2. 编写凝视检测与传送脚本

创建名为GazeTeleport.cs的C#脚本,挂在每个传送目标上:

using UnityEngine;

public class GazeTeleport : MonoBehaviour
{
    // 触发传送的凝视时长阈值
    public float requiredGazeTime = 3f;
    // 当前凝视计时
    private float currentGazeTime = 0f;
    // 是否正在凝视当前目标
    private bool isLookingAtTarget = false;

    private void Update()
    {
        // 从主相机向前发射射线,检测凝视目标
        Ray gazeRay = new Ray(Camera.main.transform.position, Camera.main.transform.forward);
        if (Physics.Raycast(gazeRay, out RaycastHit hitInfo))
        {
            isLookingAtTarget = hitInfo.collider.gameObject == gameObject;
        }
        else
        {
            isLookingAtTarget = false;
            ResetGazeTimer();
        }

        // 凝视计时与触发判断
        if (isLookingAtTarget)
        {
            currentGazeTime += Time.deltaTime;
            if (currentGazeTime >= requiredGazeTime)
            {
                TeleportToTarget();
                ResetGazeTimer();
            }
        }
        else
        {
            ResetGazeTimer();
        }
    }

    // 执行玩家传送逻辑
    private void TeleportToTarget()
    {
        Transform playerTransform = GameObject.Find("CardboardMain").transform;
        // 保持玩家原有高度,避免穿墙或陷地
        playerTransform.position = new Vector3(transform.position.x, playerTransform.position.y, transform.position.z);
    }

    // 重置凝视计时器
    private void ResetGazeTimer()
    {
        currentGazeTime = 0f;
    }

    // 可选:添加视觉反馈,凝视时改变目标颜色
    private void OnEnable()
    {
        GetComponent<Renderer>().material.color = Color.white;
    }

    private void UpdateVisualFeedback()
    {
        if (isLookingAtTarget)
        {
            // 按凝视进度渐变颜色,增强反馈
            float progress = currentGazeTime / requiredGazeTime;
            GetComponent<Renderer>().material.color = Color.Lerp(Color.white, Color.green, progress);
        }
        else
        {
            GetComponent<Renderer>().material.color = Color.white;
        }
    }
}

3. 目标物体的必要设置

  • 给每个传送目标添加Collider组件(Sphere Collider或Mesh Collider),射线检测依赖碰撞体才能生效
  • 给目标挂载材质,配合脚本里的颜色变化,让玩家清晰看到凝视状态

4. 测试与调试

  • 点击Play按钮,在编辑器中用鼠标拖动相机模拟头部转动,或戴上Cardboard设备测试
  • 如果传送无响应,检查以下几点:
    • 是否在XR Plug-in Management中正确启用了Cardboard
    • 传送目标是否添加了Collider组件
    • 场景中CardboardMain的名称是否与脚本中的查找名称一致
    • 射线是否被其他物体遮挡(可将无关物体设为Ignore Raycast层)

内容的提问来源于stack exchange,提问作者ASDASDADS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 18:05:04