using System.Collections.Generic; using UnityEngine; using UnityEngine.InputSystem; using UnityEngine.UIElements; using VOID.Generic.Objects.Abstract; using VOID.UserInterface; using VOID.UserInterface.Game.Party; using VOID.UserInterface.Game.Util; namespace VOID.Generic.Player.Util { public static class SelectUtil { private const int LayerMask = LayerManager.Static | LayerManager.Dynamic; /// /// Returns result from SelectFromUI() or SelectFromScene() depending on whether it was over UI /// public static SelectUtilResult Select() { return GameUI.current.isCursorOverUI ? SelectFromUI() : SelectFromScene(); } /// /// Returns clicked AbstractObject or position if something else clicked from scene /// public static SelectUtilResult SelectFromScene() { if (GameUI.current.isCursorOverUI) return new SelectUtilResult(); var hit = SelectHit(); if (!hit.collider) return new SelectUtilResult(); var hitPosition = hit.point; var hitObject = hit.collider.gameObject.GetComponentInParent(); if (hitObject == PlayerController.current.activeUnit) return new SelectUtilResult(); if (!hitObject) return new SelectUtilResult(hitPosition); return new SelectUtilResult(hitPosition, hitObject); } /// /// Returns clicked AbstractObject or BasicAbility from UI. Using cached position and ui elements if provided. /// public static SelectUtilResult SelectFromUI(List cachedElements = null) { if (cachedElements is { Count: 0 }) return new SelectUtilResult(); if (cachedElements is null && !GameUI.current.isCursorOverUI) return new SelectUtilResult(); // Here we only handle first element - we don't care whats behind it switch (GameUI.current.PickTopComponentUI(cachedElements)) { case SlotUI slotUI: return new SelectUtilResult(slotUI).WithUI(cachedElements); case UnitPortraitUI unitPortraitUI: return new SelectUtilResult(unitPortraitUI).WithUI(cachedElements); default: return new SelectUtilResult(); } } /// /// Returns Vector3 of clicked position /// public static Vector3 SelectPosition() { return SelectHit().point; } /// /// Returns of clicked position /// public static RaycastHit SelectHit() { Physics.Raycast( Camera.main.ScreenPointToRay(Mouse.current.position.ReadValue()), out var hit, Mathf.Infinity, LayerMask); return hit; } } }