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