From 125d2c80b116608d134c1f1a8442318395880788 Mon Sep 17 00:00:00 2001 From: Tungdv Date: Fri, 29 May 2026 20:53:36 +0700 Subject: [PATCH 1/2] feat: add debug. --- .../litmodels/a61/7/litmodel_1013.bmd.prefab | 23 -- .../Scripts/Managers/EC_HPWorkMove.cs | 1 + Assets/PerfectWorld/Scripts/Move/EC_CDR.cs | 243 +++++++++++++++--- Assets/Scenes/a61.unity | 4 +- Assets/Scripts/CECHostPlayer.World.cs | 1 + 5 files changed, 209 insertions(+), 63 deletions(-) diff --git a/Assets/ModelRenderer/Art/Models/litmodels/a61/7/litmodel_1013.bmd.prefab b/Assets/ModelRenderer/Art/Models/litmodels/a61/7/litmodel_1013.bmd.prefab index 31120e208d..b517a43e66 100755 --- a/Assets/ModelRenderer/Art/Models/litmodels/a61/7/litmodel_1013.bmd.prefab +++ b/Assets/ModelRenderer/Art/Models/litmodels/a61/7/litmodel_1013.bmd.prefab @@ -2082,7 +2082,6 @@ GameObject: - component: {fileID: 3165494068242929401} - component: {fileID: 5334810740042598332} - component: {fileID: 7700292349787736273} - - component: {fileID: 3017834984568792303} m_Layer: 7 m_Name: Object3377 m_TagString: Untagged @@ -2158,28 +2157,6 @@ MeshRenderer: m_SortingLayer: 0 m_SortingOrder: 0 m_AdditionalVertexStreams: {fileID: 0} ---- !u!64 &3017834984568792303 -MeshCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 189128314675701766} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 0 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 5 - m_Convex: 0 - m_CookingOptions: 30 - m_Mesh: {fileID: 4300000, guid: e1fd0f7fe1695472f9549089cb896347, type: 2} --- !u!1 &213712246934505364 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkMove.cs b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkMove.cs index 000fb86a8b..a83510f471 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkMove.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkMove.cs @@ -821,6 +821,7 @@ namespace BrewMonster.Scripts } vCurPos = m_pHost.m_MoveCtrl.GroundMove(EC_Utility.ToA3DVECTOR3(vMoveDir), fSpeed, fDeltaTime, m_pHost.m_fVertSpeed); + //BoxCastDrawer.DrawCenterAxis(EC_Utility.ToVector3(vCurPos), Quaternion.identity, 1f, 3f); m_pHost.SetPos(EC_Utility.ToVector3(vCurPos)); } else diff --git a/Assets/PerfectWorld/Scripts/Move/EC_CDR.cs b/Assets/PerfectWorld/Scripts/Move/EC_CDR.cs index 5662678bbd..982a9e6330 100644 --- a/Assets/PerfectWorld/Scripts/Move/EC_CDR.cs +++ b/Assets/PerfectWorld/Scripts/Move/EC_CDR.cs @@ -4,6 +4,7 @@ using BrewMonster.Scripts.Ornament; using BrewMonster.Scripts.World; using CSNetwork.GPDataType; using System; +using System.Reflection; using UnityEngine; using UnityEngine.UI; using static BrewMonster.CECHostMove; @@ -124,16 +125,25 @@ namespace BrewMonster if ((pEnvTrc.dwCheckFlag & CDR_EVN.CDR_BRUSH) == CDR_EVN.CDR_BRUSH) { + float fFractionBrush = 100f; + Vector3 v3Normal = Vector3.zero; dir = vDelta; - //hits = new RaycastHit[5]; countHits = Physics.BoxCastNonAlloc(vStart, vExt, dir.normalized, hits, Quaternion.identity, vDelta.magnitude, BrushMask); - if (countHits > 0) + for(int i = 0; i < countHits; i++) { - System.Array.Sort(hits, 0, hits.Length, raycastHitDistanceComparer); - pEnvTrc.fFraction = (hits[0].distance) / vDelta.magnitude; - pEnvTrc.vHitNormal = EC_Utility.ToA3DVECTOR3(hits[0].normal); - pEnvTrc.dwClsFlag = CDR_EVN.CDR_BRUSH; + if (hits[i].distance > 0f) + { + float fFraction = (hits[i].distance) / vDelta.magnitude; + if(fFraction < fFractionBrush) + { + fFractionBrush = fFraction; + v3Normal = hits[i].normal; + } + } } + pEnvTrc.fFraction = fFractionBrush; + pEnvTrc.vHitNormal = EC_Utility.ToA3DVECTOR3(v3Normal); + pEnvTrc.dwClsFlag = CDR_EVN.CDR_BRUSH; } if ((pEnvTrc.dwCheckFlag & CDR_EVN.CDR_TERRAIN) == CDR_EVN.CDR_TERRAIN) { @@ -521,6 +531,7 @@ namespace BrewMonster while (nTry < MAX_TRY) { + //hits = new RaycastHit[5]; vDelta = vVelocity * fTime; vFinalPos = vStart; float fDeltaDist = vDelta.Magnitude(); @@ -552,6 +563,7 @@ namespace BrewMonster { //a_LogOutput(1, "bClear = true"); vFinalPos = vStart + vDelta; + Debug.LogError("bClear = true " + vFinalPos); break; } @@ -564,13 +576,26 @@ namespace BrewMonster env_trace_t tmpInfo = new env_trace_t(); tmpInfo.vStart = vStart; tmpInfo.vDelta = new A3DVECTOR3(0.0f, CDRInfo.fStepHeight, 0.0f); - tmpInfo.vExt = vExt; + tmpInfo.vExt = new A3DVECTOR3(vExt.x, 0.01f, vExt.z); //@note : need check terrain?? By Kuiwu[8/10/2005] tmpInfo.dwCheckFlag = CDR_EVN.CDR_BRUSH | CDR_EVN.CDR_TERRAIN; tmpInfo.vTerStart = vStart; tmpInfo.vTerStart.y -= vExt.y; + //bPull = !CollideWithEnv(ref tmpInfo); + Debug.LogError("CheckFootStepUp"); + bPull = !CheckFootStepUp(tmpInfo); - bPull = !CollideWithEnv(ref tmpInfo); + //int count1 = Physics.RaycastNonAlloc(EC_Utility.ToVector3(tmpInfo.vStart), EC_Utility.ToVector3(tmpInfo.vDelta).normalized, hits, EC_Utility.ToVector3(tmpInfo.vDelta).magnitude, BrushMask | TerrainMask); + //bPull = !(count1 < 0); + //if(count1 > 0) + //{ + // Debug.DrawLine(EC_Utility.ToVector3(tmpInfo.vStart), hits[0].point, Color.yellow, 10f); + //} + //if(bPull == false) + //{ + // BoxCastDrawer.Draw(EC_Utility.ToVector3(tmpInfo.vStart), EC_Utility.ToVector3(tmpInfo.vExt), EC_Utility.ToVector3(tmpInfo.vDelta).normalized, + // Quaternion.identity, EC_Utility.ToVector3(tmpInfo.vDelta).magnitude, hits, 1, nTry == 0 ? Color.red : Color.green, 10f); + //} if (bPull) { vStart.y += CDRInfo.fStepHeight; @@ -585,8 +610,8 @@ namespace BrewMonster { vDelta *= tmpInfo.fFraction; } - - if (vDelta.SquaredMagnitude() < vExt.x * vExt.x * 4) + float value = vDelta.SquaredMagnitude(); + if (value < (vExt.x * vExt.x * 4)) { vStart.y -= CDRInfo.fStepHeight; bPull = false; @@ -661,7 +686,7 @@ namespace BrewMonster groundTrc.fDeltaY = 0.0f; } - if (!RetrieveSupportPlane(ref groundTrc)) + if (!RetrieveSupportPlane(ref groundTrc, true)) {//@note : do NOT change position. By Kuiwu[14/9/2005] CDRInfo.fMoveDist = 0.0f; // if (groundTrc.bSupport) @@ -674,6 +699,7 @@ namespace BrewMonster if (groundTrc.bSupport) { vFinalPos = groundTrc.vEnd; + Debug.LogError("vFinalPos = " + vFinalPos); if (!bJump) { vTPNormal = groundTrc.vHitNormal; @@ -692,6 +718,28 @@ namespace BrewMonster CDRInfo.vTPNormal = vTPNormal; } + private static bool CheckFootStepUp(env_trace_t pEnvTrc) + { + Vector3 vExt = EC_Utility.ToVector3(pEnvTrc.vExt); + Vector3 vStart = EC_Utility.ToVector3(pEnvTrc.vStart); + Vector3 vDelta = EC_Utility.ToVector3(pEnvTrc.vDelta); + Vector3 dir = vDelta; + int countHits = 0; + float num = 10f; + countHits = Physics.BoxCastNonAlloc(vStart, vExt, dir.normalized, hits, Quaternion.identity, vDelta.magnitude, BrushMask); + if (countHits > 0) + { + for(int i = 0; i < countHits; i++) + { + if (hits[i].collider != null && hits[i].point.y > (vStart.y + vExt.y)) + { + return true; + } + } + } + return false; + } + //@desc : used to retrieve support plane (ground or brush), By Kuiwu[12/9/2005] public struct ground_trace_t { @@ -704,7 +752,7 @@ namespace BrewMonster public bool bSupport; //false if ground missed }; - public static bool RetrieveSupportPlane(ref ground_trace_t pTrc) + public static bool RetrieveSupportPlane(ref ground_trace_t pTrc, bool check = false) { A3DVECTOR3 vTerrainPos = new A3DVECTOR3(), vTerrainNormal = new A3DVECTOR3(); @@ -715,13 +763,15 @@ namespace BrewMonster BrushTraceInfo trcInfo = new BrushTraceInfo(); trcInfo.Init(pTrc.vStart, new A3DVECTOR3(0.0f, -pTrc.fDeltaY, 0.0f), pTrc.vExt); Vector3 hitPoint = new Vector3(); - if (AABBCollideWithBrush(ref trcInfo, ref hitPoint)) + if (AABBCollideWithBrush(ref trcInfo, ref hitPoint, check)) { if (trcInfo.bStartSolid) { return false; } pTrc.vEnd = trcInfo.vStart + trcInfo.vDelta * trcInfo.fFraction; + if(check) + Debug.LogError("trcInfo.fFraction = " + trcInfo.fFraction + " trcInfo.vStart = " + trcInfo.vStart + " pTrc.vEnd = " + pTrc.vEnd); pTrc.vEnd.y = hitPoint.y + pTrc.vExt.y + 0.1f; //if((pTrc.vEnd.y + 0.17f) < (hitPoint.y + pTrc.vExt.y + 0.1f)) //{ @@ -752,7 +802,7 @@ namespace BrewMonster trcInfo.Init(pTrc.vStart, vDelta, pTrc.vExt); pTrc.vHitNormal = vTerrainNormal; pTrc.bSupport = true; - return !AABBCollideWithBrush(ref trcInfo); + return !AABBCollideWithBrush(ref trcInfo, ref hitPoint, check); } return true; @@ -1004,7 +1054,7 @@ namespace BrewMonster return false; } - public static bool AABBCollideWithBrush(ref BrushTraceInfo brushTraceInfo, ref Vector3 hitPoint) + public static bool AABBCollideWithBrush(ref BrushTraceInfo brushTraceInfo, ref Vector3 hitPoint, bool check) { Vector3 vExt = EC_Utility.ToVector3(brushTraceInfo.vExtents); Vector3 vStart = EC_Utility.ToVector3(brushTraceInfo.vStart); @@ -1012,35 +1062,41 @@ namespace BrewMonster Vector3 dir = vDelta; int countHits = 0; float num = 10f; - //Quaternion quaternion = EC_Game.GetGameRun().GetWorld().GetPlayerMan().GetHostPlayer().transform.rotation; - Vector3[] arrVExt = new Vector3[5] { - vExt - ,new Vector3(vExt.x / num, vExt.y, vExt.z), - new Vector3(vExt.x, vExt.y / num, vExt.z), - new Vector3(vExt.x, vExt.y, vExt.z / num), - vExt / num - }; - for (int i = 0; i < arrVExt.Length; i++) + countHits = Physics.BoxCastNonAlloc(vStart, vExt, dir.normalized, hits, Quaternion.identity, vDelta.magnitude, BrushMask); + if (countHits > 0) { - countHits = Physics.BoxCastNonAlloc(vStart, arrVExt[i], dir.normalized, hits, Quaternion.identity, vDelta.magnitude, BrushMask); - if (countHits > 0) + System.Array.Sort(hits, 0, hits.Length, raycastHitDistanceComparer); + if (check) { - System.Array.Sort(hits, 0, hits.Length, raycastHitDistanceComparer); - if (Math.Abs(hits[0].distance - 0f) < float.Epsilon) + BoxCastDrawer.Draw(vStart, vExt, vDelta.normalized, + Quaternion.identity, vDelta.magnitude, hits, 1, Color.green, 10f); + } + if (check) + { + Debug.LogError("AABBCollideWithBrush pos = " + hits[0].point + " name = " + hits[0].collider.name); + } + if (Math.Abs(hits[0].distance - 0f) < float.Epsilon) + { + brushTraceInfo.bStartSolid = true; + } + else + { + brushTraceInfo.fFraction = (hits[0].distance) / vDelta.magnitude; + brushTraceInfo.normal = EC_Utility.ToA3DVECTOR3(hits[0].normal); + hitPoint = hits[0].point; + if (check) { - brushTraceInfo.bStartSolid = true; - } - else - { - brushTraceInfo.fFraction = (hits[0].distance) / vDelta.magnitude; - brushTraceInfo.normal = EC_Utility.ToA3DVECTOR3(hits[0].normal); - hitPoint = hits[0].point; - return true; + Debug.LogError("AABBCollideWithBrush true pos = " + hits[0].point); } + return true; } } brushTraceInfo.normal = new A3DVECTOR3(0f); brushTraceInfo.fFraction = 100f; + if (check) + { + Debug.LogError("AABBCollideWithBrush false = "); + } return false; } @@ -1423,9 +1479,11 @@ namespace BrewMonster return true; } - static float DotProduct(A3DVECTOR3 v1, A3DVECTOR3 v2) { return v1.x* v2.x + v1.y* v2.y + v1.z* v2.z; + static float DotProduct(A3DVECTOR3 v1, A3DVECTOR3 v2) { return v1.x* v2.x + v1.y* v2.y + v1.z* v2.z;} } -} + + + public struct OtherPlayer_Move_Info { // Bounding sphere of avator @@ -1489,4 +1547,113 @@ namespace BrewMonster // still be satisfied, bMeetHeightThresh is set to true. public bool bMeetHeightThresh; }; + + public static class BoxCastDrawer + { + /// + /// Vẽ BoxCast để Debug + /// + /// Thời gian tồn tại của đường kẻ (giây). Mặc định là 0 (1 frame) + public static void Draw( + Vector3 center, + Vector3 halfExtents, + Vector3 direction, + Quaternion orientation, + float distance, + RaycastHit[] hits, + int hitCount, + Color color, + float duration = 0f) // Thêm tham số duration ở đây + { + // 1. Tính toán các góc + Vector3[] startCorners = GetBoxCorners(center, halfExtents, orientation); + + float drawDistance = distance; + if (hitCount > 0) + { + float minDistance = distance; + for (int i = 0; i < hitCount; i++) + { + if (hits[i].distance < minDistance && hits[i].distance > 0) + minDistance = hits[i].distance; + } + drawDistance = minDistance; + } + + Vector3 endCenter = center + direction.normalized * drawDistance; + Vector3[] endCorners = GetBoxCorners(endCenter, halfExtents, orientation); + + // 2. Thiết lập màu sắc + //Color color = hitCount > 0 ? Color.red : Color.green; + //Color sweepColor = new Color(0.5f, 0.5f, 0.5f, 0.5f); // Màu xám mờ + Color sweepColor = color; // Màu xám mờ + + // 3. VẼ TÂM (CENTER) - Hiển thị trục tọa độ Local của hộp + DrawCenterAxis(center, orientation, 0.3f, duration); // Tâm bắt đầu + DrawCenterAxis(endCenter, orientation, 0.3f, duration); // Tâm kết thúc + + // 3. Vẽ các đường Line với Duration + for (int i = 0; i < 4; i++) + { + // Vẽ hộp bắt đầu + Debug.DrawLine(startCorners[i], startCorners[(i + 1) % 4], color, duration); + Debug.DrawLine(startCorners[i + 4], startCorners[((i + 1) % 4) + 4], color, duration); + Debug.DrawLine(startCorners[i], startCorners[i + 4], color, duration); + + // Vẽ hộp kết thúc/va chạm + Debug.DrawLine(endCorners[i], endCorners[(i + 1) % 4], color, duration); + Debug.DrawLine(endCorners[i + 4], endCorners[((i + 1) % 4) + 4], color, duration); + Debug.DrawLine(endCorners[i], endCorners[i + 4], color, duration); + + // Vẽ các đường nối (Sweep lines) + Debug.DrawLine(startCorners[i], endCorners[i], sweepColor, duration); + Debug.DrawLine(startCorners[i + 4], endCorners[i + 4], sweepColor, duration); + } + + // 4. Vẽ chi tiết va chạm + for (int i = 0; i < hitCount; i++) + { + // Vẽ pháp tuyến (Normal) tại điểm chạm + Debug.DrawRay(hits[i].point, hits[i].normal * 0.5f, Color.yellow, duration); + // Vẽ một dấu X nhỏ tại điểm va chạm chính xác + DrawCross(hits[i].point, 0.1f, Color.cyan, duration); + } + } + + private static void DrawCross(Vector3 point, float size, Color color, float duration) + { + Debug.DrawLine(point + Vector3.up * size, point - Vector3.up * size, color, duration); + Debug.DrawLine(point + Vector3.right * size, point - Vector3.right * size, color, duration); + Debug.DrawLine(point + Vector3.forward * size, point - Vector3.forward * size, color, duration); + } + + private static Vector3[] GetBoxCorners(Vector3 center, Vector3 halfExtents, Quaternion orientation) + { + Vector3[] corners = new Vector3[8]; + Vector3 h = halfExtents; + corners[0] = center + orientation * new Vector3(-h.x, -h.y, h.z); + corners[1] = center + orientation * new Vector3(h.x, -h.y, h.z); + corners[2] = center + orientation * new Vector3(h.x, h.y, h.z); + corners[3] = center + orientation * new Vector3(-h.x, h.y, h.z); + corners[4] = center + orientation * new Vector3(-h.x, -h.y, -h.z); + corners[5] = center + orientation * new Vector3(h.x, -h.y, -h.z); + corners[6] = center + orientation * new Vector3(h.x, h.y, -h.z); + corners[7] = center + orientation * new Vector3(-h.x, h.y, -h.z); + return corners; + } + + public static void DrawCenterAxis(Vector3 pos, Quaternion rot, float size, float duration) + { + Debug.DrawRay(pos, rot * Vector3.right * size, Color.red, duration); + Debug.DrawRay(pos, rot * Vector3.up * size, Color.green, duration); + Debug.DrawRay(pos, rot * Vector3.forward * size, Color.blue, duration); + + // Vẽ thêm một khối diamond nhỏ màu trắng tại tâm để dễ nhận diện + float s = size * 0.2f; + Debug.DrawLine(pos + rot * Vector3.up * s, pos + rot * Vector3.right * s, Color.white, duration); + Debug.DrawLine(pos + rot * Vector3.right * s, pos - rot * Vector3.up * s, Color.white, duration); + Debug.DrawLine(pos - rot * Vector3.up * s, pos - rot * Vector3.left * s, Color.white, duration); + Debug.DrawLine(pos - rot * Vector3.left * s, pos + rot * Vector3.up * s, Color.white, duration); + } + } } diff --git a/Assets/Scenes/a61.unity b/Assets/Scenes/a61.unity index 3fee0d9cea..c9c8d55992 100644 --- a/Assets/Scenes/a61.unity +++ b/Assets/Scenes/a61.unity @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4998c3fd4977cc180a6b20f03502e6e6d150dfa206d77d4e4c30a83700377c8d -size 5918457 +oid sha256:22d2dd330d4c89637e26553582e52c7587f88277f0593ba28a6206bcb69394d4 +size 5919058 diff --git a/Assets/Scripts/CECHostPlayer.World.cs b/Assets/Scripts/CECHostPlayer.World.cs index 4b691dc090..aef542090c 100644 --- a/Assets/Scripts/CECHostPlayer.World.cs +++ b/Assets/Scripts/CECHostPlayer.World.cs @@ -21,6 +21,7 @@ namespace BrewMonster handle.AddrOfPinnedObject(), typeof(cmd_host_correct_pos)); handle.Free(); //cmd_host_correct_pos pCmd = GPDataTypeHelper.FromBytes((byte[])Msg.dwParam1); + Debug.LogError("OnMsgHstCorrectPos = " + pCmd.pos); SetPos(pCmd.pos); m_vVelocity.Clear(); m_CDRInfo.vAbsVelocity.Clear(); From 51092862ed8e36cb10f83aaaad793bad9b29ac65 Mon Sep 17 00:00:00 2001 From: Tungdv Date: Sun, 31 May 2026 18:01:16 +0700 Subject: [PATCH 2/2] fix: update logic move. --- .../Scripts/Managers/EC_HPWorkFly.cs | 1 - .../Scripts/Managers/EC_HPWorkStand.cs | 3 +- .../Scripts/Managers/EC_HostInputFilter.cs | 2 +- Assets/PerfectWorld/Scripts/Move/EC_CDR.cs | 147 ++++++++++-------- Assets/Scripts/CECHostPlayer.World.cs | 2 +- Assets/Scripts/CECHostPlayer.cs | 19 +-- 6 files changed, 94 insertions(+), 80 deletions(-) diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkFly.cs b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkFly.cs index 3ad168a30c..785023fdab 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkFly.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkFly.cs @@ -116,7 +116,6 @@ namespace BrewMonster.Scripts m_pHost.PlayAction((int)PLAYER_ACTION_TYPE.ACT_TAKEOFF); else { - Debug.LogError("(int)PLAYER_ACTION_TYPE.ACT_TAKEOFF_SWORD"); m_pHost.PlayAction((int)PLAYER_ACTION_TYPE.ACT_TAKEOFF_SWORD); } } diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkStand.cs b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkStand.cs index 2c4c8b2301..ecd61f5a1a 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkStand.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkStand.cs @@ -139,7 +139,6 @@ namespace BrewMonster.Scripts public override bool Tick(float dwDeltaTime) { base.Tick(dwDeltaTime); - int iMoveReason = ShouldMove(); if (iMoveReason != 0) { @@ -282,4 +281,4 @@ namespace BrewMonster.Scripts return m_bStopSlide; } } -} \ No newline at end of file +} diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_HostInputFilter.cs b/Assets/PerfectWorld/Scripts/Managers/EC_HostInputFilter.cs index 59f224fcfc..e1f2fcc4eb 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_HostInputFilter.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_HostInputFilter.cs @@ -219,7 +219,7 @@ namespace BrewMonster Vector3 vDelta = vDest - vStart; const int allLayers = -1; - if (Physics.RaycastNonAlloc(ray, hits, Mathf.Infinity, allLayers) > 0) + if (Physics.RaycastNonAlloc(ray, hits, maxDistance: 1000f, allLayers) > 0) { int hostCid = GetCharacterID(); CECObject clickedObject = null; diff --git a/Assets/PerfectWorld/Scripts/Move/EC_CDR.cs b/Assets/PerfectWorld/Scripts/Move/EC_CDR.cs index 982a9e6330..1312cd3726 100644 --- a/Assets/PerfectWorld/Scripts/Move/EC_CDR.cs +++ b/Assets/PerfectWorld/Scripts/Move/EC_CDR.cs @@ -1,14 +1,9 @@ using BrewMonster.Network; using BrewMonster.Scripts; -using BrewMonster.Scripts.Ornament; using BrewMonster.Scripts.World; using CSNetwork.GPDataType; using System; -using System.Reflection; using UnityEngine; -using UnityEngine.UI; -using static BrewMonster.CECHostMove; -using static System.Net.Mime.MediaTypeNames; using WORD = System.UInt16; namespace BrewMonster @@ -159,7 +154,7 @@ namespace BrewMonster vTerStart.y = fHitsTerrain[0].point.y; } } - fHitsTerrain = new RaycastHit[5]; + countHits = Physics.RaycastNonAlloc(vTerStart, dir.normalized, fHitsTerrain, vDelta.magnitude, TerrainMask); if ((countHits > 0 && Vector3.Distance(vTerStart, fHitsTerrain[0].point) > 0.0009f)) { @@ -194,13 +189,13 @@ namespace BrewMonster else { float h0 = 0f; - int countHits0 = Physics.RaycastNonAlloc(vWatStart + Vector3.up * 500f, Vector3.down, fHitsWater, 1000f, WaterMask); + int countHits0 = Physics.RaycastNonAlloc(vWatStart + Vector3.up * 500f, Vector3.down, fHitsWater, maxDistance: 1000f, WaterMask); if (countHits0 > 0) { h0 = fHitsWater[0].point.y; } float h1 = 0f; - countHits0 = Physics.RaycastNonAlloc((vWatStart + vDelta) + Vector3.up * 500f, Vector3.down, fHitsWater, 1000f, WaterMask); + countHits0 = Physics.RaycastNonAlloc((vWatStart + vDelta) + Vector3.up * 500f, Vector3.down, fHitsWater, maxDistance: 1000f, WaterMask); if(countHits0 > 0) { h1 = fHitsWater[0].point.y; @@ -251,8 +246,21 @@ namespace BrewMonster int countHits = Physics.RaycastNonAlloc(origin, Vector3.down, hits, dist, mask); if (countHits > 0) { - vHitNormal = hits[0].normal; - vEnd = new Vector3(vStart.x, hits[0].point.y + vExt.y, vStart.z); + float minDistance = 100f; + int idx = 0; + for (int i = 0; i < countHits; i++) + { + if (hits[i].collider != null && hits[i].distance > 0f) + { + if(hits[i].distance < minDistance) + { + minDistance = hits[i].distance; + idx = i; + } + } + } + vHitNormal = hits[idx].normal; + vEnd = new Vector3(vStart.x, hits[idx].point.y + vExt.y, vStart.z); bSupport = (vHitNormal.y >= 0f); return true; } @@ -563,7 +571,6 @@ namespace BrewMonster { //a_LogOutput(1, "bClear = true"); vFinalPos = vStart + vDelta; - Debug.LogError("bClear = true " + vFinalPos); break; } @@ -582,7 +589,6 @@ namespace BrewMonster tmpInfo.vTerStart = vStart; tmpInfo.vTerStart.y -= vExt.y; //bPull = !CollideWithEnv(ref tmpInfo); - Debug.LogError("CheckFootStepUp"); bPull = !CheckFootStepUp(tmpInfo); //int count1 = Physics.RaycastNonAlloc(EC_Utility.ToVector3(tmpInfo.vStart), EC_Utility.ToVector3(tmpInfo.vDelta).normalized, hits, EC_Utility.ToVector3(tmpInfo.vDelta).magnitude, BrushMask | TerrainMask); @@ -699,7 +705,6 @@ namespace BrewMonster if (groundTrc.bSupport) { vFinalPos = groundTrc.vEnd; - Debug.LogError("vFinalPos = " + vFinalPos); if (!bJump) { vTPNormal = groundTrc.vHitNormal; @@ -725,7 +730,6 @@ namespace BrewMonster Vector3 vDelta = EC_Utility.ToVector3(pEnvTrc.vDelta); Vector3 dir = vDelta; int countHits = 0; - float num = 10f; countHits = Physics.BoxCastNonAlloc(vStart, vExt, dir.normalized, hits, Quaternion.identity, vDelta.magnitude, BrushMask); if (countHits > 0) { @@ -770,8 +774,6 @@ namespace BrewMonster return false; } pTrc.vEnd = trcInfo.vStart + trcInfo.vDelta * trcInfo.fFraction; - if(check) - Debug.LogError("trcInfo.fFraction = " + trcInfo.fFraction + " trcInfo.vStart = " + trcInfo.vStart + " pTrc.vEnd = " + pTrc.vEnd); pTrc.vEnd.y = hitPoint.y + pTrc.vExt.y + 0.1f; //if((pTrc.vEnd.y + 0.17f) < (hitPoint.y + pTrc.vExt.y + 0.1f)) //{ @@ -813,19 +815,26 @@ namespace BrewMonster { vPosOnSurface = vPos; int countHits = 0; - countHits = Physics.RaycastNonAlloc(EC_Utility.ToVector3(vPosOnSurface), Vector3.down, fHitsTerrain,maxDistance: 1000f, TerrainMask); + countHits = Physics.RaycastNonAlloc(EC_Utility.ToVector3(vPosOnSurface), Vector3.down, fHitsTerrain, maxDistance: 1000f, TerrainMask); if (countHits > 0) { - System.Array.Sort(fHitsTerrain, 0, fHitsTerrain.Length, raycastHitDistanceComparer); - for(int i = 0; i < fHitsTerrain.Length; i++) + int idx = 0; + float maxDistance = 100f; + //System.Array.Sort(fHitsTerrain, 0, fHitsTerrain.Length, raycastHitDistanceComparer); + for (int i = 0; i < countHits; i++) { - if (fHitsTerrain[i].distance > 0.0009f) + if (fHitsTerrain[i].collider != null && fHitsTerrain[i].distance > 0f) { - vPosOnSurface.y = fHitsTerrain[i].point.y; - vNormal = EC_Utility.ToA3DVECTOR3(fHitsTerrain[i].normal); - return; + if(fHitsTerrain[i].distance < maxDistance) + { + maxDistance = fHitsTerrain[i].distance; + idx = i; + } } } + vPosOnSurface.y = fHitsTerrain[idx].point.y; + vNormal = EC_Utility.ToA3DVECTOR3(fHitsTerrain[idx].normal); + return; } } @@ -1027,28 +1036,36 @@ namespace BrewMonster Vector3 vDelta = EC_Utility.ToVector3(brushTraceInfo.vDelta); Vector3 dir = vDelta; int countHits = 0; - float num = 10f; - //Quaternion quaternion = EC_Game.GetGameRun().GetWorld().GetPlayerMan().GetHostPlayer().transform.rotation; - Vector3[] arrVExt = new Vector3[5] { - vExt - ,new Vector3(vExt.x / num, vExt.y, vExt.z), - new Vector3(vExt.x, vExt.y / num, vExt.z), - new Vector3(vExt.x, vExt.y, vExt.z / num), - vExt / num - }; - for (int i = 0; i < arrVExt.Length; i++) + float fFraction = 100f; + Vector3 normal = Vector3.zero; + Vector3 hitP = Vector3.zero; + countHits = Physics.BoxCastNonAlloc(vStart, vExt, dir.normalized, hits, Quaternion.identity, vDelta.magnitude, BrushMask); + for (int i = 0; i < countHits; i++) { - countHits = Physics.BoxCastNonAlloc(vStart, arrVExt[i], dir.normalized, hits, Quaternion.identity, vDelta.magnitude, BrushMask); - if (countHits > 0) + if (hits[i].collider != null && hits[i].distance > 0f) { - if(hits[0].distance > 0.0009f) + float value = (hits[i].distance) / vDelta.magnitude; + if (value < fFraction) { - brushTraceInfo.fFraction = (hits[0].distance) / vDelta.magnitude; - brushTraceInfo.normal = EC_Utility.ToA3DVECTOR3(hits[0].normal); - return true; + fFraction = value; + normal = hits[i].normal; + hitP = hits[i].point; } } } + if (fFraction < 100f) + { + if (fFraction > 0f && fFraction <= 1f) + { + brushTraceInfo.fFraction = fFraction; + brushTraceInfo.normal = EC_Utility.ToA3DVECTOR3(normal); + } + if (Math.Abs(fFraction - 0f) < float.Epsilon) + { + brushTraceInfo.bStartSolid = true; + } + return true; + } brushTraceInfo.normal = new A3DVECTOR3(0f); brushTraceInfo.fFraction = 100f; return false; @@ -1061,42 +1078,40 @@ namespace BrewMonster Vector3 vDelta = EC_Utility.ToVector3(brushTraceInfo.vDelta); Vector3 dir = vDelta; int countHits = 0; - float num = 10f; + float fFraction = 100f; + Vector3 normal = Vector3.zero; + Vector3 hitP = Vector3.zero; countHits = Physics.BoxCastNonAlloc(vStart, vExt, dir.normalized, hits, Quaternion.identity, vDelta.magnitude, BrushMask); - if (countHits > 0) + for (int i = 0; i < countHits; i++) { - System.Array.Sort(hits, 0, hits.Length, raycastHitDistanceComparer); - if (check) + if (hits[i].collider != null && hits[i].distance > 0f) { - BoxCastDrawer.Draw(vStart, vExt, vDelta.normalized, - Quaternion.identity, vDelta.magnitude, hits, 1, Color.green, 10f); + float value = (hits[i].distance) / vDelta.magnitude; + if(value < fFraction) + { + fFraction = value; + normal = hits[i].normal; + hitP = hits[i].point; + } } - if (check) + } + if(fFraction < 100f) + { + if(fFraction > 0f && fFraction <= 1f) { - Debug.LogError("AABBCollideWithBrush pos = " + hits[0].point + " name = " + hits[0].collider.name); + brushTraceInfo.fFraction = fFraction; + brushTraceInfo.normal = EC_Utility.ToA3DVECTOR3(normal); + hitPoint = hitP; } - if (Math.Abs(hits[0].distance - 0f) < float.Epsilon) + if (Math.Abs(fFraction - 0f) < float.Epsilon) { brushTraceInfo.bStartSolid = true; } - else - { - brushTraceInfo.fFraction = (hits[0].distance) / vDelta.magnitude; - brushTraceInfo.normal = EC_Utility.ToA3DVECTOR3(hits[0].normal); - hitPoint = hits[0].point; - if (check) - { - Debug.LogError("AABBCollideWithBrush true pos = " + hits[0].point); - } - return true; - } + return true; } brushTraceInfo.normal = new A3DVECTOR3(0f); brushTraceInfo.fFraction = 100f; - if (check) - { - Debug.LogError("AABBCollideWithBrush false = "); - } + hitPoint = Vector3.zero; return false; } @@ -1209,7 +1224,7 @@ namespace BrewMonster awmInfo.bMeetHeightThresh = true; float fHWater = 0f; - int countHits0 = Physics.RaycastNonAlloc(EC_Utility.ToVector3(vFinalPos) + Vector3.up * 500f, Vector3.down, fHitsWater, 1000f, 1 << 8); + int countHits0 = Physics.RaycastNonAlloc(EC_Utility.ToVector3(vFinalPos) + Vector3.up * 500f, Vector3.down, fHitsWater, maxDistance: 1000f, WaterMask); if (countHits0 > 0) { fHWater = fHitsWater[0].point.y; @@ -1321,7 +1336,7 @@ namespace BrewMonster {//rescue from solid //@note : it may cause some problems. By Kuiwu[11/10/2005] float fHWater = 0f; - int countHits0 = Physics.RaycastNonAlloc(EC_Utility.ToVector3(vStart) + Vector3.up * 500f, Vector3.down, fHitsWater, 1000f, 1 << 8); + int countHits0 = Physics.RaycastNonAlloc(EC_Utility.ToVector3(vStart) + Vector3.up * 500f, Vector3.down, fHitsWater, maxDistance: 1000f, WaterMask); if(countHits0 > 0) { fHWater = fHitsWater[0].point.y; @@ -1374,7 +1389,7 @@ namespace BrewMonster if (bAdjust && (vOverTp.y + awmInfo.fHeightThresh > vFinalPos.y)) { float fHWater = 0f; - int countHits = Physics.RaycastNonAlloc(EC_Utility.ToVector3(vFinalPos), Vector3.down, fHitsWater, 1000f, 1 << 8); + int countHits = Physics.RaycastNonAlloc(EC_Utility.ToVector3(vFinalPos), Vector3.down, fHitsWater, maxDistance: 1000f, WaterMask); if (countHits > 0) { fHWater = fHitsWater[0].point.y; diff --git a/Assets/Scripts/CECHostPlayer.World.cs b/Assets/Scripts/CECHostPlayer.World.cs index aef542090c..68ce17d8af 100644 --- a/Assets/Scripts/CECHostPlayer.World.cs +++ b/Assets/Scripts/CECHostPlayer.World.cs @@ -213,7 +213,7 @@ namespace BrewMonster // 注意:暂时跳过地形高度检查,因为它需要世界访问 A3DVECTOR3 vNormal = new A3DVECTOR3(); float vTerrainHeight = vPos.y; - if (Physics.RaycastNonAlloc(vPos, (Vector3.down), hits, 1000f, 1 << 6) > 0) + if (Physics.RaycastNonAlloc(vPos, (Vector3.down), hits, maxDistance: 1000f, EC_CDR.TerrainMask) > 0) { vTerrainHeight = hits[0].point.y; vNormal = EC_Utility.ToA3DVECTOR3(hits[0].normal); diff --git a/Assets/Scripts/CECHostPlayer.cs b/Assets/Scripts/CECHostPlayer.cs index 9a296d95c5..932f7bf2f9 100644 --- a/Assets/Scripts/CECHostPlayer.cs +++ b/Assets/Scripts/CECHostPlayer.cs @@ -1390,9 +1390,9 @@ namespace BrewMonster m_CDRInfo.vExtent = m_aabbServer.Extents; Vector3 pStart = pos; pos.y += m_CDRInfo.vExtent.y; - if (Physics.RaycastNonAlloc(pos, Vector3.down, hits, m_CDRInfo.vExtent.y, 1 << 6) > 0) + if (Physics.RaycastNonAlloc(pos, Vector3.down, hits, m_CDRInfo.vExtent.y, EC_CDR.TerrainMask) > 0) { - System.Array.Sort(hits, 0, hits.Length, raycastHitDistanceComparer); + //System.Array.Sort(hits, 0, hits.Length, raycastHitDistanceComparer); m_CDRInfo.vTPNormal = EC_Utility.ToA3DVECTOR3(hits[0].normal); } else @@ -1799,14 +1799,14 @@ namespace BrewMonster float fTerrainHeight = 0f; if (Physics.RaycastNonAlloc(startPoint, dir, hits, layerGround) > 0) { - System.Array.Sort(hits, 0, hits.Length, raycastHitDistanceComparer); + //System.Array.Sort(hits, 0, hits.Length, raycastHitDistanceComparer); fTerrainHeight = Vector3.Distance(hits[0].point, startPoint); } float fWaterHeight = 0f; if (Physics.RaycastNonAlloc(startPoint, dir, hits, layerWater) > 0) { - System.Array.Sort(hits, 0, hits.Length, raycastHitDistanceComparer); + //System.Array.Sort(hits, 0, hits.Length, raycastHitDistanceComparer); fWaterHeight = Vector3.Distance(hits[0].point, startPoint); } @@ -2459,10 +2459,10 @@ namespace BrewMonster A3DVECTOR3 vPos = GetPos(); float h0 = 0f; - int countHits0 = Physics.RaycastNonAlloc(EC_Utility.ToVector3(vPos) + Vector3.up * 500f, Vector3.down, hits, 1000f, 1 << 8); + int countHits0 = Physics.RaycastNonAlloc(EC_Utility.ToVector3(vPos) + Vector3.up * 500f, Vector3.down, hits, maxDistance: 1000f, EC_CDR.WaterMask); if (countHits0 > 0) { - System.Array.Sort(hits, 0, hits.Length, raycastHitDistanceComparer); + //System.Array.Sort(hits, 0, hits.Length, raycastHitDistanceComparer); h0 = hits[0].point.y; } if (vPos.y < h0 - m_MoveConst.fShoreDepth) @@ -3184,7 +3184,7 @@ namespace BrewMonster VertRayTrace(EC_Utility.ToVector3(vTestPos), ref vGndPos, ref m_GndInfo.vGndNormal, 1000f); m_GndInfo.fGndHei = vGndPos.y; - if (Physics.RaycastNonAlloc(EC_Utility.ToVector3(vTestPos) + Vector3.up * 500f, Vector3.down, hits, 1000f, 1 << 8) > 0) + if (Physics.RaycastNonAlloc(EC_Utility.ToVector3(vTestPos) + Vector3.up * 500f, Vector3.down, hits, maxDistance: 1000f, EC_CDR.WaterMask) > 0) { System.Array.Sort(hits, 0, hits.Length, raycastHitDistanceComparer); m_GndInfo.fWaterHei = hits[0].point.y; @@ -3286,9 +3286,10 @@ namespace BrewMonster LayerMask layerMaskTerrain = 1 << 6; LayerMask layerMaskBush = 1 << 7; - if (Physics.RaycastNonAlloc(vPos, (Vector3.down), hits, 1000f, layerMaskTerrain) > 0 /*&& hits[0].distance > 0.0009f*/) + + if (Physics.RaycastNonAlloc(vPos, (Vector3.down), hits, maxDistance: 1000f, layerMaskTerrain) > 0 /*&& hits[0].distance > 0.0009f*/) { - System.Array.Sort(hits, 0, hits.Length, raycastHitDistanceComparer); + //System.Array.Sort(hits, 0, hits.Length, raycastHitDistanceComparer); vTerrainPos = hits[0].point; vTerrainNormal = hits[0].normal; }