//-------------------------------------------------------- // [Author]: 第二世界 // [ Date ]: Thursday, September 07, 2017 //-------------------------------------------------------- using UnityEngine; using System.Collections; using UnityEngine.UI; using System; using Spine; using System.Collections.Generic; //用于人物头像面板 namespace vnxbqy.UI { public class MainTreePanel : MonoBehaviour { [SerializeField] RawImage playerModel; [SerializeField] ButtonEx cutTreeBtn; [SerializeField] PositionTween treeSpine; [SerializeField] ButtonEx cutAutoBtn; [SerializeField] UIEffect cutEffect; [SerializeField] ButtonEx adventureBtn; [SerializeField] Text cutMoneyCnt; [SerializeField] EquipOnFloor equipOnFloor; [SerializeField] Image taskAwardImg; [SerializeField] Text taskAwardCnt; [SerializeField] Text taskName; [SerializeField] Text taskValue; [SerializeField] UIEffect taskFinishEffect; [SerializeField] ButtonEx taskButton; [SerializeField] Text treeLVTxt; [SerializeField] ButtonEx treeBtn; [SerializeField] ButtonEx familyBtn; //仙盟 [SerializeField] ButtonEx homeBtn; //洞府 [SerializeField] ButtonEx challengeBtn;//挑战 [SerializeField] ButtonEx petBtn; [SerializeField] ButtonEx lqBtn;//灵器 [SerializeField] ButtonEx fyBtn;//符印 [SerializeField] ButtonEx gubaoBtn; //古宝(藏宝阁) [SerializeField] ButtonEx horseBtn; //坐骑 [SerializeField] ButtonEx realmUpgrade; [SerializeField] List baseAttrList; [SerializeField] Text money1; [SerializeField] Button money1Btn; [SerializeField] Text money2; [SerializeField] Text playerNameText; [SerializeField] ImageEx AutoImg; [SerializeField] RotationTween AutoTween; [SerializeField] UIEffect AutoUIEffect; CutTreeModel cutTreeModel { get { return ModelCenter.Instance.GetModel(); } } AutoCutTreeModel autoCutTreeModel { get { return ModelCenter.Instance.GetModel(); } } PackModel packModel { get { return ModelCenter.Instance.GetModel(); } } int hasIdle2 = 0; //0:未检测 1:有 -1:没有 是否有待机动作2 int lastNPCID = 0; float lastClickTime = 0; //上次任意点击时间 用于引导 protected void Awake() { cutTreeBtn.AddListener(OnCutTreeBtnClick); cutAutoBtn.AddListener(OpenCutAutoWin); adventureBtn.AddListener(() => { WindowCenter.Instance.Open(); }); taskButton.AddListener(OnTaskClick); treeBtn.AddListener(() => { WindowCenter.Instance.Open(); }); homeBtn.AddListener(() => { cutTreeModel.selectFuncArrNum = 0; WindowCenter.Instance.Open(); }); challengeBtn.AddListener(() => { cutTreeModel.selectFuncArrNum = 1; WindowCenter.Instance.Open(); }); familyBtn.AddListener(() => { ModelCenter.Instance.GetModel().GotoFairyWin(); }); petBtn.AddListener(() => { WindowCenter.Instance.Open(false, 0); }); lqBtn.AddListener(() => { WindowCenter.Instance.Open("SpiritEquipWin"); }); fyBtn.AddListener(() => { WindowCenter.Instance.Open(); }); gubaoBtn.AddListener(() => { WindowCenter.Instance.Open("TreasurePavilionWin"); }); horseBtn.AddListener(() => { WindowCenter.Instance.Open(false, 0); }); realmUpgrade.AddListener(() => { WindowCenter.Instance.Open(); }); money1Btn.AddListener(() => { WindowCenter.Instance.Open(false, 1); }); } private void OnEnable() { lastClickTime = Time.realtimeSinceStartup; if (!autoCutTreeModel.isAutoCutTree) cutTreeModel.lastModelAnimateTime = Time.realtimeSinceStartup - 10; } public void Init() { lastClickTime = Time.realtimeSinceStartup; if (!autoCutTreeModel.isAutoCutTree) cutTreeModel.lastModelAnimateTime = Time.realtimeSinceStartup - 10; Display(); equipOnFloor.Init(); PlayerDatas.Instance.playerDataRefreshEvent += UpdatePlayerData;//数据的刷新(h0418) //GlobalTimeEvent.Instance.secondEvent += Instance_secondEvent; cutTreeModel.OnCutTreeResult += CutTreeModel_OnCutTreeResult; cutTreeModel.OnCutTreeTaskEvent += OnCutTreeTaskEvent; cutTreeModel.OnSelectMainType += OnSelectMainType; cutTreeModel.UpdateTreeLVEvent += UpdateTreeLVEvent; autoCutTreeModel.AutoCutTreeStartEvent += OnAutoCutTreeStart; autoCutTreeModel.AutoCutTreeStopEvent += OnAutoCutTreeStop; } public void UnInit() { equipOnFloor.UnInit(); PlayerDatas.Instance.playerDataRefreshEvent -= UpdatePlayerData;//数据的刷新(h0418) //GlobalTimeEvent.Instance.secondEvent -= Instance_secondEvent; cutTreeModel.OnCutTreeResult -= CutTreeModel_OnCutTreeResult; cutTreeModel.OnCutTreeTaskEvent -= OnCutTreeTaskEvent; cutTreeModel.OnSelectMainType -= OnSelectMainType; cutTreeModel.UpdateTreeLVEvent -= UpdateTreeLVEvent; autoCutTreeModel.AutoCutTreeStartEvent -= OnAutoCutTreeStart; autoCutTreeModel.AutoCutTreeStopEvent -= OnAutoCutTreeStop; } void OnAutoCutTreeStart() { AutoImg.SetSprite("AutoCutTree02"); AutoTween.Play(); AutoUIEffect.Play(); } void OnAutoCutTreeStop() { AutoImg.SetSprite("AutoCutTree01"); AutoTween.Stop(); AutoUIEffect.Stop(); } void UpdatePlayerData(PlayerDataType type)//数据的刷新 { if (type == PlayerDataType.default26 || type == PlayerDataType.Gold || type == PlayerDataType.default33) RefreshMoney(); else if (type == PlayerDataType.MAXATK || type == PlayerDataType.DEF || type == PlayerDataType.MaxHP || type == PlayerDataType.BattleValEx1) { DisplayBaseAttr(); } } void DisplayBaseAttr() { var showList = PlayerPropertyConfig.GetShowDict()[1]; for (int i = 0; i < baseAttrList.Count; i++) { if (i < showList.Count) { baseAttrList[i].text = PlayerPropertyConfig.GetFullDescriptionEx(showList[i], (long)UIHelper.GetPropertyValue((PropertyType)showList[i])); } else { baseAttrList[i].text = ""; } } } private void LateUpdate() { //!!! 还需要注意其他界面打开的情况下,不触发引导 //新手几秒内未任何点击触发引导 if (cutTreeModel.m_CutTreeTaskID > 1 && PlayerDatas.Instance.baseData.LV < cutTreeModel.autoGuideList[0] && Time.realtimeSinceStartup - lastClickTime > cutTreeModel.autoGuideList[0]) { if (NewBieCenter.Instance.inGuiding) { lastClickTime = Time.realtimeSinceStartup; return; } var config = TaskConfig.Get(cutTreeModel.m_CutTreeTaskID); //触发引导 if (cutTreeModel.taskClickGuide.ContainsKey(config.TaskType) && !NewBieCenter.Instance.inGuiding && !WindowCenter.Instance.ExistAnyFullScreenOrMaskWin() && !WindowCenter.Instance.IsOpen()) { NewBieCenter.Instance.ResetGuide(cutTreeModel.taskClickGuide[config.TaskType]); NewBieCenter.Instance.StartNewBieGuideEx(cutTreeModel.taskClickGuide[config.TaskType]); } lastClickTime = Time.realtimeSinceStartup; } if (PlayerDatas.Instance.baseData.LV < 10 && Input.GetMouseButtonDown(0)) { lastClickTime = Time.realtimeSinceStartup; } //未砍树情况下,人物进入待机2 if (hasIdle2 > 0 && cutTreeModel.IsRestTime()) { var npcModel = UI3DModelExhibition.InstanceTree.NpcModelPet; var animator = npcModel.GetComponentInChildren(); AnimatorStateInfo _stateInfo = animator.GetCurrentAnimatorStateInfo(0); if (_stateInfo.shortNameHash != GAStaticDefine.State_Dance) { animator.SetInteger(GAStaticDefine.Param_Action, GAStaticDefine.Act_Dance); UI3DModelExhibition.InstanceTree.ChangeModelEulerAngles(new Vector3(0, PlayerModelMarkConfig.Get(PlayerDatas.Instance.baseData.modelMark).angelIdle2, 0)); //animator.Play(GAStaticDefine.State_Dance); } } } void RefreshMoney() { cutMoneyCnt.text = UIHelper.GetMoneyCnt(41).ToString(); var money1Vaule = UIHelper.GetMoneyCnt(1); if (money1Vaule > 100000) { money1.text = UIHelper.ReplaceLargeNum(money1Vaule); } else { money1.text = money1Vaule.ToString(); } var money2Value = UIHelper.GetMoneyCnt(42); if (money2Value > 100000) { money2.text = UIHelper.ReplaceLargeNum(money2Value); } else { money2.text = money2Value.ToString(); } } public void Display() { playerModel.SetActive(true); var npcId = PlayerModelMarkConfig.Get(PlayerDatas.Instance.baseData.modelMark).npcid; if (lastNPCID != npcId) { lastNPCID = npcId; hasIdle2 = 0; } var config = NPCConfig.Get(npcId); if (cutTreeModel.isCreateNewUIModel) { UI3DModelExhibition.InstanceTree.ShowNPC(npcId, config.UIModeLOffset, new Vector3(0, 0, 0), playerModel); cutTreeModel.isCreateNewUIModel = false; } RefreshMoney(); playerNameText.text = PlayerDatas.Instance.baseData.PlayerName; if (!autoCutTreeModel.isAutoCutTree) { var npcModel = UI3DModelExhibition.InstanceTree.NpcModelPet; if (npcModel != null) { var animator = npcModel.GetComponentInChildren(); if (animator != null) { // 切换模型的判定 if (hasIdle2 == 0) { // 获取Animator Controller中的动画片段列表 AnimationClip[] clips = animator.runtimeAnimatorController.animationClips; // 遍历动画片段列表,找到目标动画片段 foreach (AnimationClip clip in clips) { if (clip.name == "Idle2") { hasIdle2 = 1; break; // 找到后退出循环 } } if (hasIdle2 != 1) hasIdle2 = -1; } if (hasIdle2 > 0) { var runtimeController = AnimatorControllerLoader.LoadMobController(AnimatorControllerLoader.controllerSuffix, config.MODE); animator.runtimeAnimatorController = runtimeController; animator.SetInteger(GAStaticDefine.Param_Action, GAStaticDefine.Act_Dance); UI3DModelExhibition.InstanceTree.ChangeModelEulerAngles(new Vector3(0, PlayerModelMarkConfig.Get(PlayerDatas.Instance.baseData.modelMark).angelIdle2, 0)); //animator.Play(GAStaticDefine.State_Dance); } } } } ShowTaskInfo(); UpdateTreeLVEvent(); DisplayBaseAttr(); } //背包中有物品点击弹对比框不发包,物品不足不发包; //如果是自动状态 ,点击停止自动 //发包 到 收包 表现动作期间 - 得到2x加速指令(激活月卡默认就是加速状态) 如果收包延迟最快0.5秒发一次包;如果砍的次数过多,速度自动加快不超过x秒 //表现升级期间 不可点击 不可自动(等待状态) void OnCutTreeBtnClick() { if (autoCutTreeModel.isAutoCutTree) { autoCutTreeModel.StopAutoCutTree(); return; } //砍树动作表现过程中,加速表现 if (cutTreeModel.isPlayCutTreeAnim && Time.realtimeSinceStartup - cutTreeModel.lastModelAnimateTime < 11) { playSpeed = 2.4f * (1 + Math.Max(maxCutCount - 2, 0) * 0.3f); return; } var items = packModel.GetItems(PackType.EquipOnFloor); if (items != null && items.Count != 0) { cutTreeModel.OpenEquipExchangeWin(items[0]); return; } if (UIHelper.GetMoneyCnt(41) < 1) { SysNotifyMgr.Instance.ShowTip("LackMoneyCommon", 41); return; } UI3DModelExhibition.InstanceTree.ChangeModelEulerAngles(new Vector3(0, PlayerModelMarkConfig.Get(PlayerDatas.Instance.baseData.modelMark).angel, 0)); cutTreeModel.SendCutTree(1); } void SetTreeStartState() { treeSpine.SetStartState(); } void OpenCutAutoWin() { if (FuncOpen.Instance.IsFuncOpen(229)) { WindowCenter.Instance.Open(); } else { FuncOpen.Instance.ProcessorFuncErrorTip(229); } } int cutCount = 0; //还要砍几次 计数用 int cutNowCount = 0; // 当前还要砍几次 因为延迟显示需要记录当前的cutCount显示用 int maxCutCount = 0; //本轮的最大砍树次数cutCount的最大值 float playSpeed = 1f; int cutTreeAtkEffectStartIndex; private void CutTreeModel_OnCutTreeResult() { //时间顺序:砍树动作-掉落-分解/替换 var quality = cutTreeModel.GetStartEquipQuality(); var betterQuality = cutTreeModel.GetBetterEquipQuality(quality); maxCutCount = cutCount = betterQuality - quality + 1; cutTreeAtkEffectStartIndex = Math.Min(quality, cutTreeModel.cutTreeAtkEffects.Length) - 1; playSpeed = 1.2f * cutTreeModel.cutTreeSpeed * (1 + Math.Max(maxCutCount - 2, 0) * 0.3f); PlayCutTreeAnimate(); } void PlayCutTreeAnimate() { //treeSpine.delay = 0.15f / playSpeed; treeSpine.duration = 1 / playSpeed; treeSpine.Play(SetTreeStartState); SoundPlayer.Instance.PlayUIAudio(853); cutNowCount = cutCount; Clock.AlarmAfter(0.25f / playSpeed, () => { cutEffect.StopImediatly(); cutEffect.effect = cutTreeModel.cutTreeAtkEffects[Math.Min(cutTreeAtkEffectStartIndex + maxCutCount - cutNowCount, cutTreeModel.cutTreeAtkEffects.Length - 1)]; cutEffect.Play(); //被击特效延迟显示;后续补另一个落叶特效 }); var npcId = PlayerModelMarkConfig.Get(PlayerDatas.Instance.baseData.modelMark).npcid; var npcConfig = NPCConfig.Get(npcId); var npcModel = UI3DModelExhibition.InstanceTree.NpcModelPet; if (npcModel != null) { var animator = npcModel.GetComponentInChildren(); if (animator != null) { animator.SetInteger(GAStaticDefine.Param_Action, GAStaticDefine.Act_Idle); var runtimeController = AnimatorControllerLoader.LoadMobController(AnimatorControllerLoader.controllerSuffix, npcConfig.MODE); animator.runtimeAnimatorController = runtimeController; animator.speed = playSpeed; animator.Play(GAStaticDefine.State_Attack1Hash); } } DebugEx.LogFormat("播放砍树动作 :{0}", cutCount); cutCount--; if (cutCount > 0) { Clock.AlarmAfter(cutTreeModel.cutTreeDuration / cutTreeModel.cutTreeSpeed, PlayCutTreeAnimate); } else { Clock.AlarmAfter(1/playSpeed/2, () => { cutTreeModel.AfterPlayCutTreeAnimEvent?.Invoke(); }); } } void ShowTaskInfo() { if (cutTreeModel.m_CutTreeTaskID == 0) return; var config = TaskConfig.Get(cutTreeModel.m_CutTreeTaskID); int itemID = config.AwardItemList[0][0]; int itemCnt = config.AwardItemList[0][1]; taskAwardImg.SetSprite(ItemConfig.Get(itemID).IconKey); taskAwardCnt.text = itemCnt.ToString(); if (config.TaskType == 4) { var fbConfig = AdventureConfig.Get(config.TaskConds[1]); taskName.text = string.Format(config.TaskDescribe, fbConfig.Name); } else { taskName.text = config.TaskDescribe; } taskValue.text = string.Format("({0}/{1})", cutTreeModel.m_CutTreeTaskValue, config.NeedValue); taskValue.color = UIHelper.GetUIColor(cutTreeModel.m_CutTreeTaskState == 2 ? TextColType.Green : TextColType.Red, true); if (cutTreeModel.m_CutTreeTaskState == 2) { taskFinishEffect.Play(); } else { taskFinishEffect.StopImediatly(); } } void OnCutTreeTaskEvent() { ShowTaskInfo(); } void OnSelectMainType() { Display(); } void OnTaskClick() { if (cutTreeModel.m_CutTreeTaskID == 0) return; var config = TaskConfig.Get(cutTreeModel.m_CutTreeTaskID); if (cutTreeModel.m_CutTreeTaskState != 2) { //触发引导 if (cutTreeModel.taskClickGuide.ContainsKey(config.TaskType) && !NewBieCenter.Instance.inGuiding) { NewBieCenter.Instance.ResetGuide(cutTreeModel.taskClickGuide[config.TaskType]); NewBieCenter.Instance.StartNewBieGuideEx(cutTreeModel.taskClickGuide[config.TaskType]); } } else { CA504_tagCMPlayerGetReward _pak = new CA504_tagCMPlayerGetReward(); _pak.RewardType = 66; _pak.DataEx = (uint)cutTreeModel.m_CutTreeTaskID; GameNetSystem.Instance.SendInfo(_pak); } } void UpdateTreeLVEvent() { treeLVTxt.text = (cutTreeModel.GetUIShowTreeLV()).ToString(); } } }