MIF_E31221209/Assets/Script/ActivateObjectOnTargetTrack...

112 lines
3.8 KiB
C#

using UnityEngine;
using Vuforia;
using System.Collections.Generic;
public class ActivateObjectOnTargetTracking : MonoBehaviour
{
[System.Serializable]
public class MarkerCombination
{
public ObserverBehaviour marker1;
public ObserverBehaviour marker2;
public GameObject originalObject1;
public GameObject originalObject2;
public GameObject combinedObject;
}
public List<MarkerCombination> combinations;
public float yOffset = 0.2f;
public float distanceThreshold = 2f;
public GameObject plusIcon; // Ikon +
private List<GameObject> hiddenOriginals = new List<GameObject>();
private bool IsTracked(ObserverBehaviour trackable)
{
return trackable != null && trackable.TargetStatus.Status == Status.TRACKED;
}
void Update()
{
hiddenOriginals.Clear();
List<MarkerCombination> validCombos = new List<MarkerCombination>();
bool showPlusIcon = false;
Vector3 plusIconPosition = Vector3.zero;
foreach (var combo in combinations)
{
if (combo.marker1 == null || combo.marker2 == null || combo.combinedObject == null)
continue;
bool isMarker1Tracked = IsTracked(combo.marker1);
bool isMarker2Tracked = IsTracked(combo.marker2);
if (isMarker1Tracked || isMarker2Tracked)
{
float distance = Vector3.Distance(combo.marker1.transform.position, combo.marker2.transform.position);
bool isCloseEnough = distance <= distanceThreshold;
if (isMarker1Tracked && isMarker2Tracked && isCloseEnough)
{
validCombos.Add(combo);
}
else if (isMarker1Tracked && isMarker2Tracked && !isCloseEnough)
{
// Jika marker terdeteksi dan berjauhan, tampilkan ikon +
showPlusIcon = true;
plusIconPosition = (combo.marker1.transform.position + combo.marker2.transform.position) / 2;
plusIconPosition.y += yOffset;
}
}
}
// Nonaktifkan semua combinedObject terlebih dahulu
foreach (var combo in combinations)
{
if (combo.combinedObject != null)
combo.combinedObject.SetActive(false);
}
if (validCombos.Count > 0)
{
var combo = validCombos[0];
if (combo.originalObject1 != null)
{
combo.originalObject1.SetActive(false);
hiddenOriginals.Add(combo.originalObject1);
}
if (combo.originalObject2 != null)
{
combo.originalObject2.SetActive(false);
hiddenOriginals.Add(combo.originalObject2);
}
Vector3 midPosition = (combo.marker1.transform.position + combo.marker2.transform.position) / 2;
midPosition.y += yOffset;
combo.combinedObject.transform.position = midPosition;
combo.combinedObject.SetActive(true);
}
// Tampilkan atau sembunyikan ikon +
if (plusIcon != null)
{
plusIcon.SetActive(showPlusIcon);
if (showPlusIcon)
plusIcon.transform.position = plusIconPosition;
}
// Aktifkan kembali original objects jika tidak disembunyikan oleh kombinasi valid
foreach (var combo in combinations)
{
if (combo.originalObject1 != null && !hiddenOriginals.Contains(combo.originalObject1) && IsTracked(combo.marker1))
combo.originalObject1.SetActive(true);
if (combo.originalObject2 != null && !hiddenOriginals.Contains(combo.originalObject2) && IsTracked(combo.marker2))
combo.originalObject2.SetActive(true);
}
}
}