From 8c46bc3e9de02cd5aa8d399bbc3e852fe0bfaefc Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期六, 21 三月 2026 01:30:37 +0800
Subject: [PATCH] 0312 模型初始化加载优化
---
Main/System/Hero/UIHeroController.cs | 232 +++++++++++++++++++++++++++++++++++++--------------------
1 files changed, 149 insertions(+), 83 deletions(-)
diff --git a/Main/System/Hero/UIHeroController.cs b/Main/System/Hero/UIHeroController.cs
index debf7a4..8cd36f1 100644
--- a/Main/System/Hero/UIHeroController.cs
+++ b/Main/System/Hero/UIHeroController.cs
@@ -45,6 +45,11 @@
return;
}
+ if (skeletonGraphic != null)
+ {
+ skeletonGraphic.enabled = false;
+ }
+
skinID = _skinID;
var skinConfig = HeroSkinConfig.Get(skinID);
if (isLh)
@@ -94,51 +99,6 @@
}
onComplete = _onComplete;
- pool = GameObjectPoolManager.Instance.GetPool(UILoader.LoadPrefab("UIHero"));
-
- if (!transform.gameObject.activeSelf)
- {
- transform.SetActive(true);
- }
- if (instanceGO == null)
- {
- instanceGO = pool.Request();
- instanceGO.transform.SetParent(transform);
- //transform 鐨凱ivot Y鏄�0锛岃instanceGO 灞呬腑
- instanceGO.transform.localPosition = new Vector3(0, instanceGO.GetComponent<RectTransform>().sizeDelta.y * 0.5f);
-
- //instanceGO.transform.localPosition = Vector3.zero;
- instanceGO.transform.localScale = Vector3.one;
- instanceGO.transform.localRotation = Quaternion.identity;
- }
-
- skeletonGraphic = instanceGO.GetComponentInChildren<SkeletonGraphic>(true);
- if (isLh)
- {
- skeletonGraphic.skeletonDataAsset = ResManager.Instance.LoadAsset<SkeletonDataAsset>("Hero/SpineRes/", skinConfig.Tachie);
- }
- else
- {
- skeletonGraphic.skeletonDataAsset = ResManager.Instance.LoadAsset<SkeletonDataAsset>("Hero/SpineRes/", skinConfig.SpineRes);
- }
- if (skeletonGraphic.skeletonDataAsset == null)
- {
-
- transform.SetActive(false);
- if (pool != null)
- pool.Release(instanceGO);
- skeletonGraphic = null;
- Destroy(instanceGO);
- Debug.LogError("鏈厤缃畇pine");
- return;
- }
-
- // 浣跨敤 UniTask 杩涜寤惰繜鍒濆鍖栵紝閬垮厤鎵归噺鍒涘缓鏃跺崱椤�
- if (isInitializing)
- {
- // 濡傛灉姝e湪鍒濆鍖栵紝璁剧疆鏍囧織浣嶅彇娑堜箣鍓嶇殑浠诲姟
- isInitializing = false;
- }
// 绔嬬粯闇�瑕佺珛鍗虫樉绀猴紝鍏朵粬鎯呭喌寤惰繜鍒濆鍖�
if (isLh)
@@ -148,13 +108,7 @@
}
else
{
- // 鍦ㄥ姞杞芥柊妯″瀷鍓嶅厛闅愯棌褰撳墠鏄剧ず鐨勬ā鍨嬶紙闈炵珛缁樻儏鍐碉級
- if (skeletonGraphic != null)
- {
- skeletonGraphic.enabled = false;
- }
-
- // 浣跨敤 UniTask 杩涜寮傛鍒濆鍖�
+ // 浣跨敤 UniTask 杩涜寮傛鍒濆鍖栵紝灏唅nstanceGO鍒涘缓鍜岃祫婧愬姞杞介兘绉诲埌寮傛澶勭悊
DelayedInitializeAsync(skinConfig, motionName).Forget();
}
}
@@ -355,17 +309,26 @@
currentIndex = activeInitializationCount++;
}
- // 鏍规嵁褰撳墠鍒濆鍖栧簭鍙疯绠楀欢杩熸椂闂�
- // 绗竴涓崱鐗囧欢杩�1甯э紝绗簩涓欢杩�2甯э紝浠ユ绫绘帹锛屾渶澶氬欢杩�10甯�
- int delayFrames = Mathf.Min(currentIndex + 2, 80);
+ // 鏍规嵁褰撳墠鍒濆鍖栧簭鍙疯绠楀欢杩熸椂闂�
+ // 绗竴涓崱鐗囧欢杩�1甯э紝绗簩涓欢杩�2甯э紝浠ユ绫绘帹锛屾渶澶氬欢杩�60甯�
+ int delayFrames = Mathf.Min(currentIndex + 1, 60);
- for (int i = 0; i < delayFrames; i++)
- {
- await UniTask.NextFrame();
- }
+ for (int i = 0; i < delayFrames; i++)
+ {
+ await UniTask.NextFrame();
+ }
- skeletonGraphic.initialSkinName = skinConfig.InitialSkinName;
- skeletonGraphic.Initialize(true);
+ // 寮傛鍒涘缓instanceGO鍜屽姞杞借祫婧�
+ await CreateInstanceAndLoadAssetsAsync(skinConfig, isLh: false);
+
+ if (skeletonGraphic == null || skeletonGraphic.skeletonDataAsset == null)
+ {
+ Debug.LogError("璧勬簮鍔犺浇澶辫触锛屾棤娉曞垵濮嬪寲妯″瀷");
+ return;
+ }
+
+ skeletonGraphic.initialSkinName = skinConfig.InitialSkinName;
+ skeletonGraphic.Initialize(true);
// 鍒濆鍖栧畬鎴愬悗璁剧疆鐨偆
if (!string.IsNullOrEmpty(skinConfig.InitialSkinName))
@@ -454,35 +417,138 @@
}
var skinConfig = HeroSkinConfig.Get(skinID);
- if (skinConfig != null && skeletonGraphic != null)
+ if (skinConfig != null)
{
- skeletonGraphic.initialSkinName = skinConfig.InitialSkinName;
- skeletonGraphic.Initialize(true);
+ // 鍚屾鍒涘缓instanceGO鍜屽姞杞借祫婧愶紙绔嬬粯闇�瑕佺珛鍗虫樉绀猴級
+ CreateInstanceAndLoadAssetsSync(skinConfig, isLh: true);
- if (!string.IsNullOrEmpty(skinConfig.InitialSkinName))
+ if (skeletonGraphic != null && skeletonGraphic.skeletonDataAsset != null)
{
- var skeleton = skeletonGraphic.Skeleton;
- skeleton.SetSkin(skinConfig.InitialSkinName);
- skeleton.SetSlotsToSetupPose();
- skeletonGraphic.Update(0);
+ skeletonGraphic.initialSkinName = skinConfig.InitialSkinName;
+ skeletonGraphic.Initialize(true);
+
+ if (!string.IsNullOrEmpty(skinConfig.InitialSkinName))
+ {
+ var skeleton = skeletonGraphic.Skeleton;
+ skeleton.SetSkin(skinConfig.InitialSkinName);
+ skeleton.SetSlotsToSetupPose();
+ skeletonGraphic.Update(0);
+ }
+
+ skeletonGraphic.enabled = true;
+ SetMaterialNone();
+
+ spineAnimationState = skeletonGraphic.AnimationState;
+ if (spineAnimationState != null)
+ {
+ spineAnimationState.Data.DefaultMix = 0f;
+ if (string.IsNullOrEmpty(motionName))
+ motionName = GetFistSpineAnim();
+ PlayAnimation(motionName, true);
+ spineAnimationState.Complete -= OnAnimationComplete;
+ spineAnimationState.Complete += OnAnimationComplete;
+ }
+
+ isInitialized = true;
+ isInitializing = false;
}
+ }
+ }
- skeletonGraphic.enabled = true;
- SetMaterialNone();
+ /// <summary>
+ /// 鍚屾鍒涘缓instanceGO鍜屽姞杞借祫婧愶紙鐢ㄤ簬绔嬬粯锛�
+ /// </summary>
+ private void CreateInstanceAndLoadAssetsSync(HeroSkinConfig skinConfig, bool isLh)
+ {
+ // 纭繚transform澶勪簬婵�娲荤姸鎬�
+ if (!transform.gameObject.activeSelf)
+ {
+ transform.SetActive(true);
+ }
- spineAnimationState = skeletonGraphic.AnimationState;
- if (spineAnimationState != null)
- {
- spineAnimationState.Data.DefaultMix = 0f;
- if (string.IsNullOrEmpty(motionName))
- motionName = GetFistSpineAnim();
- PlayAnimation(motionName, true);
- spineAnimationState.Complete -= OnAnimationComplete;
- spineAnimationState.Complete += OnAnimationComplete;
- }
+ // 鍒涘缓pool鍜宨nstanceGO
+ pool = GameObjectPoolManager.Instance.GetPool(UILoader.LoadPrefab("UIHero"));
+
+ if (instanceGO == null)
+ {
+ instanceGO = pool.Request();
+ instanceGO.transform.SetParent(transform);
+ //transform 鐨凱ivot Y鏄�0锛岃instanceGO 灞呬腑
+ instanceGO.transform.localPosition = new Vector3(0, instanceGO.GetComponent<RectTransform>().sizeDelta.y * 0.5f);
+ instanceGO.transform.localScale = Vector3.one;
+ instanceGO.transform.localRotation = Quaternion.identity;
+ }
- isInitialized = true;
- isInitializing = false;
+ skeletonGraphic = instanceGO.GetComponentInChildren<SkeletonGraphic>(true);
+
+ // 鍚屾鍔犺浇璧勬簮
+ if (isLh)
+ {
+ skeletonGraphic.skeletonDataAsset = ResManager.Instance.LoadAsset<SkeletonDataAsset>("Hero/SpineRes/", skinConfig.Tachie);
+ }
+ else
+ {
+ skeletonGraphic.skeletonDataAsset = ResManager.Instance.LoadAsset<SkeletonDataAsset>("Hero/SpineRes/", skinConfig.SpineRes);
+ }
+
+ if (skeletonGraphic.skeletonDataAsset == null)
+ {
+ transform.SetActive(false);
+ if (pool != null)
+ pool.Release(instanceGO);
+ skeletonGraphic = null;
+ Destroy(instanceGO);
+ Debug.LogError("鏈厤缃畇pine");
+ }
+ }
+
+ /// <summary>
+ /// 寮傛鍒涘缓instanceGO鍜屽姞杞借祫婧愶紙鐢ㄤ簬闈炵珛缁橈級
+ /// </summary>
+ private async UniTask CreateInstanceAndLoadAssetsAsync(HeroSkinConfig skinConfig, bool isLh)
+ {
+ // 纭繚transform澶勪簬婵�娲荤姸鎬�
+ if (!transform.gameObject.activeSelf)
+ {
+ transform.SetActive(true);
+ }
+
+ // 鍒涘缓pool鍜宨nstanceGO
+ pool = GameObjectPoolManager.Instance.GetPool(UILoader.LoadPrefab("UIHero"));
+
+ if (instanceGO == null)
+ {
+ instanceGO = pool.Request();
+ instanceGO.transform.SetParent(transform);
+ //transform 鐨凱ivot Y鏄�0锛岃instanceGO 灞呬腑
+ instanceGO.transform.localPosition = new Vector3(0, instanceGO.GetComponent<RectTransform>().sizeDelta.y * 0.5f);
+ instanceGO.transform.localScale = Vector3.one;
+ instanceGO.transform.localRotation = Quaternion.identity;
+ }
+
+ skeletonGraphic = instanceGO.GetComponentInChildren<SkeletonGraphic>(true);
+
+ // 鍦ㄤ富绾跨▼涓姞杞借祫婧愶紝閬垮厤Unity API绾跨▼瀹夊叏闂
+ // 浣跨敤UniTask.Yield()鏉ョ‘淇濆湪涓荤嚎绋嬩腑鎵ц
+ await UniTask.Yield();
+
+ if (isLh)
+ {
+ skeletonGraphic.skeletonDataAsset = ResManager.Instance.LoadAsset<SkeletonDataAsset>("Hero/SpineRes/", skinConfig.Tachie);
+ }
+ else
+ {
+ skeletonGraphic.skeletonDataAsset = ResManager.Instance.LoadAsset<SkeletonDataAsset>("Hero/SpineRes/", skinConfig.SpineRes);
+ }
+
+ if (skeletonGraphic.skeletonDataAsset == null)
+ {
+ transform.SetActive(false);
+ if (pool != null)
+ pool.Release(instanceGO);
+ skeletonGraphic = null;
+ Destroy(instanceGO);
+ Debug.LogError("鏈厤缃畇pine");
}
}
--
Gitblit v1.8.0