188 lines
5.5 KiB
C#
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();
|
|
}
|
|
}
|
|
|
|
}
|