112 lines
3.8 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|