You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动