簡體   English   中英

如何使用 Unity ARKit 激活場景中的對象而不是預制件

[英]How to use Unity ARKit to activate objects in scene rather than prefabs

我有一些游戲對象,我使用 Unity 中的 ARKit 將它們與不同的標記相關聯。 這些游戲對象目前是預制件,但數量有限,而且每一個都是獨一無二的。 如果預制件是場景中的非活動游戲對象,當設備攝像頭識別標記時變為活動狀態,這將更有意義。 有沒有辦法更改下面的代碼以使游戲對象設置為活動而不是實例化預制件?

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);
            }
        }
    }
}

因此,不是預制件,而是簡單地將場景中的所有現有對象引用到placeablePrefabs (當然稍后更改該名稱!)然后執行

[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);
    }
}

您甚至可以考慮使用一些免費資產,例如SerializableDictionary並直接通過 Inspector 完成所有操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM