Files
XR-Aphantasia/Assets/Scripts/ObjectVisualizer.cs

113 lines
3.4 KiB
C#

using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.InputSystem;
public class ObjectVisualizer : MonoBehaviour
{
public Transform familiarObjects;
public Transform unfamiliarObjects;
public List<int> objectDisplayOrder;
[Header("Input Setup")]
public InputActionReference changeObjectTypeAction; // Switches between familiar and unfamiliar objects
public InputActionReference showNextObjectAction; // Shows next object in the circular list
public InputActionReference showPreviousObjectAction; // Shows previous object in the circular list
private bool displayFamiliarObjects = true;
private int displayObjectSize;
private int currentShowedIndex = 0;
void OnEnable()
{
// Activate input callbacks
changeObjectTypeAction.action.performed += ChangeObjectType;
showNextObjectAction.action.performed += ShowNextObject;
showPreviousObjectAction.action.performed += ShowPreviousObject;
}
void OnDisable()
{
// Deactivate input callbacks
changeObjectTypeAction.action.performed -= ChangeObjectType;
showNextObjectAction.action.performed -= ShowNextObject;
showPreviousObjectAction.action.performed -= ShowPreviousObject;
}
/// INPUT CALLBACKS
void ChangeObjectType(InputAction.CallbackContext ctx)
{
displayFamiliarObjects = displayFamiliarObjects? false:true;
Debug.Log($"Changing object type | Displaying familiar objects?: {displayFamiliarObjects}");
UpdateDisplayObjectType();
// Restart displayed object index
currentShowedIndex = 0;
UpdateDisplayedObject();
}
void ShowNextObject(InputAction.CallbackContext ctx)
{
currentShowedIndex++;
UpdateDisplayedObject();
}
void ShowPreviousObject(InputAction.CallbackContext ctx)
{
currentShowedIndex--;
UpdateDisplayedObject();
}
/// MAIN METHODS
private int GetObjectsListSize()
{
if(displayFamiliarObjects)
return familiarObjects.childCount;
else
return unfamiliarObjects.childCount;
}
void UpdateDisplayObjectType()
{
familiarObjects.gameObject.SetActive(displayFamiliarObjects);
unfamiliarObjects.gameObject.SetActive(!displayFamiliarObjects);
displayObjectSize = GetObjectsListSize();
}
void UpdateDisplayedObject()
{
// Keep objects within limits
if(currentShowedIndex == displayObjectSize)
currentShowedIndex = 0;
if(currentShowedIndex == -1)
currentShowedIndex = displayObjectSize-1;
Debug.Log($"Update displayed object | Current index: {currentShowedIndex}");
// Display corresponding object
Transform parentObject = displayFamiliarObjects? familiarObjects : unfamiliarObjects;
for(int i=0; i<displayObjectSize; i++)
{
// Show only the corresponding child indicated in the position of the list
parentObject.GetChild(i).gameObject.SetActive(i==objectDisplayOrder[currentShowedIndex]);
}
}
void Start()
{
// Initialize which type of objects to show
UpdateDisplayObjectType();
// Start the list with sequential numbers
objectDisplayOrder = Enumerable.Range(0, displayObjectSize).ToList();
// Initialize displayed object
UpdateDisplayedObject();
}
}