namespace VRTK.Examples.PanelMenu
|
|
{
|
|
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
|
|
/// <summary>
|
|
/// Demo GridLayoutGroup component that subscribes to PanelMenuItemController events.
|
|
/// </summary>
|
|
/// <example>
|
|
/// See the demo scene for a complete example: [ 040_Controls_Panel_Menu ]
|
|
/// </example>
|
|
public class PanelMenuUIGrid : MonoBehaviour
|
|
{
|
|
#region Variables
|
|
|
|
public enum Direction
|
|
{
|
|
None,
|
|
Up,
|
|
Down,
|
|
Left,
|
|
Right
|
|
}
|
|
|
|
private readonly Color colorDefault = Color.white;
|
|
private readonly Color colorSelected = Color.green;
|
|
private readonly float colorAlpha = 0.25f;
|
|
|
|
private GridLayoutGroup gridLayoutGroup;
|
|
private int selectedIndex = 0;
|
|
|
|
#endregion Variables
|
|
|
|
#region Unity Methods
|
|
|
|
private void Start()
|
|
{
|
|
gridLayoutGroup = GetComponent<GridLayoutGroup>();
|
|
if (gridLayoutGroup == null)
|
|
{
|
|
VRTK_Logger.Warn(VRTK_Logger.GetCommonMessage(VRTK_Logger.CommonMessageKeys.REQUIRED_COMPONENT_MISSING_FROM_GAMEOBJECT, "PanelMenuUIGrid", "GridLayoutGroup", "the same"));
|
|
return;
|
|
}
|
|
|
|
GetComponentInParent<VRTK_PanelMenuItemController>().PanelMenuItemSwipeTop += new PanelMenuItemControllerEventHandler(OnPanelMenuItemSwipeTop);
|
|
GetComponentInParent<VRTK_PanelMenuItemController>().PanelMenuItemSwipeBottom += new PanelMenuItemControllerEventHandler(OnPanelMenuItemSwipeBottom);
|
|
GetComponentInParent<VRTK_PanelMenuItemController>().PanelMenuItemSwipeLeft += new PanelMenuItemControllerEventHandler(OnPanelMenuItemSwipeLeft);
|
|
GetComponentInParent<VRTK_PanelMenuItemController>().PanelMenuItemSwipeRight += new PanelMenuItemControllerEventHandler(OnPanelMenuItemSwipeRight);
|
|
GetComponentInParent<VRTK_PanelMenuItemController>().PanelMenuItemTriggerPressed += new PanelMenuItemControllerEventHandler(OnPanelMenuItemTriggerPressed);
|
|
|
|
SetGridLayoutItemSelectedState(selectedIndex);
|
|
}
|
|
|
|
#endregion Unity Methods
|
|
|
|
#region Interation
|
|
|
|
public bool MoveSelectGridLayoutItem(Direction direction, GameObject interactableObject)
|
|
{
|
|
int newIndex = FindNextItemBasedOnMoveDirection(direction);
|
|
if (newIndex != selectedIndex)
|
|
{
|
|
SetGridLayoutItemSelectedState(newIndex);
|
|
selectedIndex = newIndex;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
private int FindNextItemBasedOnMoveDirection(Direction direction)
|
|
{
|
|
float width = gridLayoutGroup.preferredWidth;
|
|
float cellWidth = gridLayoutGroup.cellSize.x;
|
|
float spacing = gridLayoutGroup.spacing.x;
|
|
int cellsAccross = (int)Mathf.Floor(width / (cellWidth + (spacing / 2))); // quick / dirty
|
|
int childCount = gridLayoutGroup.transform.childCount;
|
|
|
|
switch (direction)
|
|
{
|
|
case Direction.Up:
|
|
int nextUp = selectedIndex - cellsAccross;
|
|
return (nextUp >= 0) ? nextUp : selectedIndex;
|
|
case Direction.Down:
|
|
int nextDown = selectedIndex + cellsAccross;
|
|
return (nextDown < childCount) ? nextDown : selectedIndex;
|
|
case Direction.Left:
|
|
int nextLeft = selectedIndex - 1;
|
|
return (nextLeft >= 0) ? nextLeft : selectedIndex;
|
|
case Direction.Right:
|
|
int nextRight = selectedIndex + 1;
|
|
return (nextRight < childCount) ? nextRight : selectedIndex;
|
|
default:
|
|
return selectedIndex;
|
|
}
|
|
}
|
|
|
|
private void SetGridLayoutItemSelectedState(int index)
|
|
{
|
|
foreach (Transform childTransform in gridLayoutGroup.transform)
|
|
{
|
|
var child = childTransform.gameObject;
|
|
if (child != null)
|
|
{
|
|
Color color = colorDefault;
|
|
color.a = colorAlpha;
|
|
child.GetComponent<Image>().color = color;
|
|
}
|
|
}
|
|
|
|
var selected = gridLayoutGroup.transform.GetChild(index);
|
|
if (selected != null)
|
|
{
|
|
Color color = colorSelected;
|
|
color.a = colorAlpha;
|
|
selected.GetComponent<Image>().color = color;
|
|
}
|
|
}
|
|
|
|
#endregion Interaction
|
|
|
|
#region UI Events
|
|
|
|
private void OnPanelMenuItemSwipeTop(object sender, PanelMenuItemControllerEventArgs e)
|
|
{
|
|
MoveSelectGridLayoutItem(Direction.Up, e.interactableObject);
|
|
}
|
|
|
|
private void OnPanelMenuItemSwipeBottom(object sender, PanelMenuItemControllerEventArgs e)
|
|
{
|
|
MoveSelectGridLayoutItem(Direction.Down, e.interactableObject);
|
|
}
|
|
|
|
private void OnPanelMenuItemSwipeLeft(object sender, PanelMenuItemControllerEventArgs e)
|
|
{
|
|
MoveSelectGridLayoutItem(Direction.Left, e.interactableObject);
|
|
}
|
|
|
|
private void OnPanelMenuItemSwipeRight(object sender, PanelMenuItemControllerEventArgs e)
|
|
{
|
|
MoveSelectGridLayoutItem(Direction.Right, e.interactableObject);
|
|
}
|
|
|
|
private void OnPanelMenuItemTriggerPressed(object sender, PanelMenuItemControllerEventArgs e)
|
|
{
|
|
SendMessageToInteractableObject(e.interactableObject);
|
|
}
|
|
|
|
private void SendMessageToInteractableObject(GameObject interactableObject)
|
|
{
|
|
interactableObject.SendMessage("UpdateGridLayoutValue", selectedIndex);
|
|
}
|
|
|
|
#endregion UI Events
|
|
}
|
|
}
|