From df792f0560a37eea8cd0f1923f7dfe8b6fdb2055 Mon Sep 17 00:00:00 2001 From: Tungdv Date: Tue, 16 Dec 2025 17:32:16 +0700 Subject: [PATCH 1/4] Fix: update check brush. --- Assets/PerfectWorld/Scripts/Move/EC_CDR.cs | 159 ++++++++------------- 1 file changed, 63 insertions(+), 96 deletions(-) diff --git a/Assets/PerfectWorld/Scripts/Move/EC_CDR.cs b/Assets/PerfectWorld/Scripts/Move/EC_CDR.cs index c32d5ba7c1..e0d7b0c6ba 100644 --- a/Assets/PerfectWorld/Scripts/Move/EC_CDR.cs +++ b/Assets/PerfectWorld/Scripts/Move/EC_CDR.cs @@ -101,34 +101,44 @@ namespace BrewMonster pEnvTrc.fFraction = 100.0f; pEnvTrc.bStartSolid = false; pEnvTrc.dwClsFlag = 0; + Vector3 vStart = EC_Utility.ToVector3(pEnvTrc.vStart); + Vector3 vExt = EC_Utility.ToVector3(pEnvTrc.vExt); + Vector3 vDelta = EC_Utility.ToVector3(pEnvTrc.vDelta); + Vector3 vTerStart = EC_Utility.ToVector3(pEnvTrc.vTerStart); + Vector3 dir = Vector3.zero; + if ((pEnvTrc.dwCheckFlag & CDR_EVN.CDR_BRUSH) == CDR_EVN.CDR_BRUSH) { - BrushTraceInfo bruInfo = new BrushTraceInfo(); - bruInfo.Init(pEnvTrc.vStart, pEnvTrc.vDelta, pEnvTrc.vExt); - if (AABBCollideWithBrush(ref bruInfo)) + dir = vStart + vDelta; + if (Physics.BoxCast(vStart, vExt, dir, out RaycastHit hit, Quaternion.identity, vDelta.magnitude, 1 << 7)) { - pEnvTrc.fFraction = bruInfo.fFraction; - pEnvTrc.vHitNormal = bruInfo.ClipPlane.GetNormal(); - pEnvTrc.bStartSolid = bruInfo.bStartSolid; + pEnvTrc.fFraction = (hit.distance - vExt.x) / vDelta.magnitude; + pEnvTrc.vHitNormal = EC_Utility.ToA3DVECTOR3(hit.normal); pEnvTrc.dwClsFlag = CDR_EVN.CDR_BRUSH; } + else + { + pEnvTrc.fFraction = 1f; + } } if ((pEnvTrc.dwCheckFlag & CDR_EVN.CDR_TERRAIN) == CDR_EVN.CDR_TERRAIN) { - float fFraction = 0f; - A3DVECTOR3 vTerNormal = new A3DVECTOR3(); - bool bStart = false; - if (CollideWithTerrain(pEnvTrc.vTerStart, pEnvTrc.vDelta, ref fFraction, ref vTerNormal, ref bStart) - && (fFraction < pEnvTrc.fFraction)) + float fFractionTerrain = 0f; + dir = vDelta; + if (Physics.Raycast(vTerStart, dir.normalized, out RaycastHit hit, vDelta.magnitude, 1<<6)) { - //assert(fFraction >= 0.0f); - //pEnvTrc.fFraction = a_Max(0.0f, fFraction - 1E-4f); - pEnvTrc.fFraction = fFraction; - pEnvTrc.vHitNormal = vTerNormal; - pEnvTrc.bStartSolid = bStart; + fFractionTerrain = (hit.distance) / vDelta.magnitude; + pEnvTrc.vHitNormal = EC_Utility.ToA3DVECTOR3(hit.normal); pEnvTrc.dwClsFlag = CDR_EVN.CDR_TERRAIN; } - + else + { + fFractionTerrain = 1f; + } + if(fFractionTerrain < pEnvTrc.fFraction) + { + pEnvTrc.fFraction = fFractionTerrain; + } } if ((pEnvTrc.dwCheckFlag & CDR_EVN.CDR_WATER) == CDR_EVN.CDR_WATER) @@ -156,46 +166,6 @@ namespace BrewMonster return (pEnvTrc.fFraction < 1.0f + 1E-4f); } - // == Thay CollideWithEnv (C++) bằng BoxCast == - //static bool CollideWithEnv_BoxCast(Vector3 vStart, Vector3 vDelta, Vector3 vExt, - // LayerMask mask, - // out RaycastHit hit, out float fFraction, out Vector3 vHitNormal, out bool bStartSolid, - // float skin = 0.01f) - //{ - // hit = default; - // vHitNormal = Vector3.up; - // bStartSolid = false; - // fFraction = 0.0f; - - // float dist = vDelta.magnitude; - // if (dist <= 1e-6f) return false; - - // var hasHit = Physics.Raycast(vStart, vDelta,out hit, dist, mask); - // if (hasHit) - // { - // bStartSolid = true; - // fFraction = (t - 5E-4f) / vDelta.Normalize(); - // return true; - // } - // // start-in-solid - // var overlapped = Physics.OverlapBox(vStart, vExt - Vector3.one * skin, Quaternion.identity, mask, QueryTriggerInteraction.Ignore); - // if (overlapped != null && overlapped.Length > 0) - // { - // bStartSolid = true; - // return true; - // } - - // // sweep AABB - // Vector3 dir = vDelta / Mathf.Max(dist, 1e-6f); - // if (Physics.BoxCast(vStart, vExt - Vector3.one * skin, dir, out hit, Quaternion.identity, dist, mask, QueryTriggerInteraction.Ignore)) - // { - // fFraction = Mathf.Clamp01(hit.distance / Mathf.Max(dist, 1e-6f)); - // vHitNormal = hit.normal; - // return true; - // } - // return false; - //} - // == Thay RetrieveSupportPlane (C++) bằng Raycast xuống == static bool DoGroundProbe(Vector3 vStart, Vector3 vExt, float fDeltaY, LayerMask mask, out Vector3 vEnd, out Vector3 vHitNormal, out bool bSupport, @@ -280,6 +250,10 @@ namespace BrewMonster int nTry = 0; LayerMask mask = UsedMask_Ground(); + env_trace_t trcInfo = new env_trace_t(); + trcInfo.dwCheckFlag = CDR_EVN.CDR_TERRAIN | CDR_EVN.CDR_BRUSH; + trcInfo.vExt = CDRInfo.vExtent; + while (nTry < 1) { vDelta = vVelocity * fTime; @@ -290,22 +264,20 @@ namespace BrewMonster //bool hasHit = CollideWithEnv_BoxCast(vStart, vDelta, vExt, mask, // out RaycastHit hit, out float fFraction, out Vector3 hitNormal, out bool bStartSolid); Vector3 posFoot = vStart - Vector3.up * vExt.y; - //if (Physics.BoxCast(vStart, vExt, (vStart + Vector3.down).normalized, out RaycastHit hit1, Quaternion.identity, vExt.y, mask)) - //{ - // if (hit1.point.y > posFoot.y) - // { - // Debug.LogError("hit.point.y > posFoot.y"); - // posFoot.y = hit1.point.y; - // } - //} - if (Physics.Raycast(vStart, (vStart + Vector3.down).normalized, out RaycastHit hit1, vExt.y, mask)) + + if (Physics.Raycast(vStart, (vStart + Vector3.down).normalized, out RaycastHit hit, vExt.y, mask)) { - if (hit1.point.y > posFoot.y) + if (hit.point.y > posFoot.y) { - posFoot.y = hit1.point.y; + posFoot.y = hit.point.y; } } - bool bClear = !Physics.Raycast(posFoot, (posFoot + vDelta).normalized, out RaycastHit hit, fDeltaDist, mask); + //bool bClear = !Physics.Raycast(posFoot, (posFoot + vDelta).normalized, out hit, fDeltaDist, mask); + trcInfo.vStart = CDRInfo.vCenter; + trcInfo.vDelta = EC_Utility.ToA3DVECTOR3(vDelta); + trcInfo.vTerStart = EC_Utility.ToA3DVECTOR3(posFoot); + //trcInfo.vTerStart.y -= vExt.y; //foot + bool bClear = !CollideWithEnv(ref trcInfo); nTry++; if (bClear) { @@ -314,17 +286,10 @@ namespace BrewMonster CDRInfo.fMoveDist += fDeltaDist; break; } - //if (trcInfo.bStartSolid) - //{ - // CDRInfo.fMoveDist = 0f; - // if (CDRInfo.vTPNormal.y < CDRInfo.fSlopeThresh) CDRInfo.vTPNormal = Vector3.up; - // return; - //} - vStart = hit.point + Vector3.up * vExt.y; + //vStart = hit.point + Vector3.up * vExt.y; + vStart = vDelta * trcInfo.fFraction + Vector3.up * vExt.y; + vFinalPos = vStart; - //CDRInfo.fMoveDist += (fDeltaDist * fFraction); - //fTime -= fTime * fFraction; - //vNormal = hitNormal; // Step-up (giữ tinh thần bản gốc) if (!bFreeFall && !bTryPull && !bJump) @@ -332,36 +297,38 @@ namespace BrewMonster //float skin = 0.01f; posFoot = vStart - Vector3.up * vExt.y + Vector3.up * CDRInfo.fStepHeight; Vector3 vStartUp = new Vector3(0f, CDRInfo.fStepHeight, 0f); - //if (Physics.Raycast(vStart, (vStart + Vector3.down).normalized, out hit1, vExt.y, mask)) - //{ - // if (hit1.point.y > posFoot.y) - // { - // Debug.LogError("hit.point.y > posFoot.y"); - // posFoot.y = hit1.point.y + CDRInfo.fStepHeight; - // } - //} - bPull = !Physics.Raycast(posFoot, (Vector3.up).normalized, out hit, CDRInfo.fStepHeight, mask); + //bPull = !Physics.Raycast(posFoot, (Vector3.up).normalized, out hit, CDRInfo.fStepHeight, mask); + + env_trace_t tmpInfo = new env_trace_t(); + tmpInfo.vStart = EC_Utility.ToA3DVECTOR3(vStart); + tmpInfo.vDelta = new A3DVECTOR3(0.0f, CDRInfo.fStepHeight, 0.0f); + tmpInfo.vExt = CDRInfo.vExtent; + //@note : need check terrain?? By Kuiwu[8/10/2005] + tmpInfo.dwCheckFlag = CDR_EVN.CDR_BRUSH | CDR_EVN.CDR_TERRAIN; + tmpInfo.vTerStart = EC_Utility.ToA3DVECTOR3(posFoot); + + bPull = !CollideWithEnv(ref tmpInfo); if (bPull) { vStart += Vector3.up * CDRInfo.fStepHeight; posFoot = vStart - Vector3.up * vExt.y; - //Vector3 vDelta2 = vVelocity; - bool bMove = !Physics.Raycast(posFoot, (posFoot + vVelocity).normalized, out hit, fDeltaDist, mask); + //bool bMove = !Physics.Raycast(posFoot, (posFoot + vVelocity).normalized, out hit, fDeltaDist, mask); + + tmpInfo.vStart = EC_Utility.ToA3DVECTOR3(vStart); + tmpInfo.vDelta = EC_Utility.ToA3DVECTOR3(vDelta); + tmpInfo.vTerStart = EC_Utility.ToA3DVECTOR3(posFoot); + bool bMove = !CollideWithEnv(ref tmpInfo); + if (!bMove) { //vDelta2 *= frac2; - vFinalPos = hit.point + Vector3.up * vExt.y; + vFinalPos = vDelta * tmpInfo.fFraction + Vector3.up * vExt.y; } else { Debug.DrawLine(vFinalPos, vFinalPos + vDelta, Color.red, 10f); vFinalPos += vDelta; } - //if (vDelta2.sqrMagnitude < (vExt.x * vExt.x * 4f)) - //{ - // vStart -= Vector3.up * CDRInfo.fStepHeight; - // bPull = false; - //} } bTryPull = true; } From 97bf43338105ee94534769962b47ead3f5a8a206 Mon Sep 17 00:00:00 2001 From: Tungdv Date: Wed, 17 Dec 2025 10:40:29 +0700 Subject: [PATCH 2/4] fix: update logic move on ground. feat: add btn jump. --- Assets/PerfectWorld/Prefab/UI/JumpBtn.prefab | 272 ++++++++++++++++++ .../Prefab/UI/JumpBtn.prefab.meta | 7 + .../Scripts/Managers/EC_HostInputFilter.cs | 46 +-- Assets/PerfectWorld/Scripts/Move/EC_CDR.cs | 57 ++-- Assets/PerfectWorld/Scripts/UI/JumpBtn.cs | 29 ++ .../PerfectWorld/Scripts/UI/JumpBtn.cs.meta | 2 + Assets/Scenes/a61.unity | 4 +- 7 files changed, 366 insertions(+), 51 deletions(-) create mode 100644 Assets/PerfectWorld/Prefab/UI/JumpBtn.prefab create mode 100644 Assets/PerfectWorld/Prefab/UI/JumpBtn.prefab.meta create mode 100644 Assets/PerfectWorld/Scripts/UI/JumpBtn.cs create mode 100644 Assets/PerfectWorld/Scripts/UI/JumpBtn.cs.meta diff --git a/Assets/PerfectWorld/Prefab/UI/JumpBtn.prefab b/Assets/PerfectWorld/Prefab/UI/JumpBtn.prefab new file mode 100644 index 0000000000..1db10eff5a --- /dev/null +++ b/Assets/PerfectWorld/Prefab/UI/JumpBtn.prefab @@ -0,0 +1,272 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &6426564401230013186 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3325367652782365102} + - component: {fileID: 6868997766477093256} + - component: {fileID: 2867419621240194058} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3325367652782365102 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6426564401230013186} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 266017875005995358} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0.9228058, y: 0.69200134} + m_SizeDelta: {x: -78.8826, y: -78.8826} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &6868997766477093256 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6426564401230013186} + m_CullTransparentMesh: 1 +--- !u!114 &2867419621240194058 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6426564401230013186} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: JUMP + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 44.7 + m_fontSizeBase: 24 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_TextWrappingMode: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 0 + m_ActiveFontFeatures: 6e72656b + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_EmojiFallbackSupport: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &6792439420010771896 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 266017875005995358} + - component: {fileID: 5557092053757495849} + - component: {fileID: 3695308113943472152} + - component: {fileID: 1194531703109065144} + - component: {fileID: 4432331937269434665} + m_Layer: 5 + m_Name: JumpBtn + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &266017875005995358 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6792439420010771896} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 3325367652782365102} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: -61, y: 46} + m_SizeDelta: {x: 200, y: 200} + m_Pivot: {x: 1, y: 0} +--- !u!222 &5557092053757495849 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6792439420010771896} + m_CullTransparentMesh: 1 +--- !u!114 &3695308113943472152 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6792439420010771896} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10913, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 1 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &1194531703109065144 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6792439420010771896} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 3695308113943472152} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &4432331937269434665 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6792439420010771896} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a6149141837cadc4baae427c4864833e, type: 3} + m_Name: + m_EditorClassIdentifier: diff --git a/Assets/PerfectWorld/Prefab/UI/JumpBtn.prefab.meta b/Assets/PerfectWorld/Prefab/UI/JumpBtn.prefab.meta new file mode 100644 index 0000000000..6f0963e6b7 --- /dev/null +++ b/Assets/PerfectWorld/Prefab/UI/JumpBtn.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 0104938c092195b40ab7f3b6e5bf342e +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_HostInputFilter.cs b/Assets/PerfectWorld/Scripts/Managers/EC_HostInputFilter.cs index 7ebe15b0b9..2ce3d28d84 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_HostInputFilter.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_HostInputFilter.cs @@ -19,27 +19,7 @@ namespace BrewMonster } if (Input.GetKeyDown(KeyCode.Space)) { - //if (bInAutoMode) return; - if (IsJumpInWater() || IsFlying()) - return; - - if (IsUnderWater()) - { - if (!CanTakeOffWater()) - return; - else if (_JumpTime <= 0) - { - _JumpTime = Time.realtimeSinceStartup; - return; - } - else if ((Time.realtimeSinceStartup - _JumpTime) < 1f) // logic in c++, _JumpTime is milisecond - return; - else - _JumpTime = -1f; - } - - m_GndInfo.bOnGround = GroundCheck(out lastGroundHit); - OnMsgHstJump(); + OnClickBtnJump(); } } @@ -208,5 +188,29 @@ namespace BrewMonster PlayAction((int)PLAYER_ACTION_TYPE.ACT_JUMP_LOOP, false, 0, true); } + public void OnClickBtnJump() + { + //if (bInAutoMode) return; + if (IsJumpInWater() || IsFlying()) + return; + + if (IsUnderWater()) + { + if (!CanTakeOffWater()) + return; + else if (_JumpTime <= 0) + { + _JumpTime = Time.realtimeSinceStartup; + return; + } + else if ((Time.realtimeSinceStartup - _JumpTime) < 1f) // logic in c++, _JumpTime is milisecond + return; + else + _JumpTime = -1f; + } + + m_GndInfo.bOnGround = GroundCheck(out lastGroundHit); + OnMsgHstJump(); + } } } diff --git a/Assets/PerfectWorld/Scripts/Move/EC_CDR.cs b/Assets/PerfectWorld/Scripts/Move/EC_CDR.cs index e0d7b0c6ba..a6a60bede3 100644 --- a/Assets/PerfectWorld/Scripts/Move/EC_CDR.cs +++ b/Assets/PerfectWorld/Scripts/Move/EC_CDR.cs @@ -124,7 +124,7 @@ namespace BrewMonster if ((pEnvTrc.dwCheckFlag & CDR_EVN.CDR_TERRAIN) == CDR_EVN.CDR_TERRAIN) { float fFractionTerrain = 0f; - dir = vDelta; + dir = vDelta; if (Physics.Raycast(vTerStart, dir.normalized, out RaycastHit hit, vDelta.magnitude, 1<<6)) { fFractionTerrain = (hit.distance) / vDelta.magnitude; @@ -264,7 +264,6 @@ namespace BrewMonster //bool hasHit = CollideWithEnv_BoxCast(vStart, vDelta, vExt, mask, // out RaycastHit hit, out float fFraction, out Vector3 hitNormal, out bool bStartSolid); Vector3 posFoot = vStart - Vector3.up * vExt.y; - if (Physics.Raycast(vStart, (vStart + Vector3.down).normalized, out RaycastHit hit, vExt.y, mask)) { if (hit.point.y > posFoot.y) @@ -272,22 +271,24 @@ namespace BrewMonster posFoot.y = hit.point.y; } } - //bool bClear = !Physics.Raycast(posFoot, (posFoot + vDelta).normalized, out hit, fDeltaDist, mask); - trcInfo.vStart = CDRInfo.vCenter; - trcInfo.vDelta = EC_Utility.ToA3DVECTOR3(vDelta); - trcInfo.vTerStart = EC_Utility.ToA3DVECTOR3(posFoot); - //trcInfo.vTerStart.y -= vExt.y; //foot - bool bClear = !CollideWithEnv(ref trcInfo); + + bool bClear = !Physics.Raycast(posFoot, (posFoot + vDelta).normalized, out hit, fDeltaDist, mask); + + //trcInfo.vStart = CDRInfo.vCenter; + //trcInfo.vDelta = EC_Utility.ToA3DVECTOR3(vDelta); + //trcInfo.vTerStart = EC_Utility.ToA3DVECTOR3(posFoot); + ////trcInfo.vTerStart.y -= vExt.y; //foot + //bool bClear = !CollideWithEnv(ref trcInfo); nTry++; if (bClear) { - Debug.DrawLine(posFoot, posFoot + vDelta, Color.yellow, 10f); + //Debug.DrawLine(posFoot, posFoot + vDelta, Color.yellow, 10f); vFinalPos = vStart + vDelta; CDRInfo.fMoveDist += fDeltaDist; break; } - //vStart = hit.point + Vector3.up * vExt.y; - vStart = vDelta * trcInfo.fFraction + Vector3.up * vExt.y; + vStart = hit.point + Vector3.up * vExt.y; + //vStart += vDelta * trcInfo.fFraction + Vector3.up * vExt.y; vFinalPos = vStart; @@ -297,32 +298,32 @@ namespace BrewMonster //float skin = 0.01f; posFoot = vStart - Vector3.up * vExt.y + Vector3.up * CDRInfo.fStepHeight; Vector3 vStartUp = new Vector3(0f, CDRInfo.fStepHeight, 0f); - //bPull = !Physics.Raycast(posFoot, (Vector3.up).normalized, out hit, CDRInfo.fStepHeight, mask); + bPull = !Physics.Raycast(posFoot, (Vector3.up).normalized, out hit, CDRInfo.fStepHeight, mask); - env_trace_t tmpInfo = new env_trace_t(); - tmpInfo.vStart = EC_Utility.ToA3DVECTOR3(vStart); - tmpInfo.vDelta = new A3DVECTOR3(0.0f, CDRInfo.fStepHeight, 0.0f); - tmpInfo.vExt = CDRInfo.vExtent; - //@note : need check terrain?? By Kuiwu[8/10/2005] - tmpInfo.dwCheckFlag = CDR_EVN.CDR_BRUSH | CDR_EVN.CDR_TERRAIN; - tmpInfo.vTerStart = EC_Utility.ToA3DVECTOR3(posFoot); + //env_trace_t tmpInfo = new env_trace_t(); + //tmpInfo.vStart = EC_Utility.ToA3DVECTOR3(vStart); + //tmpInfo.vDelta = new A3DVECTOR3(0.0f, CDRInfo.fStepHeight, 0.0f); + //tmpInfo.vExt = CDRInfo.vExtent; + ////@note : need check terrain?? By Kuiwu[8/10/2005] + //tmpInfo.dwCheckFlag = CDR_EVN.CDR_BRUSH | CDR_EVN.CDR_TERRAIN; + //tmpInfo.vTerStart = EC_Utility.ToA3DVECTOR3(posFoot); + //bPull = !CollideWithEnv(ref tmpInfo); - bPull = !CollideWithEnv(ref tmpInfo); if (bPull) { vStart += Vector3.up * CDRInfo.fStepHeight; posFoot = vStart - Vector3.up * vExt.y; - //bool bMove = !Physics.Raycast(posFoot, (posFoot + vVelocity).normalized, out hit, fDeltaDist, mask); + bool bMove = !Physics.Raycast(posFoot, (posFoot + vVelocity).normalized, out hit, fDeltaDist, mask); - tmpInfo.vStart = EC_Utility.ToA3DVECTOR3(vStart); - tmpInfo.vDelta = EC_Utility.ToA3DVECTOR3(vDelta); - tmpInfo.vTerStart = EC_Utility.ToA3DVECTOR3(posFoot); - bool bMove = !CollideWithEnv(ref tmpInfo); + //tmpInfo.vStart = EC_Utility.ToA3DVECTOR3(vStart); + //tmpInfo.vDelta = EC_Utility.ToA3DVECTOR3(vDelta); + //tmpInfo.vTerStart = EC_Utility.ToA3DVECTOR3(posFoot); + //bool bMove = !CollideWithEnv(ref tmpInfo); if (!bMove) { - //vDelta2 *= frac2; - vFinalPos = vDelta * tmpInfo.fFraction + Vector3.up * vExt.y; + vFinalPos = hit.point + Vector3.up * vExt.y; + //vFinalPos = vStart + vDelta * tmpInfo.fFraction + Vector3.up * vExt.y; } else { @@ -647,7 +648,7 @@ namespace BrewMonster vFinalPos = new A3DVECTOR3(vStart); int nTry = 0; bool bClear = true; - env_trace_t trcInfo; + env_trace_t trcInfo = new env_trace_t(); trcInfo.bWaterSolid = true; trcInfo.dwCheckFlag = CDR_EVN.CDR_TERRAIN | CDR_EVN.CDR_BRUSH | CDR_EVN.CDR_WATER; trcInfo.vExt = vExt; diff --git a/Assets/PerfectWorld/Scripts/UI/JumpBtn.cs b/Assets/PerfectWorld/Scripts/UI/JumpBtn.cs new file mode 100644 index 0000000000..e8ecd1d768 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/UI/JumpBtn.cs @@ -0,0 +1,29 @@ +using BrewMonster.Network; +using UnityEngine; +using UnityEngine.UI; + +namespace BrewMonster.UI +{ + public class JumpBtn : MonoBehaviour + { + Button jumpBtn; + + // Start is called once before the first execution of Update after the MonoBehaviour is created + void Start() + { + if(jumpBtn == null) + { + jumpBtn = GetComponent