From 762c4751fcf39aba3b9d69a55bceec6c00b724d9 Mon Sep 17 00:00:00 2001 From: wuyanchen <307378529@qq.com> Date: Wed, 10 Dec 2025 19:33:44 +0800 Subject: [PATCH] =?UTF-8?q?=C2=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Scripts/EnemyManager.cs | 3 + Assets/Scripts/TargetFlow.cs | 73 +++++++++++++++++++++++-- Assets/TowerDefence/Scenes/Tower.unity | Bin 103836 -> 106364 bytes 3 files changed, 71 insertions(+), 5 deletions(-) diff --git a/Assets/Scripts/EnemyManager.cs b/Assets/Scripts/EnemyManager.cs index d37d571..b05cc9b 100644 --- a/Assets/Scripts/EnemyManager.cs +++ b/Assets/Scripts/EnemyManager.cs @@ -146,6 +146,8 @@ public class EnemyManager : MonoBehaviour //} enemy.position = pos; + + var enemyComp = enemy.GetComponent(); enemy.eulerAngles = new Vector3(enemy.eulerAngles.x + enemyComp.addEulerX, enemy.eulerAngles.y + 180, enemy.eulerAngles.z); //Debug.Log(enemy.eulerAngles); @@ -163,6 +165,7 @@ public class EnemyManager : MonoBehaviour var destPos = pathesLoc[enemyComp.ToPosIndex].position; destPos = new Vector3(enemy.position.x, destPos.y, destPos.z); + ToDestination(enemyComp, destPos); enemyComp.SetAlphaMaterial(); diff --git a/Assets/Scripts/TargetFlow.cs b/Assets/Scripts/TargetFlow.cs index 2d285c3..2633c66 100644 --- a/Assets/Scripts/TargetFlow.cs +++ b/Assets/Scripts/TargetFlow.cs @@ -5,6 +5,7 @@ using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.InputSystem; using UnityEngine.InputSystem.EnhancedTouch; +using UnityEngine.UI; using UnityEngine.UIElements; public class TargetFlow : MonoBehaviour @@ -19,6 +20,9 @@ public class TargetFlow : MonoBehaviour [Header("移动设置")] [Tooltip("缓动移动速度")] [SerializeField] private float moveSpeed = 10f; + [Tooltip("缓动距离乘积")] + [SerializeField] private float moveMul = 1f; + public GraphicRaycaster uiRaycaster; // 运行时状态 private Camera _cam; @@ -30,10 +34,35 @@ public class TargetFlow : MonoBehaviour private Vector3 _targetWorldPos; private Vector3? _beforeTargetWorldPos; private Vector3 _position = Vector3.zero; + private int _backgroundLayer = 0; + private float _radius = 0; + + private Vector3 offsetLimitPos1; + private Vector3 offsetLimitPos2; + private float beforeNearClipPlane = -1; private void Awake() { _cam = Camera.main; + _backgroundLayer = LayerMask.NameToLayer("Background"); + } + + private void Start() + { + var bounds = GetComponentInChildren().bounds; + _radius = Mathf.Max(bounds.extents.x, bounds.extents.y, bounds.extents.z); + } + + private void ResetLimitPos() + { + if (_cam.nearClipPlane != beforeNearClipPlane) + { + beforeNearClipPlane = _cam.nearClipPlane; + var limitRectPos1 = _cam.ScreenToWorldPoint(new Vector3(0, 0, _cam.nearClipPlane)); + var limitRectPos2 = _cam.ScreenToWorldPoint(new Vector3(Screen.width, Screen.height, _cam.nearClipPlane)); + offsetLimitPos1 = _cam.WorldToScreenPoint(new Vector3(limitRectPos1.x + _radius, limitRectPos1.y, limitRectPos1.z + _radius)); + offsetLimitPos2 = _cam.WorldToScreenPoint(new Vector3(limitRectPos2.x - _radius, limitRectPos2.y, limitRectPos2.z - _radius)); + } } private void OnEnable() @@ -90,11 +119,42 @@ public class TargetFlow : MonoBehaviour // 新增UI阻塞处理 private bool HandleUIBlocking() { + // 新输入系统:读取鼠标位置(返回Vector2,与Input.mousePosition的x、y值一致) + //Vector2 mousePos = moveAction.action.ReadValue(); + // 创建射线(ScreenPointToRay支持Vector2,内部会自动处理z轴为0) - if (EventSystem.current.IsPointerOverGameObject()) + + if (_controlPosition == null) { - return true; + return false; } + + if (uiRaycaster != null) + { + // 第一步:先检测UI + PointerEventData pointerData = new PointerEventData(EventSystem.current); + pointerData.position = _controlPosition.Value; + List uiResults = new List(); + uiRaycaster.Raycast(pointerData, uiResults); + + if (uiResults.Count > 0) + { + return true; // 有UI则不检测3D + } + } + + + Ray ray = _cam.ScreenPointToRay(_controlPosition.Value); + if (Physics.Raycast(ray, out RaycastHit hit, 100f)) + { + if (hit.collider.gameObject.layer == _backgroundLayer) + { + //enabled = false; + //StartCoroutine(EnableAfterDelay(0.1f)); + return false; + } + } + return false; } @@ -116,16 +176,19 @@ public class TargetFlow : MonoBehaviour // 转换为世界坐标并平滑移动 _targetWorldPos += _cam.ScreenToWorldPoint(new Vector3(_position.x, _position.y, _cam.nearClipPlane)) - _cam.ScreenToWorldPoint(new Vector3(_controlPosition.Value.x, _controlPosition.Value.y, _cam.nearClipPlane)); _controlPosition = _position; - _targetWorldPos.z = transform.position.z; + _targetWorldPos.y = transform.position.y; + //_targetWorldPos.z = transform.position.z; if (_beforeTargetWorldPos == null) { _beforeTargetWorldPos = _targetWorldPos; } - var pos = _currPosition + (_targetWorldPos - _beforeTargetWorldPos.Value); + ResetLimitPos(); + var pos = _currPosition + (_targetWorldPos - _beforeTargetWorldPos.Value) * moveMul; var screenPos = _cam.WorldToScreenPoint(pos); + //Debug.Log(offsetLimitPos1 + ":" + offsetLimitPos2); //限制对象移动范围在屏幕范围之内 - if (screenPos.x > 0 && screenPos.x < Screen.width && screenPos.y > 0 && screenPos.y < Screen.height) + if (screenPos.x > offsetLimitPos1.x && screenPos.x < offsetLimitPos2.x && screenPos.y > offsetLimitPos1.y && screenPos.y < offsetLimitPos2.y) { _currPosition = pos; } diff --git a/Assets/TowerDefence/Scenes/Tower.unity b/Assets/TowerDefence/Scenes/Tower.unity index ad864f8334d0f7e35d20f35a1b4cd07ada56a2b3..06b1d7f5181e38a7eecf43346e6f9ac85fbf913d 100644 GIT binary patch delta 4698 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 SgAb)G2N(J91K{heQs@7tn%Fl0 delta 4066 zcmZXX4OCRe6@cgR7fb-bpJf%4734=0K>=BX%7Q;EC=Jo7_!F`bOs&BPY8zUGT{WaM z)z;LQfw17lNJ5UL*#_HZtVtGgOi7DJOxqmnNt#7%tBJK}%t>l$?7i>ZakZUu?wdQ` zy|Z^_?w!ZuKW~S*4~OkFP0N2@P=oz$qc6}qdd$q4IdgjU^jR~uTE#cFZ{LRWUllhT z?OA&K{%DBksrvobArRTK>dfJ>5Y-d*H(Lmd>?yhYMifN%-2C$90}!Kq5e%uJFiM*+ z0_1Q)dqiAb3%}*n9YZ5($*pEW1dzg9FWTHZBMq-1(o)V%0aVeW!{B4 z{Z1Kko4!3f2V{}LDa0Z+471?|;9}6YnE9o29AHxiTh81w)!^!2-S6F;MP!h98|oCe zgL%U=vIY{@NgU$~ONP$H8tkY74)6pQ^FCx$6CURF={Ufq0-s;_4=asb%o|asz!#W{ zOtJ<}=%VsRPVvQaC>E5<%^&1rC(K#&4CMYZ=3eGLv{5dvFt5`ShZTy9Qu$Bi&s^2Y zRpwbU(Ft1(#iz0z=n2gR{)d*<=mu-~;8)+>JJ><1wpq3(3!_SAY<^Ev&HX!sUAg-{7eVSb6Z4{el>ROa1tae&Q+LitEj{>)W)yR)<$ z&0@V?4npQ-L5%ULL8zR{*vVxh*T5ncF(0<+_)bwQX6`LAIGJe?e;r(}2ODO-9~tHB z6Xq?&IG|Ejf&FX<*Haw`JjA?#xesU2?$0x~&c^{Z8wv$pkX=xPooHa*j5-Bg$Xpni zTJV#Yq7(b`ctU;SH#@KTy3CO`Ii{}71*Vqbk22F6RBXX?%x68 z^s4c*LFL<{CfI3O;QqbHJi652HtcA}2bDi_wV+v<9W~@Rz+9yukNNsCe$}Z7RyJHh z12wgv*~}{!8Qg~*rC<(ovtG7=6ukLPryjVHx!Un@=9icsqWF>cL%(IiUcF?5=tq`- za)PnJ9wG7?K_6QTIegvpScUoRMZbfc6DtW;j!A58UB-=3dR=(>iAtp z&DmFJ82*Ia6cm$oE(aa}n5A9Ig`Gj#YgU*Zs*Rls$3mp11VZGwVsJvNTsaStz^paS zgYUw9<8Y!c?QwZ_K8%*$Vi+%@OCemdEP!snL2ntfk9hbheGA}U4{c)!&Ve}X&vy8X z%`bsjPH2XF&9eynVaf66S9Lq*!bd-f*1tkpKa84qD>q92Ft7|BdTmBxv`CPVE}Yu{VmVX} zR_(|Nh=61Z+FL5)?I(YhXD2=GR&V0Og)Kn(vbOMxgT606w8)PuAt{4?gaj?Z4&(60 zU4<{Swaq=7|GPev^wZ7TN_YP&|8dekT@u%L;EV1lq?`6#8%}p0 z9wPnxIl26?wu0Z0?rsc=Xm+@llm1G+_oUn#x0>|J6+znTt6)YbB+8*j;H6MA!oSF& zt&lBGIACI!t1vq|yHNTam>lZ?h>*2*u*!l*p181wu(utJg?YJ^PbUjw6z8u_ROqUG)dFj@aOZD1V?2B~UMU*Kk0 z{yjJ&uhhU8nY96;VX{`V0g{4b{01bpDhScG*Mi>&BkP{PII-HRPhermnp*U5JPOk& zTC_Y;kB{f-aI>a*NQY#ts2+Mi-l)S|+`k3J$EbfjPWSiE1w4urEq4n9->Kg_--X)8 zTOl(@-q;K#E%8a{1W1*=4fmX%=KdiZg=D&C1yM(P8w#WJyQRvQzNPOiW9i)nZ-zNc zHsLVIP21s=jCc~)Rn`b)`T-g{o2s86ZYZV+Qn8!e1bH&25gmuiAzkw};qH?&@W+>| zIJxZV^cX?k!YXLy-9a_HJJkSLvVO5N!WP1Z%Rqd^xLJ7#aCaenE9-OAqto~M-waA}CH3hDJRz=8` z-g112RQv+w10~KPkM4tMn7E;Ruq#N0?12KxY>0N~c^ClWz@BM^o&R@WcS_ErdE02s zId`p@Uc_q6^xYcB%dHn60S|dXJLDN%g525;X4Ll>=vF(H`$YqxPF^}