Files
aibis-dream/Assets/Scripts/Mouse/MouseCursorManager.cs
T
2024-11-13 03:19:55 +08:00

295 lines
8.7 KiB
C#

using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using System.Collections.Generic;
using AibisDream;
using Unity.VisualScripting;
public class MouseCursorManager : MonoBehaviour
{
public static MouseCursorManager Instance { get; private set; }
[Header("Cursor Images")]
public Sprite dialogueCursorSprite;
public Sprite handCursorSprite; // 手的图标
public Sprite searchCursorSprite; // 搜索图标
public Sprite defaultCursorSprite;
public Canvas dialogueCanvas; // 对话Canvas
public Image cursorImage; // 用于显示自定义光标的Image
private bool isDraggingPlug = false; // 是否正在拖拽Plug
private bool isUsingTool = false; // 是否处于使用工具状态
private bool isInClueBoard = false; // 是否处于使用工具状态
private Vector3 defaultCursorOffset = new Vector3(20, -20, 0); // default 指针的偏移量
public List<Button> ButtonDisableWhenIsTalking;
private void Awake()
{
if (Instance != null && Instance != this)
{
Destroy(gameObject);
return;
}
Instance = this;
DontDestroyOnLoad(gameObject);
}
private void Start()
{
ResetCursor(); // 设置为默认光标
}
private void Update()
{
if (cursorImage.sprite != defaultCursorSprite)
{
cursorImage.transform.position = Input.mousePosition;
}
UpdateCursorState();
// 检测点击事件
if (Input.GetMouseButtonDown(0)&&!isDraggingPlug)
{
HandleClick();
}
}
private void UpdateCursorState()
{
if(isInClueBoard)
{
cursorImage.gameObject.SetActive(false);
return;
}
else
{
cursorImage.gameObject.SetActive(true);
}
if (DialogController.Instance.IsTalking)
{
foreach(Button button in ButtonDisableWhenIsTalking)
{
button.interactable=false;
}
SetCursor(dialogueCursorSprite);
dialogueCanvas.sortingOrder = 1000; // 确保对话窗口在最前
dialogueCanvas.overrideSorting = true;
dialogueCanvas.GetComponent<GraphicRaycaster>().blockingMask = LayerMask.GetMask("Everything");
}
else
{
foreach(Button button in ButtonDisableWhenIsTalking)
{
button.interactable=true;
}
dialogueCanvas.overrideSorting = false;
dialogueCanvas.GetComponent<GraphicRaycaster>().blockingMask = LayerMask.GetMask("Nothing");
if(isDraggingPlug)
{
SetCursor(handCursorSprite);
}
else if (IsHoveringOverDragItem())
{
SetCursor(handCursorSprite);
}
// else if (IsHoveringOverDialogueItem())
// {
// SetCursor(searchCursorSprite, true); // 使用翻转光标
// }
else
{
ResetCursor();
}
}
}
// private bool IsHoveringOverDialogueItem()
// {
// if (EventSystem.current.IsPointerOverGameObject())
// {
// PointerEventData pointerData = new PointerEventData(EventSystem.current) { position = Input.mousePosition };
// var results = new List<RaycastResult>();
// EventSystem.current.RaycastAll(pointerData, results);
// foreach (var result in results)
// {
// if (result.gameObject.CompareTag("DialogueObject")) // 物体需添加 DialogueObject 标签
// {
// if(result.gameObject.transform.GetChild(0)!=null)
// {
// if(result.gameObject.transform.GetChild(0).GetComponent<Socket>().IsAvailable)
// {
// Debug.Log("Hover Dialogue");
// return true;
// }
// }
// }
// }
// }
// return false;
// }
private bool IsHoveringOverDragItem()
{
if (EventSystem.current.IsPointerOverGameObject())
{
PointerEventData pointerData = new PointerEventData(EventSystem.current) { position = Input.mousePosition };
var results = new List<RaycastResult>();
EventSystem.current.RaycastAll(pointerData, results);
foreach (var result in results)
{
// If the Canvas's sortingOrder is higher than the reference sortingOrder, ignore it
if (result.gameObject.CompareTag("Dragable")) // 物体需添加 Dragable 标签
{
return true;
}
}
}
return false;
}
// 处理点击事件
private void HandleClick()
{
if(DialogController.Instance.IsTalking)
{
return;
}
// PointerEventData pointerData = new PointerEventData(EventSystem.current) { position = Input.mousePosition };
// var results = new List<RaycastResult>();
// EventSystem.current.RaycastAll(pointerData, results);
// foreach (var result in results)
// {
// Canvas hitCanvas = result.gameObject.GetComponentInParent<Canvas>();
// if (hitCanvas != null)
// {
// // If the Canvas's sortingOrder is higher than the reference sortingOrder, ignore it
// if (hitCanvas.renderMode==RenderMode.ScreenSpaceOverlay)
// {
// Debug.Log("Raycast hit an object with a higher sortingOrder that should block the raycast");
// // You can add additional logic here to block interaction or trigger events
// //return false; // Stop further raycasting if it should be blocked
// }
// else
// {
// if (result.gameObject.CompareTag("DialogueObject"))
// {
// if(result.gameObject.transform.GetChild(0).GetComponent<Socket>().IsAvailable)
// {
// string dialogueNode =result.gameObject.name+"Dialogue"; // 假设物体名是对话节点
// DialogController.Instance.StartDialogNode(dialogueNode);
// return;
// }
// }
// }
// }
// }
}
public void StartDraggingPlug()
{
isDraggingPlug = true;
}
public void StopDraggingPlug()
{
isDraggingPlug = false;
ResetCursor();
}
public void StartUsingTool()
{
isUsingTool = true;
}
public void StopUsingTool()
{
isUsingTool = false;
ResetCursor();
}
public void ClueBoardIn()
{
isInClueBoard = true;
}
public void ClueBoardOut()
{
isInClueBoard = false;
ResetCursor();
}
public void SetCursor(Sprite cursorSprite, bool flip = false)
{
if (cursorSprite != null)
{
cursorImage.sprite = cursorSprite;
cursorImage.enabled = true;
cursorImage.rectTransform.localScale = new Vector3(flip ? -1 : 1, 1, 1);
// 如果是默认指针图标,应用偏移量
if (cursorSprite == defaultCursorSprite)
{
cursorImage.transform.position = Input.mousePosition + defaultCursorOffset;
}
else
{
// 非默认图标时直接跟随鼠标位置
cursorImage.transform.position = Input.mousePosition;
}
}
}
public void ResetCursor()
{
Cursor.visible = false;
cursorImage.sprite = defaultCursorSprite;
cursorImage.rectTransform.localScale = Vector3.one; // 恢复为不翻转的默认状态
// 如果是默认指针图标,应用偏移量
if (cursorImage.sprite == defaultCursorSprite)
{
cursorImage.transform.position = Input.mousePosition + defaultCursorOffset;
}
else
{
// 非默认图标时直接跟随鼠标位置
cursorImage.transform.position = Input.mousePosition;
}
}
}