From 0e6ceaf6f3ae2a9fca6d3b8cf0fb777142c46f94 Mon Sep 17 00:00:00 2001 From: Le Duc Anh Date: Fri, 20 Feb 2026 01:20:05 +0700 Subject: [PATCH] Play from Bootstrap scene. Move heavy logic to other Thread --- Assets/PerfectWorld/Prefab/UIManager.prefab | 243 +++++++++++++++++- Assets/PerfectWorld/Scene/Boostrap.unity | 3 - Assets/PerfectWorld/Scene/Bootstrap.unity | 3 + ...ostrap.unity.meta => Bootstrap.unity.meta} | 0 ...troller.cs => BootstrapSceneController.cs} | 2 +- ....meta => BootstrapSceneController.cs.meta} | 0 .../Scripts/Camera/CameraController.cs | 2 +- .../Common/ConsistentObjectContainer.cs | 12 + .../Common/ConsistentObjectContainer.cs.meta | 2 + .../Scripts/Managers/EC_Object.cs | 25 +- .../PerfectWorld/Scripts/NPC/CECNPCServer.cs | 32 ++- .../Network/CSNetwork/EC_ManMessage.cs | 12 +- .../Scripts/Network/UnityGameSession.cs | 17 +- .../PerfectWorld/Scripts/Objet/CECMatter.cs | 2 + .../SceneLoader/LoadingSceneController.cs | 18 -- .../Scripts/Spawner/ObjectSpawner.cs | 5 + .../Scripts/Task/CECTaskInterface.cs | 10 +- .../Scripts/UI/Login/LoginScreenUI.cs | 27 +- .../Scripts/World/LitModelHolder.cs | 4 +- Assets/Prefabs/BoostrapForTest.prefab | 54 +--- Assets/Scenes/a61.unity | 4 +- Assets/Scripts/CECGameRun.cs | 2 + Assets/Scripts/CECHostPlayer.Task.cs | 11 +- Assets/Scripts/CECHostPlayer.cs | 7 +- Assets/Scripts/CECUIManager.cs | 4 +- ProjectSettings/EditorBuildSettings.asset | 4 +- ProjectSettings/ProjectSettings.asset | 2 +- 27 files changed, 380 insertions(+), 127 deletions(-) delete mode 100644 Assets/PerfectWorld/Scene/Boostrap.unity create mode 100644 Assets/PerfectWorld/Scene/Bootstrap.unity rename Assets/PerfectWorld/Scene/{Boostrap.unity.meta => Bootstrap.unity.meta} (100%) rename Assets/PerfectWorld/Scripts/Boostrap/{BoostrapSceneController.cs => BootstrapSceneController.cs} (87%) rename Assets/PerfectWorld/Scripts/Boostrap/{BoostrapSceneController.cs.meta => BootstrapSceneController.cs.meta} (100%) create mode 100644 Assets/PerfectWorld/Scripts/Common/ConsistentObjectContainer.cs create mode 100644 Assets/PerfectWorld/Scripts/Common/ConsistentObjectContainer.cs.meta diff --git a/Assets/PerfectWorld/Prefab/UIManager.prefab b/Assets/PerfectWorld/Prefab/UIManager.prefab index f154cffbe8..c2436fda89 100644 --- a/Assets/PerfectWorld/Prefab/UIManager.prefab +++ b/Assets/PerfectWorld/Prefab/UIManager.prefab @@ -3827,6 +3827,142 @@ MonoBehaviour: m_hasFontAssetChanged: 0 m_baseMaterial: {fileID: 0} m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &5727863043411723117 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1306231628402548473} + - component: {fileID: 7611469891124614779} + - component: {fileID: 8138679065215916556} + m_Layer: 0 + m_Name: FPSText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1306231628402548473 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5727863043411723117} + 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: 6210342792191300609} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 100, y: 25} + m_SizeDelta: {x: 200, y: 50} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &7611469891124614779 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5727863043411723117} + m_CullTransparentMesh: 1 +--- !u!114 &8138679065215916556 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5727863043411723117} + 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: 000 + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 369c2e14814cc9a4b8e3ad4e37769134, type: 2} + m_sharedMaterial: {fileID: 9092487103257209053, guid: 369c2e14814cc9a4b8e3ad4e37769134, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4291756287 + m_fontColor: {r: 1, g: 0, b: 0.8118372, 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: 40 + m_fontSizeBase: 40 + m_fontWeight: 400 + m_enableAutoSizing: 0 + 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 &5885931642767984348 GameObject: m_ObjectHideFlags: 0 @@ -4404,6 +4540,7 @@ Transform: - {fileID: 3233441867675090637} - {fileID: 330835371656537333} - {fileID: 7148351193174662273} + - {fileID: 6210342792191300609} m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &1890210201668811196 @@ -4418,7 +4555,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: d21c02a79936b334da12ef5379524df2, type: 3} m_Name: m_EditorClassIdentifier: - uiRoot: {fileID: 0} + _fpsText: {fileID: 8138679065215916556} uiPrefabs: [] npsUI: {fileID: 8090791712930107248} currentTargetNPCID: 0 @@ -5214,6 +5351,108 @@ MonoBehaviour: - {fileID: 445184971459596056} - {fileID: 3804662600613272361} - {fileID: 1774515210692260948} +--- !u!1 &8644839137304674498 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6210342792191300609} + - component: {fileID: 3434319454937597182} + - component: {fileID: 2220022565094034758} + - component: {fileID: 2827532456117971684} + m_Layer: 0 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6210342792191300609 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8644839137304674498} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1306231628402548473} + m_Father: {fileID: 2780428059708698453} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!223 &3434319454937597182 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8644839137304674498} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_VertexColorAlwaysGammaSpace: 0 + m_AdditionalShaderChannelsFlag: 25 + m_UpdateRectTransformForStandalone: 0 + m_SortingLayerID: 0 + m_SortingOrder: 10 + m_TargetDisplay: 0 +--- !u!114 &2220022565094034758 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8644839137304674498} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 1 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 1920, y: 1080} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 1 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!114 &2827532456117971684 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8644839137304674498} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 --- !u!1 &8902228212386757619 GameObject: m_ObjectHideFlags: 0 @@ -10882,7 +11121,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 8435310359341866937, guid: b5a4a3ed5bf0e5a49ba0f89d26e1f36e, type: 3} propertyPath: m_AnchoredPosition.y - value: -25.33552 + value: -25.335571 objectReference: {fileID: 0} - target: {fileID: 8579427623307909814, guid: b5a4a3ed5bf0e5a49ba0f89d26e1f36e, type: 3} propertyPath: m_AnchorMax.y diff --git a/Assets/PerfectWorld/Scene/Boostrap.unity b/Assets/PerfectWorld/Scene/Boostrap.unity deleted file mode 100644 index 202bdef669..0000000000 --- a/Assets/PerfectWorld/Scene/Boostrap.unity +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d367fa56162cf045cb9f046aa3953821a7011bb15c33b5a2beaaba5283f5e2d9 -size 21448 diff --git a/Assets/PerfectWorld/Scene/Bootstrap.unity b/Assets/PerfectWorld/Scene/Bootstrap.unity new file mode 100644 index 0000000000..69bf31a50d --- /dev/null +++ b/Assets/PerfectWorld/Scene/Bootstrap.unity @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e0c57d8d96f20a7602e9c9af036ccd27adccf9d08ecbcd6f60bec0ba4e78e5e2 +size 281532 diff --git a/Assets/PerfectWorld/Scene/Boostrap.unity.meta b/Assets/PerfectWorld/Scene/Bootstrap.unity.meta similarity index 100% rename from Assets/PerfectWorld/Scene/Boostrap.unity.meta rename to Assets/PerfectWorld/Scene/Bootstrap.unity.meta diff --git a/Assets/PerfectWorld/Scripts/Boostrap/BoostrapSceneController.cs b/Assets/PerfectWorld/Scripts/Boostrap/BootstrapSceneController.cs similarity index 87% rename from Assets/PerfectWorld/Scripts/Boostrap/BoostrapSceneController.cs rename to Assets/PerfectWorld/Scripts/Boostrap/BootstrapSceneController.cs index 9b9882fe21..dc940440ce 100644 --- a/Assets/PerfectWorld/Scripts/Boostrap/BoostrapSceneController.cs +++ b/Assets/PerfectWorld/Scripts/Boostrap/BootstrapSceneController.cs @@ -4,7 +4,7 @@ using UnityEngine.SceneManagement; namespace BrewMonster { - public class BoostrapSceneController : MonoBehaviour + public class BootstrapSceneController : MonoBehaviour { [SerializeField] private string _nextSceneName; diff --git a/Assets/PerfectWorld/Scripts/Boostrap/BoostrapSceneController.cs.meta b/Assets/PerfectWorld/Scripts/Boostrap/BootstrapSceneController.cs.meta similarity index 100% rename from Assets/PerfectWorld/Scripts/Boostrap/BoostrapSceneController.cs.meta rename to Assets/PerfectWorld/Scripts/Boostrap/BootstrapSceneController.cs.meta diff --git a/Assets/PerfectWorld/Scripts/Camera/CameraController.cs b/Assets/PerfectWorld/Scripts/Camera/CameraController.cs index 1c8aea5a28..947466709a 100644 --- a/Assets/PerfectWorld/Scripts/Camera/CameraController.cs +++ b/Assets/PerfectWorld/Scripts/Camera/CameraController.cs @@ -66,7 +66,7 @@ namespace BrewMonster else { _cinemachineCamera.Follow = CECGameRun.Instance.GetHostPlayer().transform; - _cinemachineCamera.ForceCameraPosition(CECGameRun.Instance.GetHostPlayer().transform.position, Quaternion.identity); + _cinemachineCamera.ForceCameraPosition(CECGameRun.Instance.GetHostPlayer().ObjectPosition, Quaternion.identity); orbital.HorizontalAxis.Value = 208; orbital.VerticalAxis.Value = -268; } diff --git a/Assets/PerfectWorld/Scripts/Common/ConsistentObjectContainer.cs b/Assets/PerfectWorld/Scripts/Common/ConsistentObjectContainer.cs new file mode 100644 index 0000000000..211b545ee8 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Common/ConsistentObjectContainer.cs @@ -0,0 +1,12 @@ +using UnityEngine; + +namespace BrewMonster.Scripts +{ + public class ConsistentObjectContainer : MonoBehaviour + { + private void Awake() + { + DontDestroyOnLoad(gameObject); + } + } +} diff --git a/Assets/PerfectWorld/Scripts/Common/ConsistentObjectContainer.cs.meta b/Assets/PerfectWorld/Scripts/Common/ConsistentObjectContainer.cs.meta new file mode 100644 index 0000000000..7eb7330dac --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Common/ConsistentObjectContainer.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 7e565f914738e4e68a1c2688272d0ee5 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_Object.cs b/Assets/PerfectWorld/Scripts/Managers/EC_Object.cs index 9250e96d62..76c434c0e3 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_Object.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_Object.cs @@ -20,6 +20,11 @@ public class CECObject : MonoBehaviour protected Quaternion targetRotation; protected Quaternion startRotation; // Store starting rotation for Slerp protected Vector3 g_vAxisY = Vector3.up; + + + protected Transform _objectTransform; + protected Vector3 objectPosition; + public Vector3 ObjectPosition { get => objectPosition; } // Class ID public static class Class_ID { @@ -137,13 +142,20 @@ public class CECObject : MonoBehaviour return v / mag; } - public A3DVECTOR3 GetPos() + /// + /// Get the position of the object.
+ /// Consider NOT use the transform position if you get the data from outside of the MainThread. + ///
+ /// If true, use the transform position, otherwise use the object position for slighly better performance. + /// + public A3DVECTOR3 GetPos(bool useTransform = true) { - return EC_Utility.ToA3DVECTOR3(transform.position); + return EC_Utility.ToA3DVECTOR3(useTransform ? _objectTransform.position : objectPosition); } - public Vector3 GetPosVector3() + + public Vector3 GetPosVector3(bool useTransform = true) { - return transform.position; + return useTransform ? _objectTransform.position : objectPosition; } // Turn around object and face to specified object @@ -189,6 +201,11 @@ public class CECObject : MonoBehaviour } protected virtual void Update() { + if (_objectTransform == null) + { + _objectTransform = transform; + } + objectPosition = _objectTransform.position; if (m_bAdjustOrient) AdjustOrientation(Time.deltaTime); } diff --git a/Assets/PerfectWorld/Scripts/NPC/CECNPCServer.cs b/Assets/PerfectWorld/Scripts/NPC/CECNPCServer.cs index 885d16aa9f..6be3876f0c 100644 --- a/Assets/PerfectWorld/Scripts/NPC/CECNPCServer.cs +++ b/Assets/PerfectWorld/Scripts/NPC/CECNPCServer.cs @@ -3,9 +3,11 @@ using BrewMonster.Network; using BrewMonster.Scripts; using BrewMonster.Scripts.Task; using CSNetwork.GPDataType; +using Cysharp.Threading.Tasks; using System; using System.Runtime.InteropServices; using System.Text; +using System.Threading.Tasks; using UnityEngine; using static CECNPC; @@ -18,6 +20,8 @@ public class CECNPCServer : CECNPC private IconTaskType m_TaskIcon = IconTaskType.QI_NONE; private CECCounter m_TaskCounter = new CECCounter(); + private bool _needUpdateTaskIcon = false; + public override void SetUpCECNPC(CECNPCMan pNPCMan) { base.SetUpCECNPC(pNPCMan); @@ -68,13 +72,29 @@ public class CECNPCServer : CECNPC return true; } + protected override void Awake() + { + base.Awake(); + var destroyToken = this.GetCancellationTokenOnDestroy(); + UniTask.RunOnThreadPool(UpdateCurTaskIconProcess, false, cancellationToken: destroyToken).Forget(); + } + protected override void Update() { base.Update(); - if (m_TaskCounter.IncCounter(Time.deltaTime * 1000)) + if (_needUpdateTaskIcon) { - m_TaskCounter.Reset(); + UpdateTaskIconUI(); + _needUpdateTaskIcon = false; + } + } + + private async UniTask UpdateCurTaskIconProcess() + { + while (true) + { + await Task.Delay(1000); UpdateCurTaskIcon(); } } @@ -165,7 +185,7 @@ public class CECNPCServer : CECNPC { m_TaskIcon = IconTaskType.QI_IN_K; BMLogger.Log($"[UpdateCurTaskIcon] Set icon QI_IN_K for task {idTask}"); - UpdateTaskIconUI(); + _needUpdateTaskIcon = true; return; } else if (pTaskTemp.GetType() == (uint)ENUM_TASK_TYPE.enumTTEvent || pTaskTemp.GetType() == (uint)ENUM_TASK_TYPE.enumTTDaily) @@ -211,7 +231,7 @@ public class CECNPCServer : CECNPC m_TaskIcon = IconTaskType.QI_IN_TYPE1; BMLogger.Log($"[UpdateCurTaskIcon] Set complete icon {m_TaskIcon}"); - UpdateTaskIconUI(); + _needUpdateTaskIcon = true; return; } @@ -255,7 +275,7 @@ public class CECNPCServer : CECNPC if (pTaskTemp.IsKeyTask()) { m_TaskIcon = IconTaskType.QI_OUT_K; - UpdateTaskIconUI(); + _needUpdateTaskIcon = true; return; } else if (pTaskTemp.GetType() == (uint)ENUM_TASK_TYPE.enumTTEvent || pTaskTemp.GetType() == (uint)ENUM_TASK_TYPE.enumTTDaily) @@ -304,7 +324,7 @@ public class CECNPCServer : CECNPC m_TaskIcon = IconTaskType.QI_OUT_N; //BMLogger.Log($"[UpdateCurTaskIcon] Final icon {m_TaskIcon}, taskFlag={taskFlag}"); - UpdateTaskIconUI(); + _needUpdateTaskIcon = true; } private void UpdateTaskIconUI() diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/EC_ManMessage.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/EC_ManMessage.cs index b0082e56ea..d25c3b3a8c 100644 --- a/Assets/PerfectWorld/Scripts/Network/CSNetwork/EC_ManMessage.cs +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/EC_ManMessage.cs @@ -26,6 +26,8 @@ namespace CSNetwork public Queue m_MsgList = new Queue(); private IMsgHandler m_tempHandler; // so we don't have to allocate a new one every time + private static ECMSG _currentMsg; + private EC_ManMessage() { } /// Post a message to the message queue @@ -63,16 +65,16 @@ namespace CSNetwork int i, count = Instance.m_MsgList.Count; for (i = 0; i < count; i++) { - ECMSG msg = Instance.m_MsgList.Dequeue(); - if (!Instance.m_MsgHandlerList.ContainsKey(msg.iManager)) + _currentMsg = Instance.m_MsgList.Dequeue(); + if (!Instance.m_MsgHandlerList.ContainsKey(_currentMsg.iManager)) { - BMLogger.LogError("Did not find handler ID: " + msg.iManager); + BMLogger.LogError("Did not find handler ID: " + _currentMsg.iManager); continue; } - Instance.m_tempHandler = Instance.m_MsgHandlerList[msg.iManager]; + Instance.m_tempHandler = Instance.m_MsgHandlerList[_currentMsg.iManager]; if (Instance.m_tempHandler != null) { - Instance.m_tempHandler.ProcessMessage(msg); + Instance.m_tempHandler.ProcessMessage(_currentMsg); } } } diff --git a/Assets/PerfectWorld/Scripts/Network/UnityGameSession.cs b/Assets/PerfectWorld/Scripts/Network/UnityGameSession.cs index 7435c6fa2b..107acc1e50 100644 --- a/Assets/PerfectWorld/Scripts/Network/UnityGameSession.cs +++ b/Assets/PerfectWorld/Scripts/Network/UnityGameSession.cs @@ -347,6 +347,17 @@ namespace BrewMonster.Network { return _gameSession.GetRoleInfo(); } + + public string GetWorldInstanceName() + { + switch (_gameSession.GetRoleInfo().worldtag) + { + case 161: + return "a61"; + default: + return "a61"; + } + } /// Make sure username and password is set before calling this method private async Task ConnectAsync(string ip, int port) { @@ -629,13 +640,13 @@ namespace BrewMonster.Network Instance._gameSession.GetRoleCustomizeData(iNumRole, aRoleIDs); } - public void LoadScene(string sceneName, LoadSceneMode mode, Action actDone) + public void LoadScene(string sceneName, LoadSceneMode mode, Action actProgress, Action actDone) { // SceneLoadService.Load(sceneName, mode, actDone); - StartCoroutine(LoadSceneCoroutine(sceneName, mode, actDone)); + StartCoroutine(LoadSceneCoroutine(sceneName, mode, actProgress, actDone)); } - private IEnumerator LoadSceneCoroutine(string sceneName, LoadSceneMode mode, Action actDone) + private IEnumerator LoadSceneCoroutine(string sceneName, LoadSceneMode mode, Action actProgress, Action actDone) { AsyncOperation asyncLoad = SceneManager.LoadSceneAsync(sceneName, mode); asyncLoad.allowSceneActivation = false; diff --git a/Assets/PerfectWorld/Scripts/Objet/CECMatter.cs b/Assets/PerfectWorld/Scripts/Objet/CECMatter.cs index e9ffd2b91e..719ca858c0 100644 --- a/Assets/PerfectWorld/Scripts/Objet/CECMatter.cs +++ b/Assets/PerfectWorld/Scripts/Objet/CECMatter.cs @@ -235,6 +235,8 @@ namespace PerfectWorld.Scripts private new void Update() { + base.Update(); + // Recovery: after Unity domain reload, manager dictionaries reset but scene objects persist. // Keep trying until we successfully register. if (!m_registeredToManMatter) diff --git a/Assets/PerfectWorld/Scripts/SceneLoader/LoadingSceneController.cs b/Assets/PerfectWorld/Scripts/SceneLoader/LoadingSceneController.cs index c8870ab1a7..6a9410c8d4 100644 --- a/Assets/PerfectWorld/Scripts/SceneLoader/LoadingSceneController.cs +++ b/Assets/PerfectWorld/Scripts/SceneLoader/LoadingSceneController.cs @@ -30,24 +30,6 @@ namespace BrewMonster public void ShowLoadingScene(bool active) { goContent.SetActive(active); - - // if (active) - // { - // Debug.LogError("Loading scene controller started"); - // - // finished = false; - // loadingText.text = "Loading..."; - // UpdateUI(0); - // - // cts?.Cancel(); - // cts = new CancellationTokenSource(); - // - // ObserveLoadingAsync(cts.Token).Forget(); - // } - // else - // { - // cts?.Cancel(); - // } } async UniTaskVoid ObserveLoadingAsync(CancellationToken token) diff --git a/Assets/PerfectWorld/Scripts/Spawner/ObjectSpawner.cs b/Assets/PerfectWorld/Scripts/Spawner/ObjectSpawner.cs index cfd4f5ce59..5fcae63368 100644 --- a/Assets/PerfectWorld/Scripts/Spawner/ObjectSpawner.cs +++ b/Assets/PerfectWorld/Scripts/Spawner/ObjectSpawner.cs @@ -6,6 +6,11 @@ namespace BrewMonster { public GameObject InstantiateObject(GameObject prefab, Transform parent =null, bool setThisAsParent = true) { + if (prefab == null) + { + BMLogger.LogError("ObjectSpawner::InstantiateObject, prefab is null"); + return GameObject.CreatePrimitive(PrimitiveType.Cube); + } if (setThisAsParent) { return Instantiate(prefab, transform); diff --git a/Assets/PerfectWorld/Scripts/Task/CECTaskInterface.cs b/Assets/PerfectWorld/Scripts/Task/CECTaskInterface.cs index c3d0080519..a7fda57d52 100644 --- a/Assets/PerfectWorld/Scripts/Task/CECTaskInterface.cs +++ b/Assets/PerfectWorld/Scripts/Task/CECTaskInterface.cs @@ -434,7 +434,7 @@ namespace BrewMonster.Scripts.Task pTaskMan.Release(); LoadingSceneController.Instance.ShowLoadingScene(true); LoadingSceneController.Instance.UpdateUI(0f); - LoadingSceneController.Instance.SetLoadingText("Loading Tasks From Pack"); + LoadingSceneController.Instance.SetLoadingText("Du Nhập Thế Giới Hoàn Mỹ"); //string task_data_path = Path.Combine(Application.streamingAssetsPath, "data/tasks.data"); string task_data_path = "Assets/PerfectWorld/Data/tasks.txt"; @@ -444,15 +444,17 @@ namespace BrewMonster.Scripts.Task LoadingSceneController.Instance.SetProgress(x); }, _cts.Token); - + LoadingSceneController.Instance.UpdateUI(0.3f); //var task_npc_path = Path.Combine(Application.streamingAssetsPath, "data/task_npc.data"); var task_npc_path = "Assets/PerfectWorld/Data/task_npc.txt"; await pTaskMan.LoadNPCInfoFromPack(task_npc_path); + LoadingSceneController.Instance.UpdateUI(0.8f); + //var dyn_tasks_path = Path.Combine(Application.streamingAssetsPath, "data/dyn_tasks.data"); var dyn_tasks_path = "Assets/PerfectWorld/Data/dyn_tasks.txt"; await pTaskMan.VerifyDynTasksPack(dyn_tasks_path); - + LoadingSceneController.Instance.UpdateUI(1f); InitActiveTaskList(); SceneLoader.SceneLoadProcess = SceneLoadProcess.EndLoading; LoadingSceneController.Instance.ShowLoadingScene(false); @@ -868,7 +870,7 @@ namespace BrewMonster.Scripts.Task public int GetPos(float[] pos) { - A3DVECTOR3 vPos = m_pHost.GetPos(); + A3DVECTOR3 vPos = m_pHost.GetPos(false); if (pos != null && pos.Length >= 3) { pos[0] = vPos.x; diff --git a/Assets/PerfectWorld/Scripts/UI/Login/LoginScreenUI.cs b/Assets/PerfectWorld/Scripts/UI/Login/LoginScreenUI.cs index cc0fb97c39..725a791c01 100644 --- a/Assets/PerfectWorld/Scripts/UI/Login/LoginScreenUI.cs +++ b/Assets/PerfectWorld/Scripts/UI/Login/LoginScreenUI.cs @@ -69,11 +69,11 @@ namespace BrewMonster.UI context = SynchronizationContext.Current; // Requirement: Login UI should also have a61 loaded. - var world = SceneManager.GetSceneByName("a61"); - if (!world.IsValid() || !world.isLoaded) - { - SceneManager.LoadSceneAsync("a61", LoadSceneMode.Additive); - } + // var world = SceneManager.GetSceneByName("a61"); + // if (!world.IsValid() || !world.isLoaded) + // { + // SceneManager.LoadSceneAsync("a61", LoadSceneMode.Additive); + // } _usernameInputField.text = PlayerPrefs.GetString("username", ""); _passwordInputField.text = PlayerPrefs.GetString("password", ""); @@ -267,6 +267,7 @@ namespace BrewMonster.UI private void OnClickSelectCharacter(RoleInfo roleInfo) { + LoadingSceneController.Instance.ShowLoadingScene(true); UnityGameSession.SelectRoleAsync(roleInfo, OnSelectRoleComplete); } @@ -335,7 +336,6 @@ namespace BrewMonster.UI }; SceneLoader.SceneLoadProcess = SceneLoadProcess.Loading; SceneLoader.LoadingProgress = 0; - LoadingSceneController.Instance.ShowLoadingScene(true); #if TESTFAST string nameScene = "LoginScene"; SceneManager.UnloadSceneAsync(nameScene); @@ -344,16 +344,17 @@ namespace BrewMonster.UI actLoadChar?.Invoke(); UnityGameSession.EnterWorldAsync(roleInfo, OnEnterWorldComplete); #else - string nameScene = "NPCRender"; - UnityGameSession.Instance.LoadScene(nameScene, LoadSceneMode.Single, (value) => + string nameScene = UnityGameSession.Instance.GetWorldInstanceName(); + UnityGameSession.Instance.LoadScene(nameScene, LoadSceneMode.Single, + (progress) => { - isDoneNPCRender = value; - actLoadChar?.Invoke(); - }); - nameScene = "a61"; - UnityGameSession.Instance.LoadScene(nameScene, LoadSceneMode.Additive, (value) => + LoadingSceneController.Instance.SetProgress(progress); + }, + (value) => { isDoneWorldRender = value; + isDoneNPCRender = true; + isDoneWorldRender = true; actLoadChar?.Invoke(); UnityGameSession.EnterWorldAsync(roleInfo, OnEnterWorldComplete); diff --git a/Assets/PerfectWorld/Scripts/World/LitModelHolder.cs b/Assets/PerfectWorld/Scripts/World/LitModelHolder.cs index dee19ca13c..2af088368b 100644 --- a/Assets/PerfectWorld/Scripts/World/LitModelHolder.cs +++ b/Assets/PerfectWorld/Scripts/World/LitModelHolder.cs @@ -231,7 +231,7 @@ public class LitModelHolder : MonoSingleton { if ((_currentHostPos - _lastHostPos).sqrMagnitude < minMoveSqr) { - await UniTask.Delay(intervalMs, cancellationToken: destroyToken); + await Task.Delay(intervalMs, destroyToken); continue; } } @@ -241,7 +241,7 @@ public class LitModelHolder : MonoSingleton await TickStreaming(_currentHostPos, immediateSqr, paddingSqr, destroyToken); - await UniTask.Delay(intervalMs, cancellationToken: destroyToken); + await Task.Delay(intervalMs, destroyToken); } } diff --git a/Assets/Prefabs/BoostrapForTest.prefab b/Assets/Prefabs/BoostrapForTest.prefab index 50e0cab386..6b97298508 100644 --- a/Assets/Prefabs/BoostrapForTest.prefab +++ b/Assets/Prefabs/BoostrapForTest.prefab @@ -1,50 +1,5 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: ---- !u!1 &695809075354249832 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2466055582606182659} - - component: {fileID: 6694799068998335831} - m_Layer: 0 - m_Name: Boostrap (1) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &2466055582606182659 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 695809075354249832} - serializedVersion: 2 - 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: 8647913387955223815} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &6694799068998335831 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 695809075354249832} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 2781611f0f83bf54290a9ec600543440, type: 3} - m_Name: - m_EditorClassIdentifier: - _nextSceneName: LoginScene --- !u!1 &4031863963514808284 GameObject: m_ObjectHideFlags: 0 @@ -76,7 +31,6 @@ Transform: m_Children: - {fileID: 5828095428458008759} - {fileID: 3304007787827206689} - - {fileID: 2466055582606182659} - {fileID: 1374891186888298875} m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -92,7 +46,7 @@ GameObject: - component: {fileID: 7143671611729110091} - component: {fileID: 1552922004895094615} m_Layer: 0 - m_Name: GameSession (1) + m_Name: GameSession m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -149,7 +103,7 @@ GameObject: - component: {fileID: 5828095428458008759} - component: {fileID: 7028019933536463136} m_Layer: 0 - m_Name: AutoIniializer (1) + m_Name: AutoIniializer m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -192,11 +146,11 @@ PrefabInstance: m_Modifications: - target: {fileID: 132536, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} propertyPath: m_Name - value: IngameDebugConsole (1) + value: IngameDebugConsole objectReference: {fileID: 0} - target: {fileID: 11414302, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} propertyPath: m_Size - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 11414302, guid: 67117722a812a2e46ab8cb8eafbf5f5e, type: 3} propertyPath: m_Value diff --git a/Assets/Scenes/a61.unity b/Assets/Scenes/a61.unity index 2cba9b386a..ade6afb875 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:4c46985f22f12472b048885ee58952b7c4bc7c5b6c4febfb45f6aec2a2390fd3 -size 196549630 +oid sha256:1f175b8382ec0686d5bce9ce1d33a04868482bfd6bf28ef42b01356eaba0630f +size 196281143 diff --git a/Assets/Scripts/CECGameRun.cs b/Assets/Scripts/CECGameRun.cs index e4132a9bef..77d52abbe6 100644 --- a/Assets/Scripts/CECGameRun.cs +++ b/Assets/Scripts/CECGameRun.cs @@ -75,7 +75,9 @@ public partial class CECGameRun } public void Init() { +#if !UNITY_EDITOR Application.targetFrameRate = 60; +#endif instance = this; // _gameRunConfig = Resources.Load("GameRunConfig"); // _playerPrefab = _gameRunConfig.PlayerPrefab; diff --git a/Assets/Scripts/CECHostPlayer.Task.cs b/Assets/Scripts/CECHostPlayer.Task.cs index cb612dece1..dcc5169bb0 100644 --- a/Assets/Scripts/CECHostPlayer.Task.cs +++ b/Assets/Scripts/CECHostPlayer.Task.cs @@ -8,6 +8,7 @@ using System.Runtime.InteropServices; using BrewMonster.Network; using BrewMonster.UI; using Cysharp.Threading.Tasks; +using System.Threading.Tasks; namespace BrewMonster { @@ -128,17 +129,13 @@ namespace BrewMonster TaskClient.OnServerNotify(pInterface, data, (uint)size); } - private void TickTask() + private async UniTask TickTask() { // Update task - // C ++ code uses dwDeltaTime from Tick function parameter - if (m_pTaskInterface != null && - m_TaskCounter.IncCounter(Time.deltaTime * 1000f)) + while (true) { - m_TaskCounter.Reset(); TaskClient.OnTaskCheckStatus(m_pTaskInterface); - // TODO: Update task UI if needed - // m_pTaskInterface.UpdateEmotionDlg(); + await Task.Delay(1000); } } diff --git a/Assets/Scripts/CECHostPlayer.cs b/Assets/Scripts/CECHostPlayer.cs index f5d0fd0ed1..193fa3cb21 100644 --- a/Assets/Scripts/CECHostPlayer.cs +++ b/Assets/Scripts/CECHostPlayer.cs @@ -14,6 +14,7 @@ using CSNetwork; using CSNetwork.GPDataType; using CSNetwork.Protocols.RPCData; using CSNetwork.S2CCommand; +using Cysharp.Threading.Tasks; using ModelRenderer.Scripts.GameData; using PerfectWorld.Scripts; using PerfectWorld.Scripts.Managers; @@ -180,6 +181,7 @@ namespace BrewMonster int[] targetsCastSkill; + public bool IsChangingFace() { return m_bChangingFace; @@ -335,6 +337,9 @@ namespace BrewMonster m_GatherCnt.Reset(true); m_PetOptCnt.SetPeriod(1000); m_PetOptCnt.Reset(true); + + // run a process on background to keep track of task status. + UniTask.RunOnThreadPool(TickTask, false, this.GetCancellationTokenOnDestroy()).Forget(); } public bool LoadResources() @@ -436,8 +441,6 @@ namespace BrewMonster EstimateMoveEnv(GetPos()); OnKeyDown(); - // track status of Task - TickTask(); // Update timers UpdateTimers(Time.deltaTime); diff --git a/Assets/Scripts/CECUIManager.cs b/Assets/Scripts/CECUIManager.cs index d3cdfb9d26..3f1c26f183 100644 --- a/Assets/Scripts/CECUIManager.cs +++ b/Assets/Scripts/CECUIManager.cs @@ -8,10 +8,11 @@ using BrewMonster.Scripts.Managers; using UnityEngine; using UnityEngine.UI; using UnityEngine.UIElements; +using TMPro; public class CECUIManager : MonoSingleton { - [SerializeField] private Transform uiRoot; // nơi chứa UI được spawn (Canvas hoặc Transform) + [SerializeField] private TMP_Text _fpsText; [SerializeField] private List uiPrefabs; // drag các prefab UI vào đây private readonly Dictionary _spawnedUIs = new(); @@ -54,6 +55,7 @@ public class CECUIManager : MonoSingleton } private void Update() { + _fpsText.text = $"{Mathf.RoundToInt(1f / Time.deltaTime)}"; if (m_pDlgQuickBar1 != null) { m_pDlgQuickBar1.UpdateShortcuts(); } } diff --git a/ProjectSettings/EditorBuildSettings.asset b/ProjectSettings/EditorBuildSettings.asset index fcbac00c16..77049a4c66 100644 --- a/ProjectSettings/EditorBuildSettings.asset +++ b/ProjectSettings/EditorBuildSettings.asset @@ -5,8 +5,8 @@ EditorBuildSettings: m_ObjectHideFlags: 0 serializedVersion: 2 m_Scenes: - - enabled: 0 - path: Assets/PerfectWorld/Scene/Boostrap.unity + - enabled: 1 + path: Assets/PerfectWorld/Scene/Bootstrap.unity guid: 40f9b53766c74f541b85df4d35cfc767 - enabled: 1 path: Assets/Scenes/a61.unity diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index 8110b5844e..22d4f94362 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -791,7 +791,7 @@ PlayerSettings: webGLCloseOnQuit: 0 webWasm2023: 0 scriptingDefineSymbols: - Android: DOTWEEN;TESTFAST;_TASK_CLIENT;LOAD_TASK_TEMPL;LICENSE_VERSION + Android: DOTWEEN;_TASK_CLIENT;LOAD_TASK_TEMPL;LICENSE_VERSION EmbeddedLinux: DOTWEEN GameCoreScarlett: DOTWEEN GameCoreXboxOne: DOTWEEN