Files
aibis-dream/Assets/Scripts/FixSystem/Tools/ToolManager.cs
T

188 lines
5.5 KiB
C#

using System.Collections.Generic;
using DG.Tweening;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class ToolManager : MonoBehaviour
{
public GameObject toolBox; // 工具盒的UI对象
private Tool currentTool;
public List<GameObject> toolPrefabs;
private Dictionary<string, GameObject> toolPrefabDictionary;
public Canvas toolCanvas;
private bool isBoxShow = false;
private void Start()
{
toolBox.SetActive(false); // 初始隐藏工具盒
toolPrefabDictionary = new Dictionary<string, GameObject>();
foreach (GameObject toolPrefab in toolPrefabs)
{
Tool tool = toolPrefab.GetComponent<Tool>();
if (tool != null)
{
toolPrefabDictionary[tool.gameObject.name] = toolPrefab;
}
}
}
public void EnterFixMode(string moduleName)
{
Debug.Log($"Entering fix mode for module: {moduleName}");
if (currentTool != null && currentTool is Screwdriver screwdriver)
{
screwdriver.StartFixMode(); // 调用螺丝刀进入维修状态
}
}
public void ShowTool(string toolName)
{
if (toolPrefabDictionary.TryGetValue(toolName, out GameObject toolPrefab))
{
// 实例化工具
GameObject toolInstance = Instantiate(toolPrefab, toolBox.transform);
currentTool = toolInstance.GetComponent<Tool>();
toolBox.SetActive(true);
isBoxShow = true;
// 工具盒上移动画
toolBox.transform.DOMoveY(-4f, 0.5f).SetEase(Ease.OutBounce);
// 添加点击事件以启动工具跟随鼠标
AddToolClickEvent(toolInstance);
currentTool.GetComponent<CanvasGroup>().blocksRaycasts=true;
}
else
{
Debug.LogWarning($"Tool '{toolName}' not found in tool manager.");
}
}
private void AddToolClickEvent(GameObject toolInstance)
{
EventTrigger eventTrigger = toolInstance.GetComponent<EventTrigger>();
if (eventTrigger == null)
{
eventTrigger = toolInstance.AddComponent<EventTrigger>();
}
// 清除之前可能存在的点击事件,避免重复添加
eventTrigger.triggers.Clear();
EventTrigger.Entry clickEntry = new EventTrigger.Entry
{
eventID = EventTriggerType.PointerClick
};
// 点击事件:当点击工具时,使其开始跟随鼠标
clickEntry.callback.AddListener((data) =>
{
currentTool.transform.SetParent(toolCanvas.transform);
currentTool.StartFollowMouse();
currentTool.GetComponent<CanvasGroup>().blocksRaycasts=false;
//RemoveToolClickEvent(eventTrigger); // 移除点击事件,防止再触发
HideTool();
});
eventTrigger.triggers.Add(clickEntry);
}
// 移除工具的点击事
// 显示工具盒并添加归还工具的点击事件
public void ShowToolBoxAfterTask()
{
toolBox.SetActive(true);
isBoxShow = true;
toolBox.transform.DOMoveY(-4f, 0.5f).SetEase(Ease.OutBounce);
// 为工具盒添加一次性点击事件
AddToolBoxReturnEvent();
}
private void AddToolBoxReturnEvent()
{
EventTrigger toolBoxTrigger = toolBox.GetComponent<EventTrigger>();
if (toolBoxTrigger == null)
{
toolBoxTrigger = toolBox.AddComponent<EventTrigger>();
}
// 清除之前的事件,确保归还工具的事件仅触发一次
toolBoxTrigger.triggers.Clear();
EventTrigger.Entry boxClickEntry = new EventTrigger.Entry
{
eventID = EventTriggerType.PointerClick
};
boxClickEntry.callback.AddListener((data) =>
{
ReturnTool(); // 点击工具盒时归还工具
});
toolBoxTrigger.triggers.Add(boxClickEntry);
}
public void HideTool()
{
toolBox.transform.DOMoveY(-6f, 0.5f).SetEase(Ease.InBack).OnComplete(() =>
{
toolBox.SetActive(false);
isBoxShow = false;
// 在工具盒的子物体中查找并删除工具对象
foreach (Transform child in toolBox.transform)
{
Tool tool = child.GetComponent<Tool>();
if (tool != null)
{
Destroy(child.gameObject); // 删除工具对象
currentTool = null; // 清空当前工具的引用
}
}
});
}
private void Update()
{
if (currentTool != null && currentTool.IsFollowingMouse)
{
Vector3 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
currentTool.transform.position = new Vector3(mousePos.x, mousePos.y, 0);
}
if(Input.GetKeyDown(KeyCode.O))
{
ShowTool("ScrewDriver");
}
if(Input.GetKeyDown(KeyCode.P))
{
ShowToolBoxAfterTask();
}
}
public void ReturnTool()
{
if (currentTool != null)
{
Debug.Log("Returning tool and stopping follow mouse.");
// 停止工具跟随鼠标
currentTool.StopFollowMouse();
// 将工具放回工具盒
currentTool.transform.SetParent(toolBox.transform);
currentTool.transform.localPosition = Vector3.zero;
// 重新添加点击事件,以便可以再次点击
//AddToolClickEvent(currentTool.gameObject);
currentTool = null;
HideTool();
}
}
}