У меня есть набор изображений, и для этих изображений мне нужно показать разные префабы. Для этого примера я использую два изображения и два префаба. Для imagetarget1 я хочу показать prefab1, а для imagetarget2 я хочу показать prefab2.
Ниже приведен раздел игровых объектов закрытого класса ARTrackedImageManager.
[SerializeField]
[Tooltip("If not null, instantiates this prefab for each detected image.")]
GameObject m_TrackedImagePrefab;
/// <summary>
/// If not null, instantiates this prefab for each detected image.
/// </summary>
public GameObject trackedImagePrefab
{
get { return m_TrackedImagePrefab; }
set { m_TrackedImagePrefab = value; }
}
protected override GameObject GetPrefab()
{
return m_TrackedImagePrefab;
}
/// <summary>
/// Invoked once per frame with information about the <see cref="ARTrackedImage"/>s that have changed, i.e., been added, updated, or removed.
/// This happens just before <see cref="ARTrackedImage"/>s are destroyed, so you can set <c>ARTrackedImage.destroyOnRemoval</c> to <c>false</c>
/// from this event to suppress this behavior.
/// </summary>
public event Action<ARTrackedImagesChangedEventArgs> trackedImagesChanged;
Я создал другой класс для загрузки двух префабов, которые могут отображаться, когда устройство обнаруживает изображения.
public class ImageTest : MonoBehaviour
{
ARTrackedImageManager ImgTrackedmanager;
public GameObject[] Showprefabs;
List<GameObject> listobjects = new List<GameObject>();
int visiblity = 0;
private void Awake()
{
ImgTrackedmanager = GetComponent<ARTrackedImageManager>();
}
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if(visiblity==1)
{
Showprefabs[0].SetActive(true);
Showprefabs[1].SetActive(false);
}
if(visiblity==2)
{
ImgTrackedmanager.trackedImagePrefab = null;
Showprefabs[0].SetActive(false);
Showprefabs[1].SetActive(true);
}
}
private void OnEnable()
{
ImgTrackedmanager.trackedImagesChanged += OnTrackedImagesChanged;
}
void OnDisable()
{
ImgTrackedmanager.trackedImagesChanged -= OnTrackedImagesChanged;
}
void OnTrackedImagesChanged(ARTrackedImagesChangedEventArgs eventArgs)
{
foreach (var trackedImage in eventArgs.added)
{
// Give the initial image a reasonable default scale
//trackedImage.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f);
// Debug.Log("Image Name is .."+trackedImage.gameObject.name);
Debug.Log("Tracked Name is .." + trackedImage.referenceImage.name);
if(trackedImage.referenceImage.name == "imagetargets_1")
{
if(ImgTrackedmanager.trackedImagePrefab == null)
{
GameObject obj1 = Instantiate(Showprefabs[0], trackedImage.transform);
listobjects.Add(obj1);
ImgTrackedmanager.trackedImagePrefab = obj1;
visiblity = 1;
Debug.Log("Prefab1");
}
}
if(trackedImage.referenceImage.name == "imagetargets_2")
{
Destroy(listobjects[0]);
GameObject obj2 = Instantiate(Showprefabs[1], trackedImage.transform);
ImgTrackedmanager.trackedImagePrefab = obj2;
Debug.Log("Prefab2");
visiblity = 2;
}
}
}
}
Здесь, когда он обнаруживает первое изображение, операторы отладки в xcode показывают «Prefab1», а для второго изображения он показывает «Prefab2». Проблема заключается в том, что, когда устройство отображается на втором изображении, первый префаб создается снова.Не понимаю, почему создается первый префаб, добавленный в.
![ImgTrackingArfoundation](https://i.stack.imgur.com/AZMj2.png)