From 4cebccdc13b96de1b01514bc0c3abae1dc9f6219 Mon Sep 17 00:00:00 2001 From: lujiajian <204551278@qq.com> Date: Mon, 1 Dec 2025 17:37:12 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AE=80=E5=8C=96=E8=BF=9E=E7=BA=BF=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Scenes/xianchang.unity | 177 ++-- Assets/Scripts/Line/LineManager.cs | 93 +- Assets/Scripts/Line/LineShowModel.cs | 862 ++++++++++++++++++ Assets/Scripts/Line/LineShowModel.cs.meta | 11 + .../Line/LineShowModelCylinderWireData.cs | 13 + .../LineShowModelCylinderWireData.cs.meta | 11 + 6 files changed, 1059 insertions(+), 108 deletions(-) create mode 100644 Assets/Scripts/Line/LineShowModel.cs create mode 100644 Assets/Scripts/Line/LineShowModel.cs.meta create mode 100644 Assets/Scripts/Line/LineShowModelCylinderWireData.cs create mode 100644 Assets/Scripts/Line/LineShowModelCylinderWireData.cs.meta diff --git a/Assets/Scenes/xianchang.unity b/Assets/Scenes/xianchang.unity index ad90fc7..157f56a 100644 --- a/Assets/Scenes/xianchang.unity +++ b/Assets/Scenes/xianchang.unity @@ -170,7 +170,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 6282401d280c18d488e073bf54edbc11, type: 3} m_Name: m_EditorClassIdentifier: - interfaceType: 23 + interfaceType: 27 --- !u!65 &31259008 BoxCollider: m_ObjectHideFlags: 0 @@ -605,7 +605,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 6282401d280c18d488e073bf54edbc11, type: 3} m_Name: m_EditorClassIdentifier: - interfaceType: 32 + interfaceType: 36 --- !u!65 &127228039 BoxCollider: m_ObjectHideFlags: 0 @@ -682,6 +682,7 @@ GameObject: - component: {fileID: 140014611} - component: {fileID: 140014614} - component: {fileID: 140014615} + - component: {fileID: 140014616} m_Layer: 0 m_Name: Manager m_TagString: Untagged @@ -705,6 +706,16 @@ MonoBehaviour: point2: {fileID: 0} Tips: {fileID: 1843818177} TipTexts: {fileID: 328649576} + Models: + - {fileID: 430381704085068992} + - {fileID: 4300108389634983148} + - {fileID: 8667564567584011752} + - {fileID: 1844046986138721254} + - {fileID: 7006734113389019125} + - {fileID: 385327144811188757} + - {fileID: 8446424303547330454} + - {fileID: 601978073058571682} + - {fileID: 229573283299024619} --- !u!114 &140014612 MonoBehaviour: m_ObjectHideFlags: 0 @@ -712,7 +723,7 @@ MonoBehaviour: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 140014610} - m_Enabled: 1 + m_Enabled: 0 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 7bdb490d0652e874091b855aabfa9122, type: 3} m_Name: @@ -826,7 +837,7 @@ MonoBehaviour: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 140014610} - m_Enabled: 1 + m_Enabled: 0 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 9de98abaf88316a4da82930a8eb6668e, type: 3} m_Name: @@ -848,6 +859,38 @@ MonoBehaviour: manualSaveKey: 286 manualLoadKey: 290 debugInfoKey: 292 +--- !u!114 &140014616 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 140014610} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 239a36da09e63484eb88aed17b731dea, type: 3} + m_Name: + m_EditorClassIdentifier: + wireMaterial: {fileID: 2100000, guid: 60de1ea540cb9d0488799f6838e98c54, type: 2} + wireColor: {r: 1, g: 0, b: 0, a: 1} + wireWidth: 0.002 + enableSnapping: 1 + snapDistance: 1 + snapLayers: + serializedVersion: 2 + m_Bits: 64 + snapToColliderCenter: 1 + snapHighlightColor: {r: 0, g: 1, b: 1, a: 1} + useCylinderWire: 1 + cylinderWireMaterial: {fileID: 2100000, guid: 60de1ea540cb9d0488799f6838e98c54, type: 2} + cylinderWireDiameter: 0.002 + cylinderSegments: 8 + previewMaterial: {fileID: 0} + previewColor: {r: 1, g: 0, b: 0, a: 0.5} + previewWireDiameter: 0.002 + deleteKey: 325 + deleteDetectionRadius: 0.5 + currentState: 0 --- !u!1 &154209944 GameObject: m_ObjectHideFlags: 0 @@ -895,7 +938,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 6282401d280c18d488e073bf54edbc11, type: 3} m_Name: m_EditorClassIdentifier: - interfaceType: 27 + interfaceType: 32 --- !u!65 &154209947 BoxCollider: m_ObjectHideFlags: 0 @@ -1068,7 +1111,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 6282401d280c18d488e073bf54edbc11, type: 3} m_Name: m_EditorClassIdentifier: - interfaceType: 34 + interfaceType: 38 --- !u!65 &195981660 BoxCollider: m_ObjectHideFlags: 0 @@ -1167,9 +1210,9 @@ RectTransform: m_Father: {fileID: 1359383648} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 101.92045, y: -147.25677} m_SizeDelta: {x: 160, y: 30} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &211242735 @@ -1313,7 +1356,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 6282401d280c18d488e073bf54edbc11, type: 3} m_Name: m_EditorClassIdentifier: - interfaceType: 14 + interfaceType: 17 --- !u!65 &239612375 BoxCollider: m_ObjectHideFlags: 0 @@ -1458,7 +1501,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 6282401d280c18d488e073bf54edbc11, type: 3} m_Name: m_EditorClassIdentifier: - interfaceType: 16 + interfaceType: 20 --- !u!65 &309747188 BoxCollider: m_ObjectHideFlags: 0 @@ -1966,7 +2009,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 6282401d280c18d488e073bf54edbc11, type: 3} m_Name: m_EditorClassIdentifier: - interfaceType: 19 + interfaceType: 23 --- !u!65 &492161853 BoxCollider: m_ObjectHideFlags: 0 @@ -2077,7 +2120,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 6282401d280c18d488e073bf54edbc11, type: 3} m_Name: m_EditorClassIdentifier: - interfaceType: 19 + interfaceType: 22 --- !u!65 &503603841 BoxCollider: m_ObjectHideFlags: 0 @@ -2299,7 +2342,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 6282401d280c18d488e073bf54edbc11, type: 3} m_Name: m_EditorClassIdentifier: - interfaceType: 34 + interfaceType: 39 --- !u!65 &517604014 BoxCollider: m_ObjectHideFlags: 0 @@ -2487,7 +2530,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 6282401d280c18d488e073bf54edbc11, type: 3} m_Name: m_EditorClassIdentifier: - interfaceType: 21 + interfaceType: 24 --- !u!65 &561287913 BoxCollider: m_ObjectHideFlags: 0 @@ -3060,9 +3103,9 @@ RectTransform: m_Father: {fileID: 1359383648} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 101.92045, y: -15} m_SizeDelta: {x: 160, y: 30} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &809263221 @@ -3300,7 +3343,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 6282401d280c18d488e073bf54edbc11, type: 3} m_Name: m_EditorClassIdentifier: - interfaceType: 42 + interfaceType: 43 --- !u!1 &853107033 stripped GameObject: m_CorrespondingSourceObject: {fileID: -5266785677919700964, guid: b11e3115ad4164947957f5e35d5527cf, type: 3} @@ -3366,7 +3409,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 6282401d280c18d488e073bf54edbc11, type: 3} m_Name: m_EditorClassIdentifier: - interfaceType: 27 + interfaceType: 30 --- !u!65 &871829734 BoxCollider: m_ObjectHideFlags: 0 @@ -3588,7 +3631,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 6282401d280c18d488e073bf54edbc11, type: 3} m_Name: m_EditorClassIdentifier: - interfaceType: 23 + interfaceType: 28 --- !u!65 &925892943 BoxCollider: m_ObjectHideFlags: 0 @@ -3699,7 +3742,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 6282401d280c18d488e073bf54edbc11, type: 3} m_Name: m_EditorClassIdentifier: - interfaceType: 35 + interfaceType: 40 --- !u!65 &1021607069 BoxCollider: m_ObjectHideFlags: 0 @@ -3810,7 +3853,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 6282401d280c18d488e073bf54edbc11, type: 3} m_Name: m_EditorClassIdentifier: - interfaceType: 15 + interfaceType: 18 --- !u!65 &1040294132 BoxCollider: m_ObjectHideFlags: 0 @@ -3909,9 +3952,9 @@ RectTransform: m_Father: {fileID: 1359383648} m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 101.92045, y: -279.51355} m_SizeDelta: {x: 160, y: 30} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1042182378 @@ -4067,6 +4110,10 @@ PrefabInstance: propertyPath: m_Layer value: 6 objectReference: {fileID: 0} + - target: {fileID: -7848099655778327179, guid: e908463f3f6b7e54cb2ffaa2e941c53e, type: 3} + propertyPath: m_Layer + value: 6 + objectReference: {fileID: 0} - target: {fileID: -6880166670635558359, guid: e908463f3f6b7e54cb2ffaa2e941c53e, type: 3} propertyPath: m_Layer value: 6 @@ -4075,6 +4122,10 @@ PrefabInstance: propertyPath: m_IsActive value: 0 objectReference: {fileID: 0} + - target: {fileID: -3176553419678292264, guid: e908463f3f6b7e54cb2ffaa2e941c53e, type: 3} + propertyPath: m_Layer + value: 6 + objectReference: {fileID: 0} - target: {fileID: -2578546517966586142, guid: e908463f3f6b7e54cb2ffaa2e941c53e, type: 3} propertyPath: m_Layer value: 6 @@ -4099,6 +4150,10 @@ PrefabInstance: propertyPath: m_Layer value: 6 objectReference: {fileID: 0} + - target: {fileID: 8304324904651862010, guid: e908463f3f6b7e54cb2ffaa2e941c53e, type: 3} + propertyPath: m_Layer + value: 6 + objectReference: {fileID: 0} m_RemovedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: e908463f3f6b7e54cb2ffaa2e941c53e, type: 3} --- !u!4 &1045066282 stripped @@ -4123,7 +4178,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 6282401d280c18d488e073bf54edbc11, type: 3} m_Name: m_EditorClassIdentifier: - interfaceType: 41 + interfaceType: 42 --- !u!65 &1045066285 BoxCollider: m_ObjectHideFlags: 0 @@ -4154,7 +4209,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 6282401d280c18d488e073bf54edbc11, type: 3} m_Name: m_EditorClassIdentifier: - interfaceType: 43 + interfaceType: 44 --- !u!65 &1075926906 BoxCollider: m_ObjectHideFlags: 0 @@ -4215,7 +4270,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 6282401d280c18d488e073bf54edbc11, type: 3} m_Name: m_EditorClassIdentifier: - interfaceType: 18 + interfaceType: 21 --- !u!65 &1172298546 BoxCollider: m_ObjectHideFlags: 0 @@ -4697,9 +4752,9 @@ RectTransform: m_Father: {fileID: 1359383648} m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 101.92045, y: -411.77032} m_SizeDelta: {x: 160, y: 30} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1307015857 @@ -5028,7 +5083,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!224 &1359383648 RectTransform: m_ObjectHideFlags: 0 @@ -5195,7 +5250,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 6282401d280c18d488e073bf54edbc11, type: 3} m_Name: m_EditorClassIdentifier: - interfaceType: 33 + interfaceType: 37 --- !u!65 &1416330996 BoxCollider: m_ObjectHideFlags: 0 @@ -5468,7 +5523,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 6282401d280c18d488e073bf54edbc11, type: 3} m_Name: m_EditorClassIdentifier: - interfaceType: 25 + interfaceType: 26 --- !u!65 &1515177978 BoxCollider: m_ObjectHideFlags: 0 @@ -5832,7 +5887,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 6282401d280c18d488e073bf54edbc11, type: 3} m_Name: m_EditorClassIdentifier: - interfaceType: 28 + interfaceType: 33 --- !u!65 &1735319914 BoxCollider: m_ObjectHideFlags: 0 @@ -6054,7 +6109,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 6282401d280c18d488e073bf54edbc11, type: 3} m_Name: m_EditorClassIdentifier: - interfaceType: 25 + interfaceType: 29 --- !u!65 &1774313875 BoxCollider: m_ObjectHideFlags: 0 @@ -6240,7 +6295,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 6282401d280c18d488e073bf54edbc11, type: 3} m_Name: m_EditorClassIdentifier: - interfaceType: 29 + interfaceType: 34 --- !u!65 &1818029208 BoxCollider: m_ObjectHideFlags: 0 @@ -6699,7 +6754,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 6282401d280c18d488e073bf54edbc11, type: 3} m_Name: m_EditorClassIdentifier: - interfaceType: 26 + interfaceType: 31 --- !u!65 &2033294238 BoxCollider: m_ObjectHideFlags: 0 @@ -7041,7 +7096,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 6282401d280c18d488e073bf54edbc11, type: 3} m_Name: m_EditorClassIdentifier: - interfaceType: 16 + interfaceType: 19 --- !u!65 &2065793936 BoxCollider: m_ObjectHideFlags: 0 @@ -7152,7 +7207,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 6282401d280c18d488e073bf54edbc11, type: 3} m_Name: m_EditorClassIdentifier: - interfaceType: 31 + interfaceType: 35 --- !u!65 &2070614957 BoxCollider: m_ObjectHideFlags: 0 @@ -7405,7 +7460,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 6282401d280c18d488e073bf54edbc11, type: 3} m_Name: m_EditorClassIdentifier: - interfaceType: 36 + interfaceType: 41 --- !u!65 &2098517110 BoxCollider: m_ObjectHideFlags: 0 @@ -7757,12 +7812,12 @@ GameObject: m_Component: - component: {fileID: 3150416692739349881} m_Layer: 0 - m_Name: xian9 + m_Name: "AD2\u8FDEIN1" m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!23 &378114153369630115 MeshRenderer: m_ObjectHideFlags: 0 @@ -7815,12 +7870,12 @@ GameObject: m_Component: - component: {fileID: 4271719479381916268} m_Layer: 0 - m_Name: xian6 + m_Name: "OUT1\u8FDEIN4" m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!1 &430381704085068992 GameObject: m_ObjectHideFlags: 0 @@ -7831,12 +7886,12 @@ GameObject: m_Component: - component: {fileID: 5995273574770118330} m_Layer: 0 - m_Name: xian1 + m_Name: "\u8D1F12V\u8FDE\u8D1F12V" m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!4 &435944714890923873 stripped Transform: m_CorrespondingSourceObject: {fileID: 7256217081674647743, guid: d078ca4e433c6f045bccc0dd9acb4fd8, type: 3} @@ -7907,7 +7962,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 919132148175229397} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: -13.07} + m_LocalPosition: {x: -1.451, y: 0, z: 0.003} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: @@ -7944,12 +7999,12 @@ GameObject: m_Component: - component: {fileID: 8818355676258105931} m_Layer: 0 - m_Name: xian8 + m_Name: "OUT\u8FDEIN1" m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!4 &698346336316105428 Transform: m_ObjectHideFlags: 0 @@ -8341,12 +8396,12 @@ GameObject: m_Component: - component: {fileID: 698346336316105428} m_Layer: 0 - m_Name: xian4 + m_Name: "\u96F6V\u8FDEIII" m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!23 &1889257504621397117 MeshRenderer: m_ObjectHideFlags: 0 @@ -9095,12 +9150,12 @@ GameObject: m_Component: - component: {fileID: 2242849901158410428} m_Layer: 0 - m_Name: xian2 + m_Name: "\u6B6312V\u8FDE\u6B6312V" m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!33 &4385593541941988605 MeshFilter: m_ObjectHideFlags: 0 @@ -9709,12 +9764,12 @@ GameObject: m_Component: - component: {fileID: 2446499898162477886} m_Layer: 0 - m_Name: xian5 + m_Name: "OUT1\u8FDEIN2_200K" m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!1001 &7115559408580331486 PrefabInstance: m_ObjectHideFlags: 0 @@ -10115,12 +10170,12 @@ GameObject: m_Component: - component: {fileID: 1947694940705415576} m_Layer: 0 - m_Name: xian7 + m_Name: "AD1\u8FDEOUT2" m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!23 &8447598666252558499 MeshRenderer: m_ObjectHideFlags: 0 @@ -10232,12 +10287,12 @@ GameObject: m_Component: - component: {fileID: 7131730346368750079} m_Layer: 0 - m_Name: xian3 + m_Name: "\u96F6V\u8FDEGND" m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!1 &8741073888561617728 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/Scripts/Line/LineManager.cs b/Assets/Scripts/Line/LineManager.cs index 09dd613..2ab30c5 100644 --- a/Assets/Scripts/Line/LineManager.cs +++ b/Assets/Scripts/Line/LineManager.cs @@ -11,6 +11,7 @@ public class LineManager : MonoBehaviour public Transform point2; public GameObject Tips; public TextMeshProUGUI TipTexts; + public List Models = new List(); private void Awake() { instance = this; @@ -47,12 +48,12 @@ public class LineManager : MonoBehaviour } if (point1 != null && point2 != null) { - StartCoroutine(Checkconnection(point1, point2)); + //StartCoroutine(Checkconnection(point1, point2)); } } - IEnumerator Checkconnection(Transform transform, Transform transform2) + public IEnumerator Checkconnection(Transform transform, Transform transform2) { LineConnect line = transform.GetComponent(); @@ -76,9 +77,7 @@ public class LineManager : MonoBehaviour line2.interfaceType == InterfaceType.负12V && line1.interfaceType != InterfaceType.负12V) { TipTexts.text = "连接错误,-12V应该与-12V相连!"; - //WireDrawingSystem.instance.currentState = WireDrawingSystem.DrawingState.Idle; - WireDrawingSystem.instance.HandleDelete(); - WireDrawingSystem.instance.ClearSnapPreview(); + LineShowModel.Instance.DeleteWiresByCollider(line1.gameObject); return false; } else if (line1.interfaceType == InterfaceType.正12V && line2.interfaceType != InterfaceType.正12V @@ -86,88 +85,88 @@ public class LineManager : MonoBehaviour ) { TipTexts.text = "连接错误,12V应该与12V相连!"; - //WireDrawingSystem.instance.currentState = WireDrawingSystem.DrawingState.Idle; - WireDrawingSystem.instance.HandleDelete(); - WireDrawingSystem.instance.ClearSnapPreview(); - return false; - } - else if (line1.interfaceType == InterfaceType.零V && line2.interfaceType != InterfaceType.GND - || line2.interfaceType == InterfaceType.GND && line1.interfaceType != InterfaceType.零V) - { - TipTexts.text = "连接错误,0V应该与GND相连!"; - // WireDrawingSystem.instance.currentState = WireDrawingSystem.DrawingState.Idle; - WireDrawingSystem.instance.HandleDelete(); - WireDrawingSystem.instance.ClearSnapPreview(); + LineShowModel.Instance.DeleteWiresByCollider(line1.gameObject); return false; } + //else if (line1.interfaceType == InterfaceType.零V && line2.interfaceType != InterfaceType.GND + // || line2.interfaceType == InterfaceType.GND && line1.interfaceType != InterfaceType.零V) + //{ + // TipTexts.text = "连接错误,0V应该与GND相连!"; + // // WireDrawingSystem.instance.currentState = WireDrawingSystem.DrawingState.Idle; + // //WireDrawingSystem.instance.HandleDelete(); + // //WireDrawingSystem.instance.ClearSnapPreview(); + // LineShowModel.Instance.DeleteWiresByCollider(line1.gameObject); + // return false; + //} else if (line1.interfaceType == InterfaceType.IN2_200K && line2.interfaceType != InterfaceType.OUT1 || line2.interfaceType == InterfaceType.IN2_200K && line1.interfaceType != InterfaceType.OUT1) { TipTexts.text = "连接错误,200K应该与OUT1相连!"; - //WireDrawingSystem.instance.currentState = WireDrawingSystem.DrawingState.Idle; - WireDrawingSystem.instance.HandleDelete(); - WireDrawingSystem.instance.ClearSnapPreview(); + LineShowModel.Instance.DeleteWiresByCollider(line1.gameObject); return false; } - else if (line1.interfaceType == InterfaceType.OUT1 && line2.interfaceType != InterfaceType.IN4 + else if (line1.interfaceType == InterfaceType.OUT1 && (line2.interfaceType != InterfaceType.IN4&& line2.interfaceType !=InterfaceType.IN2_200K) || line2.interfaceType == InterfaceType.OUT1 && line1.interfaceType != InterfaceType.IN4) { TipTexts.text = "连接错误,OUT1应该与IN4相连!"; - // WireDrawingSystem.instance.currentState = WireDrawingSystem.DrawingState.Idle; - WireDrawingSystem.instance.HandleDelete(); - WireDrawingSystem.instance.ClearSnapPreview(); + LineShowModel.Instance.DeleteWiresByCollider(line1.gameObject); return false; } else if (line1.interfaceType == InterfaceType.AD1 && line2.interfaceType != InterfaceType.OUT2 || line2.interfaceType == InterfaceType.AD1 && line1.interfaceType != InterfaceType.OUT2) { - TipTexts.text = "连接错误,200K应该与OUT1相连!"; - //WireDrawingSystem.instance.currentState = WireDrawingSystem.DrawingState.Idle; - WireDrawingSystem.instance.HandleDelete(); - WireDrawingSystem.instance.ClearSnapPreview(); + TipTexts.text = "连接错误,AD1应该与OUT2相连!"; + LineShowModel.Instance.DeleteWiresByCollider(line1.gameObject); return false; } - else if (line1.interfaceType == InterfaceType.零V && line2.interfaceType != InterfaceType.GND + else if ((line1.interfaceType == InterfaceType.零V && (line2.interfaceType != InterfaceType.GND&& line2.interfaceType != InterfaceType.III) || line2.interfaceType == InterfaceType.GND && line1.interfaceType != InterfaceType.零V) + ) { TipTexts.text = "连接错误,0V应该与GND相连!"; - //WireDrawingSystem.instance.currentState = WireDrawingSystem.DrawingState.Idle; - WireDrawingSystem.instance.HandleDelete(); - WireDrawingSystem.instance.ClearSnapPreview(); + LineShowModel.Instance.DeleteWiresByCollider(line1.gameObject); return false; } else if (line1.interfaceType == InterfaceType.OUT && line2.interfaceType != InterfaceType.IN1 || line2.interfaceType == InterfaceType.OUT && line1.interfaceType != InterfaceType.IN1) { TipTexts.text = "连接错误,OUT应该与IN1相连!"; - // WireDrawingSystem.instance.currentState = WireDrawingSystem.DrawingState.Idle; - WireDrawingSystem.instance.HandleDelete(); - WireDrawingSystem.instance.ClearSnapPreview(); + LineShowModel.Instance.DeleteWiresByCollider(line1.gameObject); return false; } else if (line1.interfaceType == InterfaceType.AD2 && line2.interfaceType != InterfaceType.IN1 || line2.interfaceType == InterfaceType.AD2 && line1.interfaceType != InterfaceType.IN1) { - TipTexts.text = "连接错误,OUT应该与IN1相连!"; - // WireDrawingSystem.instance.currentState = WireDrawingSystem.DrawingState.Idle; - WireDrawingSystem.instance.HandleDelete(); - WireDrawingSystem.instance.ClearSnapPreview(); + TipTexts.text = "连接错误,AD2应该与IN1相连!"; + LineShowModel.Instance.DeleteWiresByCollider(line1.gameObject); return false; } - else if ((line1.interfaceType != InterfaceType.AD2 || line1.interfaceType != InterfaceType.OUT || line1.interfaceType != InterfaceType.零V - || line1.interfaceType != InterfaceType.AD1 || line1.interfaceType != InterfaceType.OUT1 || line1.interfaceType != InterfaceType.IN2_200K || - line1.interfaceType != InterfaceType.正12V || line1.interfaceType != InterfaceType.负12V) && (line2.interfaceType != InterfaceType.AD2 || line2.interfaceType != InterfaceType.OUT || line2.interfaceType != InterfaceType.零V - || line2.interfaceType != InterfaceType.AD1 || line2.interfaceType != InterfaceType.OUT1 || line2.interfaceType != InterfaceType.IN2_200K || - line2.interfaceType != InterfaceType.正12V || line2.interfaceType != InterfaceType.负12V)) + else if ((line1.interfaceType != InterfaceType.AD2 && line1.interfaceType != InterfaceType.OUT && line1.interfaceType != InterfaceType.零V + && line1.interfaceType != InterfaceType.AD1 && line1.interfaceType != InterfaceType.OUT2 && line1.interfaceType != InterfaceType.OUT1 && line1.interfaceType != InterfaceType.IN2_200K && + line1.interfaceType != InterfaceType.正12V && line1.interfaceType != InterfaceType.负12V) && (line2.interfaceType != InterfaceType.AD2 && line2.interfaceType != InterfaceType.OUT && line2.interfaceType != InterfaceType.零V + && line2.interfaceType != InterfaceType.AD1 && line2.interfaceType != InterfaceType.OUT1 && line2.interfaceType != InterfaceType.IN2_200K && + line2.interfaceType != InterfaceType.正12V && line2.interfaceType != InterfaceType.负12V && line2.interfaceType != InterfaceType.OUT2)) { TipTexts.text = "连接错误,不需要此连线"; - // WireDrawingSystem.instance.currentState = WireDrawingSystem.DrawingState.Idle; - WireDrawingSystem.instance.HandleDelete(); - WireDrawingSystem.instance.ClearSnapPreview(); + // WireDrawingSystem.instance.currentState = WireDrawingSystem.DrawingState.Idle; + //WireDrawingSystem.instance.HandleDelete(); + //WireDrawingSystem.instance.ClearSnapPreview(); + LineShowModel.Instance.DeleteWiresByCollider(line1.gameObject); return false; } else { + for (int i = 0; i < Models.Count; i++) + { + string[] splitname = Models[i].name.Split('连'); + if (splitname[0] == line1.interfaceType.ToString() && splitname[1] == line2.interfaceType.ToString() || + splitname[0] == line2.interfaceType.ToString() && splitname[1] == line1.interfaceType.ToString()) + { + Models[i].SetActive(true); + } + + } + LineShowModel.Instance.DeleteWiresByCollider(line1.gameObject); return true; } } diff --git a/Assets/Scripts/Line/LineShowModel.cs b/Assets/Scripts/Line/LineShowModel.cs new file mode 100644 index 0000000..e5023fc --- /dev/null +++ b/Assets/Scripts/Line/LineShowModel.cs @@ -0,0 +1,862 @@ +using UnityEngine; +using System.Collections; +using System.Collections.Generic; + +public class LineShowModel : MonoBehaviour +{ + public enum DrawingState + { + Idle, // 空闲状态 + SelectingStart, // 选择起点 + SelectingEnd // 选择终点 + } + + [Header("连线设置")] + public Material wireMaterial; + public Color wireColor = Color.red; + public float wireWidth = 0.02f; + + [Header("吸附设置")] + public bool enableSnapping = true; // 启用吸附功能 + public float snapDistance = 1.0f; // 吸附距离 + public LayerMask snapLayers = -1; // 可吸附的层 + public bool snapToColliderCenter = true; // 吸附到碰撞体中心 + public Color snapHighlightColor = Color.cyan; // 吸附高亮颜色 + + [Header("圆柱体连线设置")] + public bool useCylinderWire = true; // 启用圆柱体连线 + public Material cylinderWireMaterial; + public float cylinderWireDiameter = 0.02f; + public int cylinderSegments = 8; // 圆柱体面数,影响性能 + + [Header("预览设置")] + public Material previewMaterial; // 预览线材质 + public Color previewColor = new Color(1, 1, 1, 0.5f); // 预览线颜色(半透明) + public float previewWireDiameter = 0.015f; // 预览线直径 + + [Header("删除设置")] + public KeyCode deleteKey = KeyCode.Mouse2; // 默认为鼠标右键 + public float deleteDetectionRadius = 0.5f; // 删除检测半径 + + [Header("状态显示")] + public DrawingState currentState = DrawingState.Idle; + + // 连线数据 + private Vector3 startPoint; + private Vector3 endPoint; + private GameObject currentWireObject; + private GameObject previewWireObject; // 预览连线对象 + + // 吸附相关 + private GameObject snapTarget; // 当前吸附目标 + private Renderer snapTargetRenderer; // 吸附目标的渲染器 + private Color snapTargetOriginalColor; // 吸附目标原始颜色 + private bool isSnapTargetHighlighted = false; + + // 存储所有已创建的连线 + private List allWires = new List(); + + // 起点和终点的碰撞体 + private GameObject startColliderObject; + private GameObject endColliderObject; + + // 单例模式,便于外部调用 + public static LineShowModel Instance { get; private set; } + + void Awake() + { + // 设置单例 + if (Instance == null) + { + Instance = this; + } + else + { + Destroy(gameObject); + } + } + + void Update() + { + HandleInput(); + + if (currentState == DrawingState.SelectingEnd) + { + UpdateWirePreview(); + } + + // 在选择终点状态时检查吸附 + if (currentState == DrawingState.SelectingEnd && enableSnapping) + { + CheckForSnapTargets(); + } + else + { + ClearSnapHighlight(); + } + } + + void HandleInput() + { + if (Input.GetMouseButtonDown(0)) // 左键点击 + { + HandleMouseClick(); + } + + if (Input.GetKeyDown(KeyCode.Escape)) // 取消当前操作 + { + CancelDrawing(); + } + + if (Input.GetKeyDown(deleteKey)) // 删除操作 + { + HandleDelete(); + } + } + + void HandleMouseClick() + { + Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); + RaycastHit hit; + + // 首先检查是否有吸附目标 + if (snapTarget != null) + { + HandleSnapTargetClick(); + } + else if (Physics.Raycast(ray, out hit, Mathf.Infinity, snapLayers)) + { + HandleColliderClick(hit.collider.gameObject, hit.point); + } + else + { + // 如果没有击中任何物体,且不在选择起点状态,则忽略 + if (currentState == DrawingState.Idle) + { + Debug.Log("请点击一个碰撞体作为连线起点"); + } + } + } + + void HandleSnapTargetClick() + { + if (snapTarget == null) return; + + switch (currentState) + { + case DrawingState.Idle: + // 选择起点 + StartNewWire(snapTarget); + break; + + case DrawingState.SelectingEnd: + // 选择终点 + CompleteWire(snapTarget); + break; + } + } + + void HandleColliderClick(GameObject colliderObject, Vector3 hitPoint) + { + switch (currentState) + { + case DrawingState.Idle: + // 选择起点 + StartNewWire(colliderObject); + break; + + case DrawingState.SelectingEnd: + // 选择终点 + CompleteWire(colliderObject); + break; + } + } + + void StartNewWire(GameObject startCollider) + { + if (startCollider == null) return; + + startColliderObject = startCollider; + startPoint = GetObjectCenter(startCollider); + currentState = DrawingState.SelectingEnd; + + // 创建预览连线 + CreatePreviewWire(); + + // 高亮起点碰撞体 + HighlightObject(startCollider); + + Debug.Log($"选择起点: {startCollider.name}"); + } + + void CompleteWire(GameObject endCollider) + { + if (endCollider == null || startColliderObject == null) return; + + // 检查是否连接到自身 + if (endCollider == startColliderObject) + { + Debug.LogWarning("不能连接到自身!"); + CancelDrawing(); + return; + } + + endColliderObject = endCollider; + endPoint = GetObjectCenter(endCollider); + + // 创建最终的连线 + GameObject newWire = CreateFinalWire(); + + currentState = DrawingState.Idle; + + // 清除预览和高亮 + ClearPreviewWire(); + ClearSnapHighlight(); + + Debug.Log($"选择终点: {endCollider.name}, 连线完成"); + + // 返回新创建的连线对象,供外部使用 + OnWireCreated?.Invoke(newWire, startColliderObject, endColliderObject); + } + + void CreatePreviewWire() + { + // 清除之前的预览 + ClearPreviewWire(); + + previewWireObject = new GameObject("PreviewWire"); + + if (useCylinderWire) + { + CreateCylinderPreviewWire(); + } + else + { + CreateLineRendererPreviewWire(); + } + } + + void CreateCylinderPreviewWire() + { + // 创建预览圆柱体 + GameObject cylinder = GameObject.CreatePrimitive(PrimitiveType.Cylinder); + cylinder.name = "PreviewCylinder"; + cylinder.transform.SetParent(previewWireObject.transform); + + // 设置预览材质 + Renderer renderer = cylinder.GetComponent(); + if (previewMaterial != null) + { + renderer.material = previewMaterial; + } + else + { + // 创建默认预览材质 + Material defaultPreviewMaterial = new Material(Shader.Find("Standard")); + defaultPreviewMaterial.color = previewColor; + renderer.material = defaultPreviewMaterial; + } + + // 初始位置和缩放 + cylinder.transform.position = startPoint; + cylinder.transform.localScale = new Vector3( + previewWireDiameter, + 0.001f, // 初始高度很小 + previewWireDiameter + ); + + // 移除碰撞器,避免干扰 + Destroy(cylinder.GetComponent()); + } + + void CreateLineRendererPreviewWire() + { + // 使用LineRenderer作为备选预览 + LineRenderer lr = previewWireObject.AddComponent(); + lr.positionCount = 2; + lr.SetPosition(0, startPoint); + lr.SetPosition(1, startPoint); + + // 配置LineRenderer + if (previewMaterial != null) + { + lr.material = previewMaterial; + } + else + { + lr.material = new Material(Shader.Find("Sprites/Default")); + } + + lr.startColor = previewColor; + lr.endColor = previewColor; + lr.startWidth = previewWireDiameter; + lr.endWidth = previewWireDiameter; + lr.useWorldSpace = true; + } + + void UpdateWirePreview() + { + if (currentState == DrawingState.SelectingEnd && previewWireObject != null) + { + Vector3 targetPoint; + + if (snapTarget != null) + { + targetPoint = GetObjectCenter(snapTarget); + } + else + { + targetPoint = GetMouseWorldPosition(); + } + + if (useCylinderWire) + { + UpdateCylinderPreviewWire(startPoint, targetPoint); + } + else + { + UpdateLineRendererPreviewWire(startPoint, targetPoint); + } + } + } + + void UpdateCylinderPreviewWire(Vector3 start, Vector3 end) + { + Transform cylinderTransform = previewWireObject.transform.Find("PreviewCylinder"); + if (cylinderTransform == null) return; + + GameObject cylinder = cylinderTransform.gameObject; + + // 计算连线的方向、长度和中点 + Vector3 direction = end - start; + float distance = direction.magnitude; + + if (distance < 0.001f) + { + // 距离太短,隐藏圆柱体 + cylinder.transform.localScale = new Vector3(previewWireDiameter, 0.001f, previewWireDiameter); + return; + } + + Vector3 midPoint = (start + end) / 2f; + + // 设置圆柱体的位置和旋转 + cylinder.transform.position = midPoint; + cylinder.transform.up = direction.normalized; + + // 设置圆柱体的缩放 + cylinder.transform.localScale = new Vector3( + previewWireDiameter, + distance / 2f, + previewWireDiameter + ); + } + + void UpdateLineRendererPreviewWire(Vector3 start, Vector3 end) + { + LineRenderer lr = previewWireObject.GetComponent(); + if (lr != null) + { + lr.SetPosition(0, start); + lr.SetPosition(1, end); + } + } + + GameObject CreateFinalWire() + { + if (startColliderObject == null || endColliderObject == null) return null; + + GameObject wireObject = new GameObject($"Wire_{System.DateTime.Now:yyyyMMddHHmmss}"); + + if (useCylinderWire) + { + CreateCylinderWire(wireObject, startPoint, endPoint); + } + else + { + CreateLineRendererWire(wireObject, startPoint, endPoint); + } + + // 添加连线数据组件 + LineShowModelCylinderWireData wireData = wireObject.AddComponent(); + wireData.startPoint = startPoint; + wireData.endPoint = endPoint; + wireData.startCollider = startColliderObject; + wireData.endCollider = endColliderObject; + wireData.wireDiameter = cylinderWireDiameter; + wireData.creationTime = System.DateTime.Now; + + // 添加到连线列表 + allWires.Add(wireObject); + StartCoroutine(LineManager.instance.Checkconnection(startColliderObject.transform, endColliderObject.transform)); + // 重置起点和终点 + startColliderObject = null; + endColliderObject = null; + + return wireObject; + } + + void CreateCylinderWire(GameObject wireObject, Vector3 start, Vector3 end) + { + GameObject cylinder = GameObject.CreatePrimitive(PrimitiveType.Cylinder); + cylinder.name = "WireCylinder"; + cylinder.transform.SetParent(wireObject.transform); + + // 设置材质 + if (cylinderWireMaterial != null) + { + Renderer renderer = cylinder.GetComponent(); + renderer.material = cylinderWireMaterial; + } + else if (wireMaterial != null) + { + Renderer renderer = cylinder.GetComponent(); + renderer.material = wireMaterial; + } + + // 计算连线的方向、长度和中点 + Vector3 direction = end - start; + float distance = direction.magnitude; + Vector3 midPoint = (start + end) / 2f; + + // 设置圆柱体的位置和旋转 + cylinder.transform.position = midPoint; + cylinder.transform.up = direction.normalized; + + // 设置圆柱体的缩放 + cylinder.transform.localScale = new Vector3( + cylinderWireDiameter, + distance / 2f, + cylinderWireDiameter + ); + + // 可选:添加碰撞器 + if (cylinder.GetComponent() != null) + { + Destroy(cylinder.GetComponent()); + } + } + + void CreateLineRendererWire(GameObject wireObject, Vector3 start, Vector3 end) + { + LineRenderer lr = wireObject.AddComponent(); + lr.positionCount = 2; + lr.SetPosition(0, start); + lr.SetPosition(1, end); + + // 配置LineRenderer + if (wireMaterial != null) + { + lr.material = wireMaterial; + } + else + { + lr.material = new Material(Shader.Find("Sprites/Default")); + } + + lr.startColor = wireColor; + lr.endColor = wireColor; + lr.startWidth = wireWidth; + lr.endWidth = wireWidth; + lr.useWorldSpace = true; + } + + void ClearPreviewWire() + { + if (previewWireObject != null) + { + Destroy(previewWireObject); + previewWireObject = null; + } + } + + void CheckForSnapTargets() + { + Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); + RaycastHit hit; + + // 清除之前的吸附高亮 + ClearSnapHighlight(); + + // 检查鼠标位置附近是否有可吸附的物体 + if (Physics.Raycast(ray, out hit, Mathf.Infinity, snapLayers)) + { + GameObject hitObject = hit.collider.gameObject; + + // 跳过起点碰撞体 + if (hitObject == startColliderObject) + { + return; + } + + // 计算鼠标位置与物体中心的距离 + Vector3 objectCenter = GetObjectCenter(hitObject); + float distance = Vector3.Distance(GetMouseWorldPosition(), objectCenter); + + if (distance <= snapDistance) + { + // 设置吸附目标 + snapTarget = hitObject; + + // 高亮显示可吸附的物体 + HighlightSnapTarget(snapTarget); + } + } + } + + Vector3 GetObjectCenter(GameObject obj) + { + if (obj == null) return Vector3.zero; + + if (snapToColliderCenter) + { + Collider collider = obj.GetComponent(); + if (collider != null) + { + return collider.bounds.center; + } + } + + // 默认使用变换位置 + return obj.transform.position; + } + + void HighlightSnapTarget(GameObject target) + { + if (target == null) return; + + snapTargetRenderer = target.GetComponent(); + if (snapTargetRenderer != null) + { + // 记录原始颜色 + snapTargetOriginalColor = snapTargetRenderer.material.color; + + // 设置高亮颜色 + snapTargetRenderer.material.color = snapHighlightColor; + isSnapTargetHighlighted = true; + } + } + + void HighlightObject(GameObject obj) + { + if (obj == null) return; + + Renderer renderer = obj.GetComponent(); + if (renderer != null) + { + // 临时高亮物体 + Color originalColor = renderer.material.color; + renderer.material.color = Color.green; + + // 可以在这里添加一个协程来在一段时间后恢复颜色 + StartCoroutine(RestoreColorAfterDelay(renderer, originalColor, 1.0f)); + } + } + + IEnumerator RestoreColorAfterDelay(Renderer renderer, Color originalColor, float delay) + { + yield return new WaitForSeconds(delay); + + if (renderer != null) + { + renderer.material.color = originalColor; + } + } + + void ClearSnapHighlight() + { + if (snapTargetRenderer != null && isSnapTargetHighlighted) + { + snapTargetRenderer.material.color = snapTargetOriginalColor; + snapTargetRenderer = null; + isSnapTargetHighlighted = false; + } + snapTarget = null; + } + + public void CancelDrawing() + { + ClearPreviewWire(); + ClearSnapHighlight(); + currentState = DrawingState.Idle; + + // 重置起点和终点 + startColliderObject = null; + endColliderObject = null; + + Debug.Log("取消连线操作"); + } + + Vector3 GetMouseWorldPosition() + { + Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); + RaycastHit hit; + + // 优先使用吸附目标的位置 + if (snapTarget != null) + { + return GetObjectCenter(snapTarget); + } + + // 其次使用射线击中的位置 + if (Physics.Raycast(ray, out hit, Mathf.Infinity, snapLayers)) + { + return hit.point; + } + + // 如果没有击中任何物体,使用默认平面 + Plane defaultPlane = new Plane(Vector3.up, Vector3.zero); + float enter; + if (defaultPlane.Raycast(ray, out enter)) + { + return ray.GetPoint(enter); + } + + // 最后使用射线上的一个点 + return ray.origin + ray.direction * 10f; + } + + // 公共方法:开始新连线 + public void StartNewWire() + { + if (currentState != DrawingState.Idle) + { + CancelDrawing(); + } + currentState = DrawingState.SelectingStart; + } + + // 公共方法:删除所有连线 + public void ClearAllWires() + { + foreach (GameObject wire in allWires) + { + if (wire != null) + Destroy(wire); + } + allWires.Clear(); + Debug.Log("已清除所有连线"); + + // 触发事件 + OnAllWiresDeleted?.Invoke(); + } + + // 公共方法:删除最后一个连线 + public void DeleteLastWire() + { + if (allWires.Count > 0) + { + GameObject lastWire = allWires[allWires.Count - 1]; + DeleteWire(lastWire); + } + else + { + Debug.Log("没有可删除的连线"); + } + } + + // 公共方法:删除指定连线 + public void DeleteWire(GameObject wireObject) + { + if (wireObject == null) return; + + // 获取连线数据 + LineShowModelCylinderWireData wireData = wireObject.GetComponent(); + GameObject startCollider = wireData?.startCollider; + GameObject endCollider = wireData?.endCollider; + + // 从列表中移除 + allWires.Remove(wireObject); + + // 销毁连线对象 + Destroy(wireObject); + + Debug.Log($"删除连线: {wireObject.name}"); + + // 触发事件 + OnWireDeleted?.Invoke(wireObject, startCollider, endCollider); + } + + // 公共方法:根据碰撞体删除连线 + public void DeleteWiresByCollider(GameObject colliderObject) + { + List wiresToDelete = new List(); + + // 查找所有连接到该碰撞体的连线 + foreach (GameObject wire in allWires) + { + LineShowModelCylinderWireData wireData = wire?.GetComponent(); + if (wireData != null && (wireData.startCollider == colliderObject || wireData.endCollider == colliderObject)) + { + wiresToDelete.Add(wire); + } + } + + // 删除找到的连线 + foreach (GameObject wire in wiresToDelete) + { + DeleteWire(wire); + } + + if (wiresToDelete.Count > 0) + { + Debug.Log($"删除了 {wiresToDelete.Count} 条连接到 {colliderObject.name} 的连线"); + } + } + + // 公共方法:根据两个碰撞体删除特定连线 + public void DeleteWireByColliders(GameObject startCollider, GameObject endCollider) + { + foreach (GameObject wire in allWires) + { + LineShowModelCylinderWireData wireData = wire?.GetComponent(); + if (wireData != null && + ((wireData.startCollider == startCollider && wireData.endCollider == endCollider) || + (wireData.startCollider == endCollider && wireData.endCollider == startCollider))) + { + DeleteWire(wire); + Debug.Log($"删除了 {startCollider.name} 和 {endCollider.name} 之间的连线"); + return; + } + } + + Debug.Log($"未找到 {startCollider.name} 和 {endCollider.name} 之间的连线"); + } + + // 公共方法:设置吸附目标(用于编程控制) + public void SetSnapTarget(GameObject target) + { + if (enableSnapping && target != null) + { + snapTarget = target; + HighlightSnapTarget(target); + } + } + + // 公共方法:清除吸附目标 + public void ClearSnapTarget() + { + ClearSnapHighlight(); + } + + // 公共方法:检查物体是否可以吸附 + public bool CanSnapToObject(GameObject obj) + { + if (obj == null) return false; + + // 检查物体是否在可吸附层 + if (((1 << obj.layer) & snapLayers) == 0) return false; + + // 检查物体是否有碰撞体 + Collider collider = obj.GetComponent(); + if (collider == null) return false; + + return true; + } + + // 公共方法:获取所有连线 + public List GetAllWires() + { + return new List(allWires); + } + + // 公共方法:获取连接到特定碰撞体的所有连线 + public List GetWiresByCollider(GameObject colliderObject) + { + List connectedWires = new List(); + + foreach (GameObject wire in allWires) + { + LineShowModelCylinderWireData wireData = wire?.GetComponent(); + if (wireData != null && (wireData.startCollider == colliderObject || wireData.endCollider == colliderObject)) + { + connectedWires.Add(wire); + } + } + + return connectedWires; + } + + // 公共方法:检查两个碰撞体之间是否有连线 + public bool AreCollidersConnected(GameObject collider1, GameObject collider2) + { + foreach (GameObject wire in allWires) + { + LineShowModelCylinderWireData wireData = wire?.GetComponent(); + if (wireData != null && + ((wireData.startCollider == collider1 && wireData.endCollider == collider2) || + (wireData.startCollider == collider2 && wireData.endCollider == collider1))) + { + return true; + } + } + + return false; + } + + // 处理删除操作 + void HandleDelete() + { + // 如果正在绘制连线,先取消绘制 + if (currentState != DrawingState.Idle) + { + CancelDrawing(); + return; + } + + // 查找鼠标位置附近的连线 + Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); + RaycastHit hit; + + if (Physics.Raycast(ray, out hit, Mathf.Infinity)) + { + GameObject hitObject = hit.collider.gameObject; + + // 检查是否点击到了连线 + if (IsWire(hitObject)) + { + DeleteWire(hitObject); + return; + } + + // 检查是否是连线的子物体 + if (hitObject.transform.parent != null) + { + GameObject parent = hitObject.transform.parent.gameObject; + if (IsWire(parent)) + { + DeleteWire(parent); + return; + } + } + } + + // 如果没有找到可删除的对象,尝试删除最后一个连线 + DeleteLastWire(); + } + + // 检查对象是否是连线 + bool IsWire(GameObject obj) + { + if (obj == null) return false; + + // 检查是否是连线 + if (obj.name.StartsWith("Wire_") || obj.GetComponent() != null) + { + return true; + } + + return false; + } + + // 事件定义 + public delegate void WireCreatedHandler(GameObject wire, GameObject startCollider, GameObject endCollider); + public delegate void WireDeletedHandler(GameObject wire, GameObject startCollider, GameObject endCollider); + public delegate void AllWiresDeletedHandler(); + + // 事件 + public static event WireCreatedHandler OnWireCreated; + public static event WireDeletedHandler OnWireDeleted; + public static event AllWiresDeletedHandler OnAllWiresDeleted; +} + diff --git a/Assets/Scripts/Line/LineShowModel.cs.meta b/Assets/Scripts/Line/LineShowModel.cs.meta new file mode 100644 index 0000000..7ab0bbc --- /dev/null +++ b/Assets/Scripts/Line/LineShowModel.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 239a36da09e63484eb88aed17b731dea +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Line/LineShowModelCylinderWireData.cs b/Assets/Scripts/Line/LineShowModelCylinderWireData.cs new file mode 100644 index 0000000..16d90a5 --- /dev/null +++ b/Assets/Scripts/Line/LineShowModelCylinderWireData.cs @@ -0,0 +1,13 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +// 圆柱体连线数据组件 +public class LineShowModelCylinderWireData : MonoBehaviour +{ + public Vector3 startPoint; + public Vector3 endPoint; + public GameObject startCollider; + public GameObject endCollider; + public float wireDiameter; + public System.DateTime creationTime; +} \ No newline at end of file diff --git a/Assets/Scripts/Line/LineShowModelCylinderWireData.cs.meta b/Assets/Scripts/Line/LineShowModelCylinderWireData.cs.meta new file mode 100644 index 0000000..ac918fe --- /dev/null +++ b/Assets/Scripts/Line/LineShowModelCylinderWireData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c0143d1e349fc9a42a74001b6be63db8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: