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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:50:02