如何在Vuforia中编辑脚本实现触摸计数及单双触区分操作
解决Unity 2018.1 + Vuforia 7.1.35的触摸交互问题
先给你理清楚几个核心问题的解决思路,都是我踩过的实际坑:
1. 无法编辑Vuforia脚本的问题
Vuforia的核心脚本(比如和Stage放置、触摸相关的)大多封装在编译后的DLL里,本身就不允许直接编辑——官方这么做是为了避免用户修改核心逻辑导致兼容性问题。你应该通过自定义脚本继承或扩展Vuforia的功能,而不是尝试修改官方脚本。比如针对Stage放置逻辑,你可以写自己的触摸处理脚本,完全替代或补充官方的StagePlacement行为。
2. 单触/双触逻辑混乱(都触发放置)的解决
你现在的问题是触摸判断逻辑没区分开单指和双指的状态,加上可能和Vuforia自带的放置脚本冲突了。按下面的步骤来:
第一步:清理冲突的官方脚本
找到场景中的ARCamera或者StageArea对象,检查是否挂载了Vuforia自带的StagePlacement或类似的触摸放置脚本,先禁用或删除它们——这些自带脚本的触摸逻辑会和你的自定义逻辑打架。
第二步:自定义触摸处理脚本
写一个新的C#脚本,挂载到ARCamera上,脚本里明确区分单指和双指的触摸行为:
using UnityEngine; using Vuforia; public class ARTouchHandler : MonoBehaviour { public GameObject modelPrefab; // 你要放置的模型预制体 private GameObject placedModel; // 已放置的模型实例 private Vector2 prevTouchPos1; private Vector2 prevTouchPos2; private float initialScale; void Update() { // 处理触摸输入 if (Input.touchCount == 1) { Touch touch = Input.GetTouch(0); // 单指开始触摸时,执行放置(仅当模型未放置时) if (touch.phase == TouchPhase.Began && placedModel == null) { PlaceModel(touch.position); } } else if (Input.touchCount == 2) { // 双指触摸时,执行缩放(仅当模型已放置时) if (placedModel == null) return; Touch touch1 = Input.GetTouch(0); Touch touch2 = Input.GetTouch(1); // 记录初始触摸位置和模型初始缩放 if (touch1.phase == TouchPhase.Began || touch2.phase == TouchPhase.Began) { prevTouchPos1 = touch1.position; prevTouchPos2 = touch2.position; initialScale = placedModel.transform.localScale.x; } // 触摸移动时计算缩放比例 else if (touch1.phase == TouchPhase.Moved && touch2.phase == TouchPhase.Moved) { float currentDistance = Vector2.Distance(touch1.position, touch2.position); float prevDistance = Vector2.Distance(prevTouchPos1, prevTouchPos2); float scaleFactor = currentDistance / prevDistance; // 应用缩放,限制最小/最大缩放值(可选) Vector3 newScale = placedModel.transform.localScale * scaleFactor; newScale = Vector3.Max(newScale, new Vector3(0.5f, 0.5f, 0.5f)); // 最小缩放0.5倍 newScale = Vector3.Min(newScale, new Vector3(2f, 2f, 2f)); // 最大缩放2倍 placedModel.transform.localScale = newScale; // 更新上一帧触摸位置 prevTouchPos1 = touch1.position; prevTouchPos2 = touch2.position; } } } private void PlaceModel(Vector2 screenPos) { // 从屏幕射线检测到AR平面(需要Vuforia的PlaneFinder功能开启) Ray ray = Camera.main.ScreenPointToRay(screenPos); TrackableHit hit; if (VuforiaRuntimeUtilities.IsTrackableHit(ray, out hit, TrackableType.PlaneWithinPolygon)) { // 实例化模型到检测到的平面位置 placedModel = Instantiate(modelPrefab, hit.Position, hit.Rotation); // 可选:让模型始终面向相机 placedModel.transform.LookAt(Camera.main.transform); placedModel.transform.Rotate(0, 180, 0); // 调整朝向,避免模型背对相机 } } }
第三步:配置Vuforia环境
- 确保你的场景中已经开启了Plane Finder功能(在ARCamera的Vuforia Behaviour组件里,勾选Plane Finder)
- 确认
Duplicate Stage已经关闭(你已经做了这步,没问题)
3. 双触缩放不生效的排查点
如果上面的脚本还是不生效,检查这几个地方:
- 模型的
Transform组件是否被锁定?或者有其他脚本在修改缩放值? - 触摸阶段判断是否正确:你之前的脚本是不是用了
TouchPhase.Ended而不是TouchPhase.Moved?只有Moved阶段才能持续计算缩放 - 有没有给模型添加
Rigidbody?如果有,要设置为Kinematic,避免物理引擎干扰缩放 - 检查相机的
Camera组件,是否开启了Projection为Perspective(AR场景必须用透视相机)
内容的提问来源于stack exchange,提问作者zyonneo
相关产品推荐
相关产品推荐

