如何在Unity与Vuforia中结合地面平面检测限制创建对象数量
实现Unity+Vuforia最多保留2个AR对象的方案
嘿,刚上手Unity和Vuforia的话,这个需求其实很好实现,咱们一步步来,保证你能看懂:
1. 前期准备
- 先确保你已经有了基础的点击放置对象功能(不管是用Vuforia自带的事件,还是自己写的点击检测)
- 把你要放置的对象做成预制体(Prefab),方便重复生成
- 给你的Image Target(识别图)添加一个Collider(比如Box Collider),这样点击时才能检测到识别平面
2. 核心脚本实现
接下来写一个控制对象数量的脚本,逻辑很简单:用列表记录生成的对象,每次点击时:
- 如果当前对象少于2个,直接生成新的加入列表
- 如果已经有2个了,销毁最早生成的那个,再把新对象加入列表
把下面的脚本挂到任意一个空物体上(比如AR Camera或者专门的管理器对象):
using UnityEngine; using System.Collections.Generic; using Vuforia; public class LimitedObjectSpawner : MonoBehaviour { // 在Inspector面板拖入你的对象预制体 public GameObject spawnablePrefab; // 最多保留的对象数量,这里设为2 private readonly int maxObjectCount = 2; // 用来存储已生成的对象,按创建顺序排列 private List<GameObject> spawnedObjectsList = new List<GameObject>(); void Update() { // 检测屏幕左键点击,且当前Vuforia正在追踪识别目标 if (Input.GetMouseButtonDown(0) && IsTrackerActive()) { Ray screenRay = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(screenRay, out RaycastHit hitInfo)) { // 在点击的位置生成/替换对象 HandleObjectSpawn(hitInfo.point); } } } // 检查Vuforia的识别追踪是否激活 private bool IsTrackerActive() { var objectTracker = VuforiaBehaviour.Instance.GetTrackerManager().GetTracker<ObjectTracker>(); return objectTracker != null && objectTracker.IsActive; } // 核心逻辑:生成新对象,超过数量则替换最早的 private void HandleObjectSpawn(Vector3 spawnPos) { // 实例化新对象到点击位置 GameObject newSpawnedObject = Instantiate(spawnablePrefab, spawnPos, Quaternion.identity); // 如果当前对象数量达到上限 if (spawnedObjectsList.Count >= maxObjectCount) { // 获取最早生成的对象并销毁 GameObject oldestObject = spawnedObjectsList[0]; Destroy(oldestObject); // 从列表中移除已销毁的对象 spawnedObjectsList.RemoveAt(0); } // 将新对象加入列表末尾 spawnedObjectsList.Add(newSpawnedObject); } }
3. 关键细节解释
- 列表维护顺序:用
List<GameObject>按创建顺序存储对象,这样每次超过数量时,直接取索引0的对象(第一个生成的)销毁就好 - 追踪状态判断:加入
IsTrackerActive()方法,确保只有在Vuforia识别到目标时才响应点击,避免误操作 - 预制体设置:你之前提到的取消“Duplicate Stage”选项,建议还是取消掉,虽然脚本已经控制了实例数量,但取消后更符合我们的单实例生成逻辑
4. 测试调整
- 把预制体拖到脚本的
spawnablePrefab字段里 - 运行场景,点击识别图:前两次点击会生成两个对象,第三次点击时,第一个对象会消失,同时在新位置生成第三个对象,始终保持最多2个
内容的提问来源于stack exchange,提问作者Tim Lepage




