From 5fa324de6c2a7cbc7831ec9fdc30138c386d9632 Mon Sep 17 00:00:00 2001 From: Ding Yuntian <1491671119@qq.com> Date: Sun, 2 Aug 2026 21:45:36 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=88=87=E5=89=B2=E9=94=AF=E5=AD=90?= =?UTF-8?q?=E6=8E=A5=E5=85=A5EventTrigger?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Prefabs/Cut/CutWheel.prefab | 58 +++++++++++ Assets/Prefabs/Cut/托盘 (1).prefab | 45 +-------- .../FixSystemNew/BodyModule/CuttingManager.cs | 32 +++---- .../FixSystemNew/BodyModule/GearFollower.cs | 96 ++++++++++++++++++- 4 files changed, 167 insertions(+), 64 deletions(-) diff --git a/Assets/Prefabs/Cut/CutWheel.prefab b/Assets/Prefabs/Cut/CutWheel.prefab index 42fe5afe3..f7b728735 100644 --- a/Assets/Prefabs/Cut/CutWheel.prefab +++ b/Assets/Prefabs/Cut/CutWheel.prefab @@ -338,6 +338,8 @@ GameObject: - component: {fileID: 3356305640573621166} - component: {fileID: 593249056707730865} - component: {fileID: 699543252252589786} + - component: {fileID: 780000000000000001} + - component: {fileID: 780000000000000002} m_Layer: 0 m_Name: CutWheel m_TagString: Untagged @@ -415,6 +417,62 @@ SpriteRenderer: m_WasSpriteAssigned: 1 m_MaskInteraction: 0 m_SpriteSortPoint: 0 +--- !u!58 &780000000000000001 +CircleCollider2D: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6388638343240283516} + m_Enabled: 1 + m_Density: 1 + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_ForceSendLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_ForceReceiveLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_ContactCaptureLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_CallbackLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_IsTrigger: 1 + m_UsedByEffector: 0 + m_UsedByComposite: 0 + m_Offset: {x: 0.000000059604645, y: 0} + serializedVersion: 2 + m_Radius: 0.45813966 +--- !u!114 &780000000000000002 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6388638343240283516} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0c4fbab01ad40c2449c849cd2a8c620f, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Delegates: + - eventID: 2 + callback: + m_PersistentCalls: + m_Calls: [] + - eventID: 3 + callback: + m_PersistentCalls: + m_Calls: [] --- !u!114 &699543252252589786 MonoBehaviour: m_ObjectHideFlags: 0 diff --git a/Assets/Prefabs/Cut/托盘 (1).prefab b/Assets/Prefabs/Cut/托盘 (1).prefab index 9dbfd0b41..54780c459 100644 --- a/Assets/Prefabs/Cut/托盘 (1).prefab +++ b/Assets/Prefabs/Cut/托盘 (1).prefab @@ -152,51 +152,8 @@ PrefabInstance: m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] - m_AddedComponents: - - targetCorrespondingSourceObject: {fileID: 6388638343240283516, guid: 316c061f3e3c69c439772d3b781e2c74, type: 3} - insertIndex: -1 - addedObject: {fileID: 5066059310206209015} + m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 316c061f3e3c69c439772d3b781e2c74, type: 3} ---- !u!1 &2263722661675396300 stripped -GameObject: - m_CorrespondingSourceObject: {fileID: 6388638343240283516, guid: 316c061f3e3c69c439772d3b781e2c74, type: 3} - m_PrefabInstance: {fileID: 5171077393211660720} - m_PrefabAsset: {fileID: 0} ---- !u!58 &5066059310206209015 -CircleCollider2D: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2263722661675396300} - m_Enabled: 1 - m_Density: 1 - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_ForceSendLayers: - serializedVersion: 2 - m_Bits: 4294967295 - m_ForceReceiveLayers: - serializedVersion: 2 - m_Bits: 4294967295 - m_ContactCaptureLayers: - serializedVersion: 2 - m_Bits: 4294967295 - m_CallbackLayers: - serializedVersion: 2 - m_Bits: 4294967295 - m_IsTrigger: 1 - m_UsedByEffector: 0 - m_UsedByComposite: 0 - m_Offset: {x: 0.000000059604645, y: 0} - serializedVersion: 2 - m_Radius: 0.45813966 --- !u!4 &7588747131920894494 stripped Transform: m_CorrespondingSourceObject: {fileID: 3356305640573621166, guid: 316c061f3e3c69c439772d3b781e2c74, type: 3} diff --git a/Assets/Scripts/FixSystemNew/BodyModule/CuttingManager.cs b/Assets/Scripts/FixSystemNew/BodyModule/CuttingManager.cs index 1bced0ac0..637a163be 100644 --- a/Assets/Scripts/FixSystemNew/BodyModule/CuttingManager.cs +++ b/Assets/Scripts/FixSystemNew/BodyModule/CuttingManager.cs @@ -34,26 +34,26 @@ namespace AibisDream private void Update() { - if (isCuttingMode && !isGearActive && gearFollower != null) - { - // 检测点击 - if (Input.GetMouseButtonDown(0)) - { - Ray ray = _mainCamera.ScreenPointToRay(Input.mousePosition); - RaycastHit2D hit = Physics2D.Raycast(ray.origin, ray.direction); - - if (hit.collider != null && hit.collider.gameObject.GetComponent() != null) - { - gearFollower=hit.collider.gameObject.GetComponent(); - ActivateGear(); - } - } - } - else if (isCuttingMode && isGearActive && gearFollower != null) + if (isCuttingMode && isGearActive && gearFollower != null) { gearFollower.GearUpdate(); } } + + public bool TryActivateGear(GearFollower source) + { + if (!isCuttingMode || source == null || source != gearFollower) + { + return false; + } + + if (!isGearActive) + { + ActivateGear(); + } + + return isGearActive; + } public void ClearCutLine() { if (gearFollower != null) diff --git a/Assets/Scripts/FixSystemNew/BodyModule/GearFollower.cs b/Assets/Scripts/FixSystemNew/BodyModule/GearFollower.cs index cc008b5bf..78cbe4925 100644 --- a/Assets/Scripts/FixSystemNew/BodyModule/GearFollower.cs +++ b/Assets/Scripts/FixSystemNew/BodyModule/GearFollower.cs @@ -1,14 +1,18 @@ using System.Collections.Generic; +using System.Linq; using UnityEngine; using UnityEngine.Rendering.Universal; using UnityEngine.VFX; +using UnityEngine.EventSystems; using DG.Tweening; using AibisDream.FixSystem; using AibisDream; // 添加OpenSystem的命名空间 +using AibisDream.Framework; using System.Collections; using AibisDream.Kit; -public class GearFollower : MonoBehaviour +[RequireComponent(typeof(EventTriggerEx))] +public class GearFollower : MonoBehaviour, IInteraction { [Header("参数")] public SpriteRenderer targetSpriteRenderer; @@ -95,6 +99,73 @@ public class GearFollower : MonoBehaviour private Vector3 targetPosition = Vector3.zero; private bool isInTractionMode = false; private bool isDrillSfxPlaying = false; // 标记音效是否已播放 + private EventTriggerEx eventTrigger; + private bool isPointerHeld; + + private void Awake() + { + eventTrigger = GetComponent(); + EnsureEventTriggerEntries(); + eventTrigger.Register(EventTriggerType.PointerDown, OnPointerDown); + eventTrigger.Register(EventTriggerType.PointerUp, OnPointerUp); + } + + private void EnsureEventTriggerEntries() + { + if (eventTrigger == null) return; + + var needed = new[] { EventTriggerType.PointerDown, EventTriggerType.PointerUp }; + foreach (var triggerType in needed) + { + if (eventTrigger.triggers.Any(entry => entry.eventID == triggerType)) continue; + eventTrigger.triggers.Add(new EventTrigger.Entry { eventID = triggerType }); + } + } + + private void OnPointerDown(BaseEventData eventData) + { + if (eventData is not PointerEventData { button: PointerEventData.InputButton.Left }) return; + + var eventSystem = EventSystemEx.Instance; + if (!IsAvailable || eventSystem == null || eventSystem.isLocked) + { + eventSystem?.UnRegister(this); + return; + } + + var cuttingManager = FixSystemCenter.SystemDic.Get(); + if (cuttingManager == null || !cuttingManager.TryActivateGear(this)) + { + eventSystem.UnRegister(this); + return; + } + + isPointerHeld = true; + } + + private void OnPointerUp(BaseEventData eventData) + { + if (eventData is not PointerEventData { button: PointerEventData.InputButton.Left }) return; + + isPointerHeld = false; + EndCutting(); + } + + private bool IsInteractionLocked() + { + return EventSystemEx.Instance == null || EventSystemEx.Instance.isLocked; + } + + private void CancelPointerInteraction() + { + isPointerHeld = false; + if (isCutting) + { + EndCutting(); + } + + EventSystemEx.Instance?.UnRegister(this); + } public void Init(SpriteRenderer targetSpriteRenderer) { @@ -146,13 +217,19 @@ public class GearFollower : MonoBehaviour public void GearUpdate() { + if (IsInteractionLocked()) + { + CancelPointerInteraction(); + return; + } + // 获取鼠标在屏幕上的位置 Vector3 mouseScreenPos = Input.mousePosition; // 将屏幕坐标转换为世界坐标 Vector3 mouseWorldPos = mainCamera.ScreenToWorldPoint(new Vector3(mouseScreenPos.x, mouseScreenPos.y, -mainCamera.transform.position.z)); mouseWorldPos.z = 0; // 确保z坐标为0 - if (Input.GetMouseButton(0)) + if (isPointerHeld) { transform.Rotate(Vector3.forward, -360f * Time.deltaTime); } @@ -391,12 +468,12 @@ public class GearFollower : MonoBehaviour EndCutting(); return; } - if (!Input.GetMouseButton(0)) + if (!isPointerHeld) { EndCutting(); return; } - if (!isCutting && Input.GetMouseButton(0)) + if (!isCutting && isPointerHeld) { StartCutting(); } @@ -835,6 +912,13 @@ public class GearFollower : MonoBehaviour private void OnDestroy() { + if (eventTrigger != null) + { + eventTrigger.UnRegister(EventTriggerType.PointerDown, OnPointerDown); + eventTrigger.UnRegister(EventTriggerType.PointerUp, OnPointerUp); + } + EventSystemEx.Instance?.UnRegister(this); + // 清理DOTween序列 if (cutCompleteSequence != null) { @@ -909,6 +993,10 @@ public class GearFollower : MonoBehaviour } } + public bool IsActive => !isCutComplete; + public bool IsAvailable => !isCutComplete; + public GameObject GetGameObject() => gameObject; + // 停止音效的辅助方法 private void StopDrillSfxIfPlaying() {