using FairyGUI; using System; using UnityEngine; namespace GFGGame { //实现换装对象在UI界面上显示 public class DressUpObjUI { public GameObject sceneObject; public GoWrapper wrapper; public DressUpObj dressUpObj; string prefabName; private Action onShowAction; public DressUpObjUI(string prefabName = "SceneDressUp", Action onShowAction = null) { this.prefabName = prefabName; this.onShowAction = onShowAction; dressUpObj = new DressUpObj(); wrapper = new GoWrapper(); } /// /// 异步重置场景对象 /// /// /// 如果UI界面的组件有遮罩,那么这里也需要设置为true才能生效 /// 是否显示场景道具类型 /// /// 是否显示背景 /// 场景对象加载完成后的回调 public void ResetSceneObjAsync(int scale = 100, bool needSetMask = false, bool showSceneType = true, GameObject roleObj = null, bool showBg = true, Action callback = null) { // 先销毁旧的场景对象 if (sceneObject != null) { GameObject.Destroy(sceneObject); sceneObject = null; } // 异步加载新场景对象 PrefabManager.Instance.InstantiateAsync( ResPathUtil.GetPrefabPath(this.prefabName), (go) => { if (go != null) { sceneObject = go; sceneObject.transform.localScale = new Vector3(scale, scale, scale); dressUpObj.setSceneObj(sceneObject, needSetMask, showSceneType, roleObj, showBg, OnShow); callback?.Invoke(sceneObject); } else { Debug.LogError($"Failed to instantiate scene object: {this.prefabName}"); callback?.Invoke(null); } }); } /// /// /// /// /// 如果UI界面的组件有遮罩,那么这里也需要设置为true才能生效 /// 是否显示场景道具类型 /// /// 是否显示背景 public void ResetSceneObj(int scale = 100, bool needSetMask = false, bool showSceneType = true, GameObject roleObj = null, bool showBg = true) { // 先销毁旧的场景对象 if (sceneObject != null) { GameObject.Destroy(sceneObject); sceneObject = null; } //这里每次都要实例化新的,复用会有bug sceneObject = PrefabManager.Instance.InstantiateSync(ResPathUtil.GetPrefabPath(this.prefabName)); sceneObject.transform.localScale = new Vector3(scale, scale, scale); dressUpObj.setSceneObj(sceneObject, needSetMask, showSceneType, roleObj, showBg, OnShow); } public void UpdateWrapper(GGraph holder) { holder.SetNativeObject(wrapper); wrapper.wrapTarget = sceneObject; } public void Dispose() { onShowAction = null; if (sceneObject != null) { PrefabManager.Instance.Restore(sceneObject); sceneObject = null; } if (dressUpObj != null) { dressUpObj.Dispose(); dressUpObj = null; } if (wrapper != null) { if (wrapper.wrapTarget != null) { wrapper.wrapTarget = null; } wrapper.Dispose(); wrapper = null; } } private void OnShow() { onShowAction?.Invoke(); if (sceneObject == null) { return; } if (wrapper != null) { wrapper.wrapTarget = sceneObject; //wrapper.CacheRenderers(); } } } }