当前位置: 首页 > 知识库问答 >
问题:

如何使用Unity ARKit激活场景中的对象而不是预制件

景德海
2023-03-14

我有一个游戏对象的选择,我用ARKit在Unity中与不同的标记关联。这些游戏对象目前是预制的,但数量有限,而且每个都是唯一的。如果预设是场景中的非活动游戏对象,当设备摄像头识别标记时,该对象变为活动对象,则更有意义。有没有办法更改下面的代码,使游戏对象设置为活动的,而不是实例化一个预置?

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR;
using UnityEngine.XR.ARFoundation;

[RequireComponent(typeof(ARTrackedImageManager))]

public class ImageTracking : MonoBehaviour
{

    [SerializeField]
    private GameObject[] placeablePrefabs;

    private Dictionary<string, GameObject> spawnedPrefabs = new Dictionary<string, GameObject>();
    private ARTrackedImageManager trackedImageManager;

    private void Awake()
    {
        trackedImageManager = FindObjectOfType<ARTrackedImageManager>();

        foreach(GameObject prefab in placeablePrefabs)
        {
            GameObject newPrefab = Instantiate(prefab, Vector3.zero, Quaternion.identity);
            newPrefab.name = prefab.name;
            spawnedPrefabs.Add(prefab.name, newPrefab);
        }
    }

    private void OnEnable()
    {
        trackedImageManager.trackedImagesChanged += ImageChanged;
    }

    private void OnDisable()
    {
        trackedImageManager.trackedImagesChanged -= ImageChanged;
    }

    private void ImageChanged(ARTrackedImagesChangedEventArgs eventArgs)
    {
        foreach(ARTrackedImage trackedImage in eventArgs.added)
        {
            UpdateImage(trackedImage);
        }
        foreach (ARTrackedImage trackedImage in eventArgs.updated)
        {
            UpdateImage(trackedImage);
        }
        foreach (ARTrackedImage trackedImage in eventArgs.removed)
        {
            spawnedPrefabs[trackedImage.name].SetActive(false);
        }
    }

    private void UpdateImage(ARTrackedImage trackedImage)
    {
        string name = trackedImage.referenceImage.name;
        Vector3 position = trackedImage.transform.position;

        GameObject prefab = spawnedPrefabs[name];
        prefab.transform.position = position;
        prefab.SetActive(true);

        foreach(GameObject go in spawnedPrefabs.Values)
        {
            if(go.name != name)
            {
                go.SetActive(false);
            }
        }
    }
}

共有1个答案

姬选
2023-03-14

因此,不是预置,而是简单地将场景中所有现有的对象引用到可放置的预置对象中(当然稍后会更改该名称!)然后去做

[SerializeField]
private GameObject[] showAbleObjects;

private Dictionary<string, GameObject> nameToGameObject = new Dictionary<string, GameObject>();

private void Awake()
{
    trackedImageManager = FindObjectOfType<ARTrackedImageManager>();

    foreach(var obj in showAbleObjects)
    {
        nameToGameObject.Add(obj.name, obj);
    }
}

你甚至可以考虑使用一些免费资产,比如。序列化字典,并通过检查员直接做这一切。

 类似资料:
  • 我的宏有一个问题,我从一个工作表(a)运行它,我需要从工作表(B)复制单元格并粘贴到工作表(C),但我只能使它改变工作表,有没有办法做到这一点而不激活工作表???

  • 我有两个事实,分别命名为OptionalCover和OptionalPremiumComponent,其中有OptionalPremiumComponent的参考。这就是我在工作记忆中插入的内容。 我在drools中创建了以下规则 问题是,插入父对象时没有触发上述规则。我还需要做些什么来实现这种行为吗?是否支持? 谢谢你。

  • 我是新来的阿科雷和斯内福。我在arSceneView中有一个arObject,我想在场景中隐藏它(几秒钟)。我不想从场景中分离()锚点,只需将其隐藏,然后在几秒钟后再次显示。 我已尝试更改的参数。sfa文件,但它不起作用 或者我还缺少什么别的方法

  • /*****@作者Ahmad*/公共类NewJFrame扩展javax.swing.jFrame{ }

  • 问题内容: 我想做的是从而不是从Volley库中使用一些数据。 以下是用于从服务器中获取JSON对象的代码。 我试图改变到后改为。但这并没有解决。 问题答案: 中的url 不是可选的,并且JSONObject参数用于将带有请求的参数发布到url。 从文档中:http : //afzaln.com/volley/com/android/volley/toolbox/JsonObjectRequest

  • 现在我想使用javascript或css禁用www.hjk.com网址链接