From 97bf43338105ee94534769962b47ead3f5a8a206 Mon Sep 17 00:00:00 2001 From: Tungdv Date: Wed, 17 Dec 2025 10:40:29 +0700 Subject: [PATCH] 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