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 toolPrefabs; private Dictionary toolPrefabDictionary; public Canvas toolCanvas; private bool isBoxShow = false; private void Start() { toolBox.SetActive(false); // 初始隐藏工具盒 toolPrefabDictionary = new Dictionary(); foreach (GameObject toolPrefab in toolPrefabs) { Tool tool = toolPrefab.GetComponent(); 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(); toolBox.SetActive(true); isBoxShow = true; // 工具盒上移动画 toolBox.transform.DOMoveY(-4f, 0.5f).SetEase(Ease.OutBounce); // 添加点击事件以启动工具跟随鼠标 AddToolClickEvent(toolInstance); currentTool.GetComponent().blocksRaycasts=true; } else { Debug.LogWarning($"Tool '{toolName}' not found in tool manager."); } } private void AddToolClickEvent(GameObject toolInstance) { EventTrigger eventTrigger = toolInstance.GetComponent(); if (eventTrigger == null) { eventTrigger = toolInstance.AddComponent(); } // 清除之前可能存在的点击事件,避免重复添加 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().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(); if (toolBoxTrigger == null) { toolBoxTrigger = toolBox.AddComponent(); } // 清除之前的事件,确保归还工具的事件仅触发一次 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(); 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(); } } }