using System; using System.Collections; using System.Collections.Generic; using UnityEngine; namespace vnxbqy.UI { public class TreasureComponent { const string EFFECT_BONE = "Bone_effect"; const string HUMAN_LOCKSFX_STATE_1 = "Effcet_FaBao_FengYin"; const string HUMAN_LOCKSFX_STATE_2 = "Effcet_FaBao_FengYin_02"; const string DEMON_LOCKSFX_STATE_1 = "Effcet_FaBao_FengYin2_01"; const string DEMON_LOCKSFX_STATE_2 = "Effcet_FaBao_FengYin2_02"; const string HUMAN_HIGHEST_STAGE_1 = "Effect_FaBao_QuanJueXing"; const string HUMAN_HIGHEST_STAGE_2 = "Effect_FaBao_QuanJueXing_2"; const int HUMAN_BACKLIGHT_EFFECT = 5115; const int DEMON_BACKLIGHT_EFFECT = 5116; const int FAIRY_BACKLIGHT_EFFECT = 5117; const int UNGET_BACKLIGHT_EFFECT = 5125; public int treasureId = 0; public bool display = false; public TreasureCategory category; public Transform root; public Transform treasureRoot; public TreasureInteractProcessor interactProcessor; Transform treasure; SkinnedMeshRenderer treasureSkin; Transform bottom; Transform name; TextMesh condition; DemonDungeonLabel treasureLabel; TreasureThreeDimensionsBehaviour m_ThreeDimensionsBehaviour; HumanThreeDimensionsBehaviour m_HumanThreeDimensions; SFXController treasureEffect; SFXController backLightEffect; SFXController lockEffect; SFXController challengeSfx; SFXController specialSfx; public Treasure3DConfig paramConfig { get; set; } static Dictionary m_BottomPoolDict = new Dictionary(); static Dictionary m_StatePoolDict = new Dictionary(); static Dictionary m_ConditionPoolDict = new Dictionary(); static Dictionary m_LabelPoolDict = new Dictionary(); static Dictionary m_TreasureCanvaPool = new Dictionary(); static Vector3 m_CacheBottomScale = Vector3.zero; TreasureModel m_Model; TreasureModel model { get { return m_Model ?? (m_Model = ModelCenter.Instance.GetModel()); } } AchievementModel achievementModel { get { return ModelCenter.Instance.GetModel(); } } public void SetActive(bool _active) { display = _active; if (_active) { RequestName(); RequestTreasure(); RequestBottom(); RequestBackLight(); RequestTreasureCanva(); UpdateTreasureState(); UpdateParam(); model.demonTreasureDungeonUpdate -= DemonTreasureDungeonUpdate; model.demonTreasureDungeonUpdate += DemonTreasureDungeonUpdate; } else { RecycleName(); RecycleBottom(); RecycleTreasure(); RecycleBackLight(); RecycleLockEffect(); RecycleCollectingSfx(); RecycleCondition(); RecycleTreasureLabel(); RecycleTreasureCanva(); model.demonTreasureDungeonUpdate -= DemonTreasureDungeonUpdate; } interactProcessor.SetActive(_active); } public void RequestName() { RecycleName(); if (category == TreasureCategory.King) { return; } if (name == null) { if (paramConfig != null && !paramConfig.treasureNamePrefab.Equals(string.Empty)) { var _instance = UILoader.LoadTreasure("Misc", paramConfig.treasureNamePrefab); if (_instance != null) { _instance = GameObject.Instantiate(_instance); name = _instance.transform; name.SetParent(root); name.localPosition = Vector3.zero; name.localScale = Vector3.one; name.LookAt(UI3DTreasureSelectStage.Instance.center); LayerUtility.SetLayer(name.gameObject, LayerUtility.UILayer, true); } } } if (name != null) { name.SetActive(true); LayerUtility.SetLayer(name.gameObject, LayerUtility.UILayer, true); } } public void RequestBottom() { RecycleBottom(); GameObjectPoolManager.GameObjectPool _pool = null; if (!m_BottomPoolDict.TryGetValue(category, out _pool)) { var _bottomPrefab = UILoader.LoadTreasure("Misc", StringUtility.Contact("TreasureBottom_", category)); m_CacheBottomScale = _bottomPrefab.transform.localScale; _pool = GameObjectPoolManager.Instance.RequestPool(_bottomPrefab); m_BottomPoolDict.Add(category, _pool); } bottom = _pool.Request().transform; bottom.SetActive(true); bottom.SetParent(root); bottom.transform.localPosition = Vector3.zero; bottom.transform.localScale = m_CacheBottomScale; bottom.LookAt(UI3DTreasureSelectStage.Instance.center); LayerUtility.SetLayer(bottom.gameObject, LayerUtility.UILayer, true); } public void RecycleBottom() { if (m_BottomPoolDict.ContainsKey(category) && bottom != null) { m_BottomPoolDict[category].Release(bottom.gameObject); bottom = null; } } public void RequestTreasure() { RecycleTreasure(); var instance = UI3DModelFactory.LoadUITreasure(treasureId); if (instance == null) { return; } treasure = instance.transform; treasure.SetParent(treasureRoot); treasure.localPosition = Vector3.zero; treasure.LookAt(UI3DTreasureSelectStage.Instance.showCamera.transform); treasure.SetActive(true); bool requireGraySkin = RequireGrayTreasureSkin(); treasureSkin = treasure.GetComponentInChildren(); if (treasureSkin != null) { treasureSkin.material.SetFloat("_Gray", requireGraySkin ? 1 : 0); } } public void RecycleTreasure() { if (treasure != null) { if (treasureSkin != null) { treasureSkin.material.SetFloat("_Gray", 0); treasureSkin = null; } UI3DModelFactory.ReleaseUITreasure(treasureId, treasure.gameObject); treasure = null; } } public void RecycleName() { if (name != null) { name.SetActive(false); } } public void UpdateParam() { if (paramConfig != null) { if (treasure != null) { treasure.localPosition = paramConfig.modelParam.position; treasure.localScale = paramConfig.modelParam.scale; } if (name != null) { name.localPosition = paramConfig.nameParam.position; name.localEulerAngles = paramConfig.nameParam.rotation; name.localScale = paramConfig.nameParam.scale; } if (bottom != null) { bottom.localPosition = paramConfig.bottomParam.position; bottom.localScale = paramConfig.bottomParam.scale; } if (challengeSfx != null) { var _param = UI3DTreasureSelectStage.Instance.challengeSfxParam; challengeSfx.transform.localPosition = _param.position; challengeSfx.transform.localScale = _param.scale; } if (lockEffect != null) { lockEffect.transform.localPosition = paramConfig.lockSfxParam.position; } } } public void RequestTreasureEffect() { RecycleTreasureEffect(); if (treasure == null) { return; } var config = TreasureConfig.Get(treasureId); var mountPoint = treasure.GetChildTransformDeeply(EFFECT_BONE); if (mountPoint == null) { mountPoint = treasure.transform; } treasureEffect = SFXPlayUtility.Instance.Play(config.EffectID, mountPoint); if (treasureEffect != null) { LayerUtility.SetLayer(treasureEffect.gameObject, LayerUtility.UILayer, true); } } public void RecycleTreasureEffect() { if (treasureEffect != null) { SFXPlayUtility.Instance.Release(treasureEffect); treasureEffect = null; } } public void UpdateTreasureState() { if (treasure == null) { return; } Treasure _treasure; if (!model.TryGetTreasure(treasureId, out _treasure)) { return; } bool requireGraySkin = RequireGrayTreasureSkin(); if (treasureSkin != null) { treasureSkin.material.SetFloat("_Gray", requireGraySkin ? 1 : 0); if (model.IsRequireUnlockAnim(UI3DTreasureSelectStage.Instance.currentCategory) == _treasure.id && !UI3DTreasureSelectStage.Instance.CloserComplete) { treasureSkin.material.SetFloat("_Gray", 1); } } RequestBackLight(); switch (_treasure.state) { case TreasureState.Collected: RecycleCollectingSfx(); RequestTreasureEffect(); RecycleLockEffect(); RecycleCondition(); RequestTreasureLabel(); break; case TreasureState.Collecting: RequestTreasureEffect(); RequestCollectingSfx(); RecycleLockEffect(); RecycleCondition(); RequestTreasureLabel(); break; case TreasureState.Locked: RecycleCollectingSfx(); RecycleTreasureEffect(); RequestLockEffect(); RequestCondition(); RecycleTreasureLabel(); break; } if (model.IsRequireUnlockAnim(UI3DTreasureSelectStage.Instance.currentCategory) == _treasure.id) { RecycleCollectingSfx(); RecycleTreasureEffect(); RequestLockEffect(); } if (UI3DTreasureSelectStage.Instance.CloserComplete && UI3DTreasureSelectStage.Instance.selectTreasure == treasureId) { CloserState(); } UpdateParam(); } private void RequestBackLight() { RecycleBackLight(); Treasure _treasure; model.TryGetTreasure(treasureId, out _treasure); if (treasure != null && _treasure != null) { var _effectId = 0; if (_treasure.state == TreasureState.Collected) { _effectId = category == TreasureCategory.Human ? HUMAN_BACKLIGHT_EFFECT : category == TreasureCategory.Demon ? DEMON_BACKLIGHT_EFFECT : FAIRY_BACKLIGHT_EFFECT; } else { _effectId = UNGET_BACKLIGHT_EFFECT; } if (model.IsRequireUnlockAnim(UI3DTreasureSelectStage.Instance.currentCategory) == treasureId) { _effectId = UNGET_BACKLIGHT_EFFECT; } backLightEffect = SFXPlayUtility.Instance.Play(_effectId, root); if (backLightEffect != null) { backLightEffect.duration = 0; } } } private void RecycleBackLight() { if (backLightEffect != null) { SFXPlayUtility.Instance.Release(backLightEffect); backLightEffect = null; } } private void RequestCollectingSfx() { RecycleCollectingSfx(); challengeSfx = SFXPlayUtility.Instance.Play(category == TreasureCategory.Demon ? 5155 : 5145, root); if (challengeSfx != null) { challengeSfx.gameObject.SetActive(true); LayerUtility.SetLayer(challengeSfx.gameObject, LayerUtility.UILayer, true); challengeSfx.transform.LookAt(UI3DTreasureSelectStage.Instance.center); challengeSfx.duration = 0; } } private void RecycleCollectingSfx() { if (challengeSfx != null) { challengeSfx.gameObject.SetActive(false); SFXPlayUtility.Instance.Release(challengeSfx); challengeSfx = null; } } private void RequestLockEffect() { RecycleLockEffect(); if (category == TreasureCategory.King) { return; } var _id = category == TreasureCategory.Human ? 5132 : 5157; lockEffect = SFXPlayUtility.Instance.Play(_id, treasureRoot); if (lockEffect != null) { LayerUtility.SetLayer(lockEffect.gameObject, LayerUtility.UILayer, true); lockEffect.transform.LookAt(UI3DTreasureSelectStage.Instance.center); lockEffect.duration = 0; var _animator = lockEffect.transform.GetComponentInChildren(); if (_animator != null) { var _state = category == TreasureCategory.Human ? HUMAN_LOCKSFX_STATE_1 : DEMON_LOCKSFX_STATE_1; _animator.Play(_state, 0, 0); } } } public void RecycleLockEffect() { if (lockEffect != null) { SFXPlayUtility.Instance.Release(lockEffect); lockEffect = null; } } public void RequestSpecialEffect() { RecycleSpecialEffect(); if (treasureId == 301) { specialSfx = SFXPlayUtility.Instance.Play(5159, root); if (specialSfx != null) { specialSfx.duration = 0; if (paramConfig != null) { specialSfx.transform.localPosition = GetAdaptiveDistance(paramConfig.specialSfxParam.position); specialSfx.transform.localScale = paramConfig.specialSfxParam.scale; } LayerUtility.SetLayer(specialSfx.gameObject, LayerUtility.DefaultLayer, true); } } } void RequestCondition() { RecycleCondition(); if (category != TreasureCategory.Human && category != TreasureCategory.Demon) { return; } string displayStr = string.Empty; switch (category) { case TreasureCategory.Human: //if (model.IsVersionUnOpenTreasure(treasureId)) //{ // displayStr = "="; //} //else //{ // Achievement achievement = null; // var achievementId = 0; // var unlock = false; // if (model.TryGetTreasureUnlockAchievement(treasureId, out achievementId)) // { // if (achievementModel.TryGetAchievement(achievementId, out achievement)) // { // unlock = true; // } // } // if (unlock && !achievement.completed) // { // var _achievementConfig = SuccessConfig.Get(achievementId); // var _missionId = _achievementConfig.Condition[0]; // var _taskConfig = PyTaskConfig.Get(_missionId); // if (_taskConfig == null) // { // return; // } // if (_achievementConfig.Type == 3) // { // displayStr = StringUtility.Contact(_taskConfig.lv, "+"); // } // } //} break; case TreasureCategory.Demon: var config = TreasureConfig.Get(treasureId); if (config != null) { displayStr = StringUtility.Contact(config.ChallengeLevel, "+"); } break; } if (string.IsNullOrEmpty(displayStr)) { return; } GameObjectPoolManager.GameObjectPool pool; if (m_ConditionPoolDict.TryGetValue(category, out pool) == false) { var _prefab = UILoader.LoadTreasure("Misc", StringUtility.Contact(category, "TreasureCondition")); pool = GameObjectPoolManager.Instance.RequestPool(_prefab); m_ConditionPoolDict.Add(category, pool); } condition = pool.Request().GetComponent(); condition.SetActive(true); condition.transform.SetParent(root); condition.transform.localPosition = Vector3.zero; condition.transform.LookAt(UI3DTreasureSelectStage.Instance.center); condition.transform.localPosition = new Vector3(0, -1.75f, 0f); condition.transform.localScale = new Vector3(-1, 1, 1); condition.text = displayStr; LayerUtility.SetLayer(condition.gameObject, LayerUtility.UILayer, true); } void RecycleCondition() { if (m_ConditionPoolDict.ContainsKey(category) && condition != null) { var pool = m_ConditionPoolDict[category]; pool.Release(condition.gameObject); condition = null; } } void RequestTreasureLabel() { RecycleTreasureLabel(); if (category != TreasureCategory.Demon) { return; } string label1 = string.Empty; string label2 = string.Empty; switch (category) { case TreasureCategory.Demon: Treasure _treasure; if (model.TryGetTreasure(treasureId, out _treasure)) { switch (_treasure.state) { case TreasureState.Collected: label1 = ":"; break; case TreasureState.Collecting: TreasureDungeon treasureDungeon; if (model.TryGetTreasureDungeon(treasureId, out treasureDungeon)) { label1 = "+"; label2 = StringUtility.Contact("(", treasureDungeon.currentLevel, "/", treasureDungeon.maxLevel, ")"); } break; case TreasureState.Locked: return; } } break; } if (string.IsNullOrEmpty(label1)) { return; } GameObjectPoolManager.GameObjectPool pool; if (m_LabelPoolDict.TryGetValue(category, out pool) == false) { var _prefab = UILoader.LoadTreasure("Misc", StringUtility.Contact(category, "TreasureLabel")); pool = GameObjectPoolManager.Instance.RequestPool(_prefab); m_LabelPoolDict.Add(category, pool); } treasureLabel = pool.Request().GetComponent(); treasureLabel.SetActive(true); treasureLabel.transform.SetParent(root); treasureLabel.transform.localPosition = Vector3.zero; treasureLabel.transform.LookAt(UI3DTreasureSelectStage.Instance.center); treasureLabel.transform.localPosition = new Vector3(0, -1.73f, 0f); treasureLabel.transform.localScale = new Vector3(-1, 1, 1); treasureLabel.Display(label1, label2); LayerUtility.SetLayer(treasureLabel.gameObject, LayerUtility.UILayer, true); } private void DemonTreasureDungeonUpdate(int id) { if (id == treasureId) { DisplayTreasureLabel(); } } void DisplayTreasureLabel() { if (category == TreasureCategory.Demon) { if (treasureLabel != null) { Treasure _treasure; if (model.TryGetTreasure(treasureId, out _treasure)) { switch (_treasure.state) { case TreasureState.Collected: treasureLabel.Display(":", string.Empty); break; case TreasureState.Collecting: TreasureDungeon treasureDungeon; if (model.TryGetTreasureDungeon(treasureId, out treasureDungeon)) { treasureLabel.Display("+", StringUtility.Contact("(", treasureDungeon.currentLevel, "/", treasureDungeon.maxLevel, ")")); } break; } } } } } void RecycleTreasureLabel() { if (m_LabelPoolDict.ContainsKey(category) && treasureLabel != null) { var pool = m_LabelPoolDict[category]; pool.Release(treasureLabel.gameObject); treasureLabel = null; } } public Vector3 GetAdaptiveDistance(Vector3 _distance) { var normal = Constants.DESIGN_RESOLUTION.x / Constants.DESIGN_RESOLUTION.y; var now = (float)Screen.width / (float)Screen.height; if (now < normal) { return _distance * (now / normal); } else { return _distance; } } public void RecycleSpecialEffect() { if (specialSfx != null) { specialSfx.gameObject.SetActive(false); SFXPlayUtility.Instance.Release(specialSfx); specialSfx = null; } } public void RequestTreasureCanva() { RecycleTreasureCanva(); if (category != TreasureCategory.King && category != TreasureCategory.Human) { return; } if (UI3DTreasureSelectStage.Instance.UnlockShowing && model.IsRequireUnlockAnim(category) == treasureId) { return; } if (!m_TreasureCanvaPool.ContainsKey(category)) { var prefab = UILoader.LoadTreasure("Misc", "TreasureCanva_" + category.ToString()); if (prefab) { m_TreasureCanvaPool.Add(category, GameObjectPoolManager.Instance.RequestPool(prefab)); } } if (m_TreasureCanvaPool.ContainsKey(category)) { var pool = m_TreasureCanvaPool[category]; var go = pool.Request(); go.SetActive(true); go.transform.SetParent(root); go.transform.localPosition = Vector3.zero; go.transform.localEulerAngles = new Vector3(0, -180, 0); go.transform.localScale = Vector3.one * 0.01f; LayerUtility.SetLayer(go, LayerUtility.DevisableUI, true); switch (category) { case TreasureCategory.Human: m_HumanThreeDimensions = go.GetComponent(); m_HumanThreeDimensions.SetCamera(UI3DTreasureSelectStage.Instance.treasureUICamera); m_HumanThreeDimensions.Display(treasureId); break; case TreasureCategory.King: m_ThreeDimensionsBehaviour = go.GetComponent(); m_ThreeDimensionsBehaviour.SetCamera(UI3DTreasureSelectStage.Instance.treasureUICamera); m_ThreeDimensionsBehaviour.Display(treasureId); break; } } } public void RecycleTreasureCanva() { if (m_ThreeDimensionsBehaviour != null) { m_ThreeDimensionsBehaviour.SetActive(false); m_TreasureCanvaPool[TreasureCategory.King].Release(m_ThreeDimensionsBehaviour.gameObject); m_ThreeDimensionsBehaviour = null; } if (m_HumanThreeDimensions != null) { m_HumanThreeDimensions.SetActive(false); m_TreasureCanvaPool[TreasureCategory.Human].Release(m_HumanThreeDimensions.gameObject); m_HumanThreeDimensions = null; } } public void CloserState() { RecycleBottom(); RecycleCollectingSfx(); RecycleName(); RecycleBackLight(); RecycleLockEffect(); RecycleCondition(); RecycleTreasureLabel(); RecycleTreasureCanva(); RequestSpecialEffect(); Treasure _treasure; if (!model.TryGetTreasure(treasureId, out _treasure)) { return; } if (_treasure.state != TreasureState.Locked) { RequestTreasureEffect(); } else { RecycleTreasureEffect(); } } public void SetLayer(int _layer) { LayerUtility.SetLayer(root.gameObject, _layer, true); LayerUtility.SetLayer(treasureRoot.gameObject, _layer, true); if (m_ThreeDimensionsBehaviour != null) { LayerUtility.SetLayer(m_ThreeDimensionsBehaviour.gameObject, LayerUtility.DevisableUI, true); } } public void OutCloserState() { RequestBottom(); RequestName(); RequestTreasureCanva(); UpdateTreasureState(); RecycleSpecialEffect(); UpdateParam(); } public void PlayUnlockShow() { RecycleLockEffect(); RecycleCondition(); RecycleTreasureLabel(); RecycleTreasureCanva(); try { var _effect = SFXPlayUtility.Instance.Play(category == TreasureCategory.Demon ? 5157 : 5132, treasureRoot); if (_effect != null) { SoundPlayer.Instance.PlayUIAudio(category == TreasureCategory.Demon ? 51 : 52); LayerUtility.SetLayer(_effect.gameObject, LayerUtility.UILayer, true); _effect.transform.LookAt(UI3DTreasureSelectStage.Instance.center); _effect.transform.localPosition = paramConfig.lockSfxParam.position; _effect.duration = 3.0f; var _animator = _effect.transform.GetComponentInChildren(); if (_animator != null) { _animator.Play(category == TreasureCategory.Demon ? DEMON_LOCKSFX_STATE_2 : HUMAN_LOCKSFX_STATE_2, 0, 0); } } } catch (System.Exception e) { Debug.Log(e.Message); } SnxxzGame.Instance.StartCoroutine(Co_UnlockShow()); } IEnumerator Co_UnlockShow() { yield return WaitingForSecondConst.GetWaitForSeconds(2.2f); UI3DTreasureSelectStage.Instance.UnlockShowing = false; model.SetUnlockAnim(UI3DTreasureSelectStage.Instance.currentCategory, 0); if (display) { UpdateTreasureState(); } if (model.treasureGotoId != 0) { UI3DTreasureSelectStage.Instance.OnPointDownTreasure(model.treasureGotoId); model.treasureGotoId = 0; } UI3DTreasureSelectStage.Instance.CompleteUnlock(); model.treasureGotoId = 0; } bool RequireGrayTreasureSkin() { Treasure _treasure; if (!model.TryGetTreasure(treasureId, out _treasure)) { return true; } return _treasure.state != TreasureState.Collected && _treasure.state != TreasureState.Collecting; } } }