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
相关产品推荐
相关产品推荐

