using System; using System.Collections; using System.Collections.Generic; using TableConfig; using UnityEngine; namespace Snxxz.UI { [XLua.Hotfix] public class FairyFeastTransmitShow : MonoBehaviour { static FairyFeastTransmitShow s_Instance = null; public static FairyFeastTransmitShow Instance { get { if (s_Instance == null) { var gameObject = Instantiate(UILoader.LoadPrefab("FairyFeastTransmitShow")); s_Instance = gameObject.GetComponent(); s_Instance.transform.position = new Vector3(0, 4000, 5000); s_Instance.name = "FairyFeastTransmitShow"; s_Instance.IsOpen = false; s_Instance.gameObject.SetActive(true); DontDestroyOnLoad(gameObject); } return s_Instance; } } Camera m_ShowCamera; Transform m_ShowPoint1; Transform m_ShowPoint2; FairyTransmitModel m_Hero; FairyTransmitModel m_Player; SFXController m_Effect; public Camera showCamera { get { return m_ShowCamera; } } public FairyTransmitModel hero { get { return m_Hero; } } public FairyTransmitModel player { get { return m_Player; } } public bool IsOpen { get; private set; } public float progress { get { return timer / model.transmitExpSeconds; } } float timer = 0f; int stage = 0; PlayerPackModel playerPack { get { return ModelCenter.Instance.GetModel(); } } RoleParticularModel roleParticularModel { get { return ModelCenter.Instance.GetModel(); } } FairyFeastModel model { get { return ModelCenter.Instance.GetModel(); } } public event Action popUpExpEvent; public event Action onComplete; public void Open() { if (IsOpen) { return; } try { IsOpen = true; timer = 0f; stage = 0; transform.position = Vector3.zero; if (m_Effect != null) { SFXPlayUtility.Instance.Release(m_Effect); m_Effect = null; } m_Effect = SFXPlayUtility.Instance.Play(3075, transform); m_Effect.transform.SetParent(transform); m_Effect.gameObject.SetActive(true); m_Effect.duration = 0; m_Effect.transform.localPosition = Vector3.zero; LayerUtility.SetLayer(m_Effect.gameObject, LayerUtility.BossShow, true); m_ShowCamera = m_Effect.transform.GetComponentInChildren(); m_ShowPoint1 = m_Effect.transform.Find("Ca/Animaiotn/gua1"); m_ShowPoint2 = m_Effect.transform.Find("Ca/Animaiotn/gua2"); m_ShowCamera.enabled = true; WindowJumpMgr.Instance.ClearJumpData(); WindowCenter.Instance.CloseAll(WindowCenter.CloseAllIgnoreType.BaseAndCustom); WindowCenter.Instance.Open(); HideUI(); DisplayPlayer(); WindowCenter.Instance.Open(true); m_ShowCamera.gameObject.SetActive(true); CameraController.Instance.CameraObject.gameObject.SetActive(false); StageManager.Instance.onStartStageLoadingEvent -= OnStartStageLoadingEvent; StageManager.Instance.onStartStageLoadingEvent += OnStartStageLoadingEvent; } catch (Exception e) { Stop(); DebugEx.LogError(e.StackTrace); } } private void OnStartStageLoadingEvent(int obj) { Stop(); } private void LateUpdate() { if (IsOpen) { timer += Time.deltaTime; if (timer >= model.transmitCostSeconds) { Stop(); return; } if (timer >= stage * model.transmitExpSeconds / (model.expFlyStage + 1)) { StepStage(); stage++; } } } void StepStage() { if (stage > 0 && stage <= model.expFlyStage) { if (popUpExpEvent != null) { var exp = model.totalExp / (ulong)model.expFlyStage / (ulong)model.expFlyCount; for (int i = 0; i < model.expFlyCount; i++) { popUpExpEvent(exp); } } } } void HideUI() { UIRoot uiRoot = WindowCenter.Instance.uiRoot; uiRoot.EnableCanvas(false, uiRoot.baseCanvas, uiRoot.lifeBarCanvas, uiRoot.nameCanvas, uiRoot.normalCanvas, uiRoot.modalCanvas, uiRoot.tipsCanvas, uiRoot.systemCanvas, uiRoot.recycleBin, uiRoot.fightCanvasGroup.damageNumGroups[0].parent); CameraUtility.RemoveCullingMask(CameraManager.uiCamera, LayerUtility.UIEffectLayer); } void OpenUI() { UIRoot uiRoot = WindowCenter.Instance.uiRoot; uiRoot.EnableCanvas(true, uiRoot.baseCanvas, uiRoot.lifeBarCanvas, uiRoot.nameCanvas, uiRoot.normalCanvas, uiRoot.modalCanvas, uiRoot.tipsCanvas, uiRoot.systemCanvas, uiRoot.recycleBin, uiRoot.fightCanvasGroup.damageNumGroups[0].parent); CameraUtility.AddCullingMask(CameraManager.uiCamera, LayerUtility.UIEffectLayer); } void DisplayPlayer() { var clothes = playerPack.GetItemModelByIndex(PackType.rptEquip, (int)RoleEquipType.retClothes); var clothesId = clothes == null ? 0 : (int)clothes.itemInfo.ItemID; var wings = playerPack.GetItemModelByIndex(PackType.rptEquip, (int)RoleEquipType.retWing); var wingsId = wings == null ? 0 : (int)wings.itemInfo.ItemID; var secondary = playerPack.GetItemModelByIndex(PackType.rptEquip, (int)RoleEquipType.retWeapon2); var secondaryId = secondary == null ? 0 : (int)secondary.itemInfo.ItemID; var fashionClothes = playerPack.GetItemModelByIndex(PackType.rptEquip, (int)RoleEquipType.retFashionClothes); var fashionClothesId = fashionClothes == null ? 0 : (int)fashionClothes.itemInfo.ItemID; var fashionSecondary = playerPack.GetItemModelByIndex(PackType.rptEquip, (int)RoleEquipType.retFashionWeapon2); var fashionSecondaryId = fashionSecondary == null ? 0 : (int)fashionSecondary.itemInfo.ItemID; var data = new UI3DPlayerExhibitionData { job = PlayerDatas.Instance.baseData.Job, clothesId = clothesId, wingsId = wingsId, secondaryId = secondaryId, fashionClothesId = fashionClothesId, fashionSecondaryId = fashionSecondaryId, isDialogue = false, godWeapons = null }; if (m_Hero != null) { m_Hero.Dispose(); } m_Hero = new FairyTransmitModel(); m_Hero.Show(data, m_ShowPoint2); m_Hero.SitDown(); var viewPlayerData = roleParticularModel.GetViewPlayerData((int)model.transmitPlayer); if (viewPlayerData != null) { clothesId = 0; var itemData = roleParticularModel.GetItemData(RoleEquipType.retClothes); if (itemData != null) { clothesId = itemData.ItemID; } fashionClothesId = 0; itemData = roleParticularModel.GetItemData(RoleEquipType.retFashionClothes); if (itemData != null) { fashionClothesId = itemData.ItemID; } wingsId = 0; itemData = roleParticularModel.GetItemData(RoleEquipType.retWing); if (itemData != null) { wingsId = itemData.ItemID; } secondaryId = 0; itemData = roleParticularModel.GetItemData(RoleEquipType.retWeapon2); if (itemData != null) { secondaryId = itemData.ItemID; } fashionSecondaryId = 0; itemData = roleParticularModel.GetItemData(RoleEquipType.retFashionWeapon2); if (itemData != null) { fashionSecondaryId = itemData.ItemID; } data = new UI3DPlayerExhibitionData { job = viewPlayerData.rolePropData.Job, clothesId = clothesId, wingsId = wingsId, secondaryId = secondaryId, fashionClothesId = fashionClothesId, fashionSecondaryId = fashionSecondaryId, }; if (m_Player != null) { m_Player.Dispose(); } m_Player = new FairyTransmitModel(); m_Player.Show(data, m_ShowPoint1); m_Player.Transmit(); } } public void Stop() { IsOpen = false; model.TransmitComplete(); OpenUI(); WindowCenter.Instance.CloseImmediately(); CameraController.Instance.CameraObject.gameObject.SetActive(true); StageManager.Instance.onStartStageLoadingEvent -= OnStartStageLoadingEvent; transform.localPosition = new Vector3(0, 4000, 5000); if (m_ShowCamera != null) { m_ShowCamera.enabled = false; } if (m_Effect != null) { m_Effect.gameObject.SetActive(false); SFXPlayUtility.Instance.Release(m_Effect); m_Effect = null; } if (m_Hero != null) { m_Hero.Dispose(); m_Hero = null; } if (m_Player != null) { m_Player.Dispose(); m_Player = null; } if (onComplete != null) { onComplete(); } } public class FairyTransmitModel { Transform showPoint; int job = 1; GameObject clothesModel; Animator clothesAnimator; GameObject secondaryModel; GameObject extraSecondaryModel; GameObject wingsModel; Animator wingsAnimator; public Transform MP_Name { get; private set; } public void Show(UI3DPlayerExhibitionData data, Transform showPoint) { this.showPoint = showPoint; this.job = data.job; var clothes = data.fashionClothesId > 0 ? data.fashionClothesId : data.clothesId; var wingsId = data.wingsId; var secondaryId = data.fashionSecondaryId > 0 ? data.fashionSecondaryId : data.secondaryId; var jobConfig = Config.Instance.Get(job); var clothesResId = 0; if (clothes == 0) { clothesResId = jobConfig.BaseEquip[0]; } else { var item = Config.Instance.Get(clothes); clothesResId = item == null ? clothesResId = jobConfig.BaseEquip[0] : item.ChangeOrd; } PutOnClothes(clothesResId); var secondaryResId = 0; if (secondaryId == 0) { if (data.fashionClothesId <= 0) { if (this.job == 1) { secondaryResId = ModelResConfig.GetHandByClothesID(clothesResId); } } } else { var item = Config.Instance.Get(secondaryId); if (item != null) { secondaryResId = item.ChangeOrd; } } if (secondaryResId == 0) { secondaryResId = jobConfig.BaseEquip[2]; } PutOnSecondary(secondaryResId); var extraSecondaryId = 0; if (data.job == 1) { extraSecondaryId = ModelResConfig.GetHandByClothesID(0); if (data.fashionClothesId > 0) { var _item = Config.Instance.Get(data.fashionClothesId); if (_item != null) { extraSecondaryId = ModelResConfig.GetHandByClothesID(_item.ChangeOrd); } } else if (data.clothesId > 0) { var _item = Config.Instance.Get(data.clothesId); if (_item != null) { extraSecondaryId = ModelResConfig.GetHandByClothesID(_item.ChangeOrd); } } if (secondaryResId == 0 || (data.fashionClothesId != 0 && data.fashionSecondaryId > 0)) { PutOnExtraSecondary(job, extraSecondaryId); } } var wingsResId = 0; if (wingsId != 0) { var item = Config.Instance.Get(wingsId); wingsResId = item == null ? 0 : item.ChangeOrd; } PutOnWing(wingsResId); SwitchMaterial(clothesResId, false); } public void PutOnClothes(int clothesResId) { var config = Config.Instance.Get(job); var _prefab = InstanceResourcesLoader.LoadModelRes(clothesResId, true); if (!_prefab) { clothesResId = config.BaseEquip[0]; } LoadClothes(clothesResId); } private void LoadClothes(int clothesResId) { var prefab = InstanceResourcesLoader.LoadModelRes(clothesResId, true); if (prefab) { clothesModel = GameObject.Instantiate(prefab); LayerUtility.SetLayer(clothesModel, LayerUtility.BossShow, false); var skinnedMeshRenderer = clothesModel.GetComponentInChildren(true); LayerUtility.SetLayer(skinnedMeshRenderer.gameObject, LayerUtility.BossShow, false); clothesModel.SetActive(true); clothesModel.transform.SetParentEx(showPoint, Vector3.zero, Quaternion.identity, Vector3.one); clothesAnimator = clothesModel.GetComponent(); MP_Name = clothesModel.transform.GetChildTransformDeeply("A_Name"); if (!MP_Name) { MP_Name = clothesModel.transform; } if (clothesAnimator) { RuntimeAnimatorController _controller = AnimatorControllerLoader.Load(AnimatorControllerLoader.controllerUISuffix, clothesResId); clothesAnimator.runtimeAnimatorController = _controller; clothesAnimator.enabled = true; } else { DebugEx.LogErrorFormat("角色资源: {0} 没有动画控制器", clothesResId); } } } public void SwitchMaterial(int clothesId, bool isSuit) { if (clothesModel == null) { return; } var smRenderer = clothesModel.GetComponentInChildren(); if (smRenderer == null) { return; } MaterialLoader.Release(smRenderer.material); var newMat = MaterialLoader.LoadClothesMaterial(clothesId, true, isSuit); if (newMat != null) { smRenderer.material = newMat; } } private void PutOnSecondary(int secondaryResId) { if (this.job == 2) { return; } if (secondaryResId != 0) { var prefab = InstanceResourcesLoader.LoadModelRes(secondaryResId); if (!prefab) { var config = Config.Instance.Get(job); secondaryResId = config.BaseEquip[2]; prefab = InstanceResourcesLoader.LoadModelRes(secondaryResId); } if (prefab) { secondaryModel = GameObject.Instantiate(prefab); secondaryModel.layer = LayerUtility.BossShow; var parent = clothesModel.transform.GetChildTransformDeeply(GAStaticDefine.SecondaryBindBoneName[job - 1]); secondaryModel.transform.SetParentEx(parent, Vector3.zero, Quaternion.identity, Vector3.one); } } } private void PutOnExtraSecondary(int job, int extraSecondaryId) { if (this.job == 2) { return; } if (extraSecondaryId != 0) { var prefab = InstanceResourcesLoader.LoadModelRes(extraSecondaryId); if (!prefab) { var config = Config.Instance.Get(job); extraSecondaryId = config.BaseEquip[2]; prefab = InstanceResourcesLoader.LoadModelRes(extraSecondaryId); } if (prefab) { extraSecondaryModel = GameObject.Instantiate(prefab); extraSecondaryModel.layer = LayerUtility.BossShow; var parent = clothesModel.transform.GetChildTransformDeeply(GAStaticDefine.SecondaryBindBoneName[job - 1]); extraSecondaryModel.transform.SetParentEx(parent, Vector3.zero, Quaternion.identity, Vector3.one); } } } private void PutOnWing(int resourceId) { var config = Config.Instance.Get(job); if (resourceId != 0) { var prefab = InstanceResourcesLoader.LoadModelRes(resourceId); if (!prefab) { resourceId = config.BaseEquip[3]; prefab = InstanceResourcesLoader.LoadModelRes(resourceId); } if (prefab) { wingsModel = GameObject.Instantiate(prefab); wingsModel.layer = LayerUtility.BossShow; SkinnedMeshRenderer _renderer = wingsModel.GetComponentInChildren(); if (_renderer) { _renderer.gameObject.layer = LayerUtility.BossShow; } var parent = clothesModel.transform.GetChildTransformDeeply(GAStaticDefine.WingBindBoneName); var modelResConfig = Config.Instance.Get(resourceId); wingsModel.transform.SetParentEx(parent, Vector3.zero, Quaternion.identity, modelResConfig.UIScale); wingsAnimator = wingsModel.GetComponent(); wingsAnimator.enabled = true; wingsAnimator.Play("UI_Idle", 0); } } } public void Transmit() { if (clothesAnimator) { clothesAnimator.SetInteger(GAStaticDefine.Param_Action, GAStaticDefine.Act_Transmit); } } public void SitDown() { if (clothesAnimator) { clothesAnimator.SetInteger(GAStaticDefine.Param_Action, GAStaticDefine.Act_Dazuo); } } public void Dispose() { if (clothesModel != null) { var smRenderer = clothesModel.GetComponentInChildren(); if (smRenderer != null) { MaterialLoader.Release(smRenderer.material); smRenderer.material = smRenderer.sharedMaterial = null; smRenderer.materials = smRenderer.sharedMaterials = new Material[0]; } Destroy(clothesModel); } if (secondaryModel != null) { Destroy(secondaryModel); } if (extraSecondaryModel != null) { Destroy(extraSecondaryModel); } if (wingsModel != null) { Destroy(wingsModel); } } } } }