using System; using UnityEngine; using System.Collections; using YooAsset; using Live2D.Cubism.Rendering; //using System.Collections.Generic; using FairyGUI; //using DG.Tweening; namespace GFGGame { public class SceneController { private static GameObject currentAnimObj; //保存obj public static void UpdateMainScene(GameObject sceneObj) { //背景0 Transform tf = sceneObj.transform.Find("Bg"); SpriteRenderer spr = tf.GetComponent(); var resPath = RoleDataManager.GetMainBgRes(); SpriteHelper.AddSpriteTo(spr, resPath); //角色 CustomSuitData suitSavedData = CustomSuitDataManager.GetCurrentSuitData(); MyDressUpHelper.dressUpObj.setSceneObj(sceneObj.transform.Find("Scene").gameObject, false, true, null, false); MyDressUpHelper.dressUpObj.PutOnDressUpData(suitSavedData.dressUpData); } public static void UpdateDialogBg(string value, GameObject sceneObj) { StoryDialogDataManager.Instance.waitBgChange = false; Transform bg = sceneObj.transform.Find("Bg"); Transform bgNext = sceneObj.transform.Find("BgNext"); SpriteRenderer bgSpr = bg.GetComponent(); SpriteRenderer bgNextSpr = bgNext.GetComponent(); if (value == "0") { SpriteHelper.RemoveSpriteFrom(bgSpr); } else { var resPath = ResPathUtil.GetSceneBgPath(value); if (bgSpr.sprite == null) { SpriteHelper.AddSpriteTo(bgSpr, resPath); } else { StoryDialogDataManager.Instance.waitBgChange = true; StoryDialogDataManager.Instance.dialogShowDelay = 0.4f; SetSpriteRendererAlpha(bgSpr, 1f); SpriteHelper.AddSpriteTo(bgNextSpr, resPath); FairyGUI.Timers.inst.StartCoroutine(LastBgFadeOut()); IEnumerator LastBgFadeOut() { while (true) { if (bgSpr != null) { if (bgSpr.enabled && bgSpr.color.a > 0f) { SetSpriteRendererAlpha(bgSpr, bgSpr.color.a - 0.033f); } else { SpriteHelper.AddSpriteTo(bgSpr, resPath); SetSpriteRendererAlpha(bgSpr, 1f); SpriteHelper.RemoveSpriteFrom(bgNextSpr); break; } } else { break; } yield return new WaitForEndOfFrame(); } StoryDialogDataManager.Instance.waitBgChange = false; } } } } public static void InitPicFaceAsync(string faceValue, GameObject sceneObj, Action onComplete = null) { Transform face = sceneObj.transform.Find("Pic/Face"); if (face == null) { Debug.LogError("Face transform not found!"); onComplete?.Invoke(); return; } SpriteRenderer sprFace = face.GetComponent(); if (sprFace == null) { Debug.LogError("SpriteRenderer component not found on Face object!"); onComplete?.Invoke(); return; } if (faceValue == "0") { SpriteHelper.RemoveSpriteFrom(sprFace); onComplete?.Invoke(); } else { var resPath = ResPathUtil.GetNpcPicFacePath(faceValue); // 异步加载位置信息 DressUpUtil.LoadSpritePosAsync(resPath, (tx, ty) => { face.localPosition = new Vector3(tx, ty, face.localPosition.z); // 异步添加精灵 SpriteHelper.AddSpriteToAsync(sprFace, resPath, () => { onComplete?.Invoke(); }); }); } } public static string _lastDialogPic; public static async void UpdateDialogPic(string value, GameObject sceneObj) { StoryDialogDataManager.Instance.waitPicFade = false; Transform tf = sceneObj.transform.Find("Pic"); Transform face = sceneObj.transform.Find("Pic/Face"); SpriteRenderer spr = tf.GetComponent(); SpriteRenderer sprFace = face.GetComponent(); // 立绘切换 脸消失 if (_lastDialogPic != value) { SpriteHelper.RemoveSpriteFrom(sprFace); } _lastDialogPic = value; if (value == "0") { SpriteHelper.RemoveSpriteFrom(spr); SpriteHelper.RemoveSpriteFrom(sprFace); } else { StoryDialogDataManager.Instance.waitPicFade = true; var resPath = ResPathUtil.GetNpcPicSPath(value); SpriteHelper.AddSpriteTo(spr, resPath); SetSpriteRendererAlpha(spr, 0f); SetSpriteRendererAlpha(sprFace, 0f); FairyGUI.Timers.inst.StartCoroutine(UpdateDialogPicAlpha()); IEnumerator UpdateDialogPicAlpha() { while (true) { if (spr != null) { if (spr.enabled && spr.color.a < 1f) { SetSpriteRendererAlpha(spr, spr.color.a + 0.055f); SetSpriteRendererAlpha(sprFace, spr.color.a); } else { break; } } else { break; } yield return new WaitForEndOfFrame(); } StoryDialogDataManager.Instance.waitPicFade = false; } } } public static void UpdateDialogAnim(string value, GameObject animObj) { if (value == "0") { if (animObj != null) { PrefabManager.Instance.Restore(animObj); animObj = null; } } else { string res = value.Split('/')[1]; string path = ResPathUtil.GetStoryDialogCGPath(value, res); // 使用局部变量捕获当前animObj的值 GameObject currentAnimObj = animObj; PrefabManager.Instance.InstantiateAsync( path, (go) => { if (currentAnimObj != null) { PrefabManager.Instance.Restore(currentAnimObj); } if (go != null) { animObj = go; // 这里可以直接赋值给ref参数 // 加载完成后可以在这里执行额外初始化 } else { Debug.LogError($"Failed to load animation: {path}"); animObj = null; } } ); } } public static void UpdateDialogAnim(string value, ref GameObject animObj) { if (value == "0") { if (animObj != null) { PrefabManager.Instance.Restore(animObj); animObj = null; } } else { string res = value.Split('/')[1]; animObj = PrefabManager.Instance.InstantiateSync(ResPathUtil.GetStoryDialogCGPath(value, res)); //StoryDialogDataManager.Instance.dialogShowDelay = 0.4f; } } // 更新人物表情 - 异步版本 public static void UpdateEmojiAni(string value, GameObject animObj) { if (value == "0") { if (animObj != null) { PrefabManager.Instance.Restore(animObj); animObj = null; } } else { // 使用局部变量捕获当前animObj的值 value = string.Format("DressUp/{0}", value); string res = value.Split('/')[1]; string path = ResPathUtil.GetStoryDialogCGPath(value, res); PrefabManager.Instance.InstantiateAsync( path, (go) => { if (currentAnimObj != null) { PrefabManager.Instance.Restore(currentAnimObj); } if (go != null) { animObj = go; currentAnimObj = animObj; animObj.transform.position = new Vector3(0, -9, 0); animObj.transform.localScale = new Vector3(2.5f, 2.5f, 2.5f); } else { Debug.LogError($"Failed to load emoji animation: {path}"); animObj = null; } } ); } } public static void DeleteAnimObj() { if (currentAnimObj != null) { PrefabManager.Instance.Restore(currentAnimObj); currentAnimObj = null; } } public static void UpdateEmojiAni(string value, ref GameObject animObj) { if (value == "0") { if (animObj != null) { PrefabManager.Instance.Restore(animObj); animObj = null; } } else { PrefabManager.Instance.Restore(animObj); animObj = null; value = string.Format("DressUp/{0}", value); string res = value.Split('/')[1]; animObj = PrefabManager.Instance.InstantiateSync(ResPathUtil.GetStoryDialogCGPath(value, res)); if (animObj == null) return; animObj.transform.position = new Vector3(0, -9, 0); animObj.transform.localScale = new Vector3(2.5f, 2.5f, 2.5f); //StoryDialogDataManager.Instance.dialogShowDelay = 0.4f; } } public static void ControlBgVisible(GameObject sceneObj, bool isShow) { Transform bg = sceneObj.transform.Find("Bg"); Transform bgNext = sceneObj.transform.Find("BgNext"); bg.gameObject.SetActive(isShow); bgNext.gameObject.SetActive(isShow); } public static void SetSpriteRendererAlpha(SpriteRenderer spr, float a) { Color c = spr.color; c.a = a; spr.color = c; } public static void UpdateFightTarget(string value, GameObject sceneObj) { Transform tf = sceneObj.transform.Find("Npc"); SpriteRenderer spr = tf.GetComponent(); var resPath = ResPathUtil.GetNpcPicFPath(value); SpriteHelper.AddSpriteTo(spr, resPath); } public static void InitPicFace(string faceValue, GameObject sceneObj) { Transform face = sceneObj.transform.Find("Pic/Face"); SpriteRenderer sprFace = face.GetComponent(); if (faceValue == "0") { SpriteHelper.RemoveSpriteFrom(sprFace); } else { var resPath = ResPathUtil.GetNpcPicFacePath(faceValue); float tx, ty; DressUpUtil.LoadSpritePos(resPath, out tx, out ty); face.localPosition = new Vector3(tx, ty, face.localPosition.z); SpriteHelper.AddSpriteTo(sprFace, resPath); } } } }