diff --git a/Assets/PerfectWorld/Scripts/Addressable/AddressableManager.cs b/Assets/PerfectWorld/Scripts/Addressable/AddressableManager.cs index 261c2e2f3d..2c47a3a28d 100644 --- a/Assets/PerfectWorld/Scripts/Addressable/AddressableManager.cs +++ b/Assets/PerfectWorld/Scripts/Addressable/AddressableManager.cs @@ -290,7 +290,6 @@ namespace BrewMonster.Scripts currentReleaseTime = Mathf.Min(currentReleaseTime, timeStamp); } _releaseAssetTimestamps[assetPath] = currentReleaseTime; - BMLogger.Log($"AddressableManager: Released asset: {assetPath}"); } public void ForceReleaseAsset(string assetPath) @@ -302,7 +301,6 @@ namespace BrewMonster.Scripts Addressables.Release(loadedPrefabHandle); } _loadedPrefabAssets.Remove(assetPath); - BMLogger.Log($"AddressableManager: Force released prefab asset: {assetPath}"); } else if (_loadedTextAssets.TryGetValue(assetPath, out var loadedTextHandle)) { @@ -311,7 +309,6 @@ namespace BrewMonster.Scripts Addressables.Release(loadedTextHandle); } _loadedTextAssets.Remove(assetPath); - BMLogger.Log($"AddressableManager: Force released text asset: {assetPath}"); } else if (_loadedAudioAssets.TryGetValue(assetPath, out var loadedAudioHandle)) { diff --git a/Assets/PerfectWorld/Scripts/Managers/CECAttacksMan.cs b/Assets/PerfectWorld/Scripts/Managers/CECAttacksMan.cs index a273b171af..88787c6d5f 100644 --- a/Assets/PerfectWorld/Scripts/Managers/CECAttacksMan.cs +++ b/Assets/PerfectWorld/Scripts/Managers/CECAttacksMan.cs @@ -567,11 +567,9 @@ namespace BrewMonster public string hitGrdGfxName; public async UniTask Load(SkillStub skillStub, string flyGFXPath, string hitGrdGFXPath, string hitGFXPath) { - flyGfxName = flyGFXPath; hitGfxName = hitGFXPath; hitGrdGfxName = hitGrdGFXPath; - // Load GFX prefabs / 加载GFX预制体 m_szFlyGfx = string.IsNullOrEmpty(flyGfxName) ? null : await AddressableManager.Instance.LoadPrefabAsync("gfx/" + flyGfxName); m_szHitGfx = string.IsNullOrEmpty(hitGfxName) ? null : await AddressableManager.Instance.LoadPrefabAsync("gfx/" + hitGfxName); @@ -873,7 +871,7 @@ public class CECAttackEvent public int m_nSkillSection; #if UNITY_EDITOR - int debugCounter = 0; // Debug counter to track Tick calls + int debugCounter = 0; // Debug counter to track Tick calls #endif public CECAttackEvent() { } @@ -1075,7 +1073,7 @@ public class CECAttackEvent if (bHideHitGfx) pszHitGFX = null; // TODO: Implement AddSkillGfxEvent - // CECGameRun.Instance.GetWorld().GetSkillGfxMan().AddSkillGfxEvent(m_idHost, data.idTarget, + // CECGameRun.Instance.GetWorld().GetSkillGfxMan().AddSkillGfxEvent(m_idHost, data.idTarget, // pszflyGFX, pszHitGFX, m_timeToDoDamage, false, GfxMoveMode.enumLinearMove, 1, 0, null, vFlyScale, vHitScale, data.dwModifier); var target = EC_ManMessageMono.Instance?.GetObject(data.idTarget, 0)?.gameObject.transform; if (target == null) @@ -1113,7 +1111,7 @@ public class CECAttackEvent // if (bHideHitGfx) szGFX = null; // TODO: Implement AddSkillGfxEvent - // CECGameRun.Instance.GetWorld().GetSkillGfxMan().AddSkillGfxEvent(m_idHost, data.idTarget, null, + // CECGameRun.Instance.GetWorld().GetSkillGfxMan().AddSkillGfxEvent(m_idHost, data.idTarget, null, // szGFX, m_timeToDoDamage, false, GfxMoveMode.enumLinearMove, 1, 0, null, vFlyScale, vHitScale, data.dwModifier); // Temporary implementation for testing / 临时实现用于测试 @@ -1227,7 +1225,7 @@ public class CECAttackEvent if (bHideHitGfx) pszHitGFX = null; // TODO: Implement AddSkillGfxEvent - // CECGameRun.Instance.GetWorld().GetSkillGfxMan().AddSkillGfxEvent(m_idHost, data.idTarget, + // CECGameRun.Instance.GetWorld().GetSkillGfxMan().AddSkillGfxEvent(m_idHost, data.idTarget, // pszflyGFX, pszHitGFX, m_timeToDoDamage, false, GfxMoveMode.enumLinearMove, 1, // 0, null, vFlyScale, vHitScale, data.dwModifier); } diff --git a/Assets/PerfectWorld/Scripts/Move/CECPlayer.cs b/Assets/PerfectWorld/Scripts/Move/CECPlayer.cs index 4c48ac2757..8184cf7522 100644 --- a/Assets/PerfectWorld/Scripts/Move/CECPlayer.cs +++ b/Assets/PerfectWorld/Scripts/Move/CECPlayer.cs @@ -3911,7 +3911,7 @@ namespace BrewMonster public CECAttackEvent AttackEvent; public bool IsHitAnim; public bool IsForceStopPrevious; - public bool IsLoop; + public bool IsLoop; public QueueActionEvent(string animationName, Action setFlag, bool isHitAnim, CECAttackEvent attackEvent, int iTransTime, bool isForceStopPrevious = false, bool isLoop = false) { diff --git a/Assets/PerfectWorld/Scripts/NPC/CECModel.cs b/Assets/PerfectWorld/Scripts/NPC/CECModel.cs index 307e0f1225..450200a90c 100644 --- a/Assets/PerfectWorld/Scripts/NPC/CECModel.cs +++ b/Assets/PerfectWorld/Scripts/NPC/CECModel.cs @@ -369,7 +369,7 @@ public class CLuaMemTbl public class CECModel { - + private bool m_bInheritParentId = true; private int m_nId = 0; public GameObject m_pPlayerModel; @@ -397,7 +397,7 @@ public class CECModel pNode->m_pActFlag = NULL; }*/ } - + public bool HasCHAABB() { return m_pMapModel.HasCHAABB(); } /// @@ -438,14 +438,14 @@ public class CECModel { m_skeletonBuilder = m_transform.GetComponentInChildren(true); } - + if (m_skeletonBuilder == null && m_transform != null) { // Fallback: search in parent hierarchy (for NPCs/Players) // 回退:在父层次结构中搜索(用于NPC/玩家) m_skeletonBuilder = m_transform.GetComponentInParent(); } - + if (m_skeletonBuilder == null) { BMLogger.LogWarning($"[CECModel] SkeletonBuilder not found for {(m_transform != null ? m_transform.name : "null")}. Hooks will not be available."); @@ -497,12 +497,12 @@ public class CECModel return null; // Still no skeleton found } } - + if (string.IsNullOrEmpty(hookName)) { return null; } - + // Check cache first // 首先检查缓存 if (m_hookCache.TryGetValue(hookName, out Transform cachedHook)) @@ -513,11 +513,11 @@ public class CECModel } m_hookCache.Remove(hookName); // Remove invalid entry } - + // Lookup from skeleton // 从骨架查找 Transform hook = m_skeletonBuilder.GetHook(hookName, recursive); - + if (hook != null) { m_hookCache[hookName] = hook; // Cache for performance @@ -575,7 +575,7 @@ public class CECModel { if (string.IsNullOrEmpty(hangerName)) return null; - + return m_childModels.TryGetValue(hangerName, out CECModel child) ? child : null; } @@ -688,8 +688,7 @@ public class CECModel { string soundpath = AFile.NormalizePath(sfx.m_strFilePaths[0]); soundpath = soundpath.ToLower(); - SFXManager.Instance.PlaySkillSfxAtPointAsync(soundpath, Vector3.zero).Forget(); - + SFXManager.Instance.PlaySkillSfxAtPointAsync(soundpath, Vector3.zero).Forget(); } } } @@ -774,7 +773,7 @@ public class CECModel // TODO Phase 4: Add hook scale factor support // TODO 第4阶段:添加挂点缩放因子支持 // fScale *= pHook->GetScaleFactor(); - + #if UNITY_EDITOR BMLogger.Log($"[CECModel.PlayGfx] Using hook '{szHook}' for GFX '{szPath}', scale={fScale}"); #endif @@ -845,4 +844,4 @@ public class CECModel public enum ActionChannel { ACTCHA_WOUND = 1, -}; \ No newline at end of file +}; diff --git a/Assets/PerfectWorld/Scripts/Sound/SFXManager.cs b/Assets/PerfectWorld/Scripts/Sound/SFXManager.cs index e100c2e0dc..f98c969b14 100644 --- a/Assets/PerfectWorld/Scripts/Sound/SFXManager.cs +++ b/Assets/PerfectWorld/Scripts/Sound/SFXManager.cs @@ -92,11 +92,23 @@ namespace BrewMonster.Scripts /// Uses the cache fast-path when the clip is already loaded; otherwise waits /// for AddressableManager initialization (no per-frame lambda polling) before /// loading and playing the clip. + /// + /// Pass (in seconds) to postpone playback. The wait + /// can be cancelled early via ; if cancelled + /// the method exits silently without playing anything. + /// /// - public async UniTaskVoid PlaySkillSfxAtPointAsync(string address, Vector3 worldPos) + public async UniTaskVoid PlaySkillSfxAtPointAsync( + string address, + Vector3 worldPos, + float delay = 0f, + System.Threading.CancellationToken cancellationToken = default) { - // BMLogger.LogError ($"HoangDev PlaySkillSfxAtPointAsync: address={address}, worldPos={worldPos}"); if (string.IsNullOrEmpty(address)) return; + + if (delay > 0f) + await UniTask.Delay(System.TimeSpan.FromSeconds(delay), cancellationToken: cancellationToken); + var mgr = AddressableManager.Instance; if (mgr == null) return; diff --git a/Assets/PerfectWorld/Scripts/Sound/WorldMusicController.cs b/Assets/PerfectWorld/Scripts/Sound/WorldMusicController.cs index 74a0228acf..cb0e5e4dd7 100644 --- a/Assets/PerfectWorld/Scripts/Sound/WorldMusicController.cs +++ b/Assets/PerfectWorld/Scripts/Sound/WorldMusicController.cs @@ -53,8 +53,6 @@ namespace BrewMonster.Scripts Debug.LogWarning($"[WorldMusicController] No music entry found for worldTag {worldTag}"); return; } - BMLogger.LogError($"HoangDev: SetupAudioSources entry.bgmPath.ToLower():{entry.bgmPath.ToLower()}"); - BMLogger.LogError($"HoangDev: SetupAudioSources entry.ambiencePath.ToLower()):{entry.ambiencePath.ToLower()}"); var bgmClip = await AddressableManager.Instance.LoadAudioClipAsync(entry.bgmPath.ToLower()); var ambienceClip = await AddressableManager.Instance.LoadAudioClipAsync(entry.ambiencePath.ToLower());