using System.Collections; using UnityEngine; using UI.LuckyBox; using System.Collections.Generic; using FairyGUI; using System.Threading; using System.Threading.Tasks; using System; namespace GFGGame { public class LuckyBoxStarView : BaseWindow { private UI_LuckyBoxStarUI _ui; private List comStars = new List(); private List _gameObjects = new List(); private List _wrappers = new List(); private List _gameObjects1 = new List(); private List _wrappers1 = new List(); private Dictionary> dicGameobj = new Dictionary>(); private Dictionary> dicWrappers = new Dictionary>(); private Dictionary> dicGameobj1 = new Dictionary>(); private Dictionary> dicWrappers1 = new Dictionary>(); private GObject curComStar;//当前选中的星星 private Vector2 lastPos;//鼠标的上一个位置,每颗星星初始时默认为Vector2.right; private List _rewardList; private const int checkDistance = 40;//鼠标靠近星星周围加减40都算选中星星 private const int imgLineWidth = 10;//线的原始长度 private bool isGuide = false; private bool isFirst = true; public override void Dispose() { // for (int i = 0; i < _gameObjects.Count; i++) // { // SceneController.DestroyObjectFromView(_gameObjects[i]); // SceneController.DestroyObjectFromView(_gameObjects1[i]); // } ICollection keys0 = dicGameobj.Keys; foreach (int key in keys0) { for (int i = 0; i < dicGameobj[key].Count; i++) { SceneController.DestroyObjectFromView(dicGameobj[key][i]); SceneController.DestroyObjectFromView(dicGameobj1[key][i]); } } base.Dispose(); } protected override void OnInit() { base.OnInit(); _ui = UI_LuckyBoxStarUI.Create(); this.viewCom = _ui.target; isfullScreen = true; _ui.m_btnBack.onClick.Add(OnClickBtnBack); } protected override void OnShown() { base.OnShown(); _ui.target.onTouchBegin.Add(OnClickUIBegin); _ui.target.onTouchMove.Add(OnClickUIMove); _ui.target.onTouchEnd.Add(OnClickUIEnd); _rewardList = LuckyBoxDataManager.Instance.RewardList; _ui.m_ctrlBuyType.selectedIndex = _rewardList != null && _rewardList.Count > 1 ? 1 : 0; _ui.m_ctrlRewardsType.selectedIndex = Array.IndexOf(LuckyBoxCfgArray.Instance.dataArray, LuckyBoxCfgArray.Instance.GetCfg((int)viewData)); ; isFirst = true; ResetStartView(); Timers.inst.AddUpdate(UpdateToCheckGuide); } private void ResetStartView() { isGuide = GuideController.TryGuideLuckyBoxStar() || GuideDataManager.GetGuideCountCopy(ConstGuideId.LUCKY_BOX) <= 0; curComStar = null; comStars.Clear(); int index = 0; GObject star = _ui.target.GetChild(string.Format("comStar{0}_{1}_{2}", _ui.m_ctrlBuyType.selectedIndex, _ui.m_ctrlRewardsType.selectedIndex, index)); while (star != null && star.visible == true) { UI_ComStar comStar = UI_ComStar.Proxy(star); comStar.m_c1.selectedIndex = 0; comStar.m_imgLine.width = imgLineWidth; comStar.m_imgLine.rotation = 0; if (isFirst && (!dicGameobj.ContainsKey(_ui.m_ctrlRewardsType.selectedIndex) || dicGameobj1[_ui.m_ctrlRewardsType.selectedIndex].Count <= index)) { GameObject gameObject = _gameObjects.Count > index ? _gameObjects[index] : null; GoWrapper wrapper = _wrappers.Count > index ? _wrappers[index] : null; string resPath = ResPathUtil.GetViewEffectPath("ui_ck", "ui_ck"); SceneController.AddObjectToView(gameObject, wrapper, comStar.m_holder, resPath, out gameObject, out wrapper); if (!dicGameobj.ContainsKey(_ui.m_ctrlRewardsType.selectedIndex)) dicGameobj.Add(_ui.m_ctrlRewardsType.selectedIndex, new List()); if (!dicWrappers.ContainsKey(_ui.m_ctrlRewardsType.selectedIndex)) dicWrappers.Add(_ui.m_ctrlRewardsType.selectedIndex, new List()); dicGameobj[_ui.m_ctrlRewardsType.selectedIndex].Add(gameObject); dicWrappers[_ui.m_ctrlRewardsType.selectedIndex].Add(wrapper); GameObject gameObject1 = _gameObjects1.Count > index ? _gameObjects1[index] : null; GoWrapper wrapper1 = _wrappers1.Count > index ? _wrappers1[index] : null; string resPath1 = ResPathUtil.GetViewEffectPath("ui_ck", "ui_ck_dj"); SceneController.AddObjectToView(gameObject1, wrapper1, comStar.m_holder1, resPath1, out gameObject1, out wrapper1); if (!dicGameobj1.ContainsKey(_ui.m_ctrlRewardsType.selectedIndex)) dicGameobj1.Add(_ui.m_ctrlRewardsType.selectedIndex, new List()); if (!dicWrappers1.ContainsKey(_ui.m_ctrlRewardsType.selectedIndex)) dicWrappers1.Add(_ui.m_ctrlRewardsType.selectedIndex, new List()); dicGameobj1[_ui.m_ctrlRewardsType.selectedIndex].Add(gameObject1); dicWrappers1[_ui.m_ctrlRewardsType.selectedIndex].Add(wrapper1); } star.data = new Vector2(comStar.target.x, comStar.target.y); comStars.Add(star); index++; star = _ui.target.GetChild(string.Format("comStar{0}_{1}_{2}", _ui.m_ctrlBuyType.selectedIndex, _ui.m_ctrlRewardsType.selectedIndex, index)); } } private void OnClickUIBegin(EventContext context) { context.CaptureTouch(); InputEvent inputEvent = (InputEvent)context.data; Vector2 mousePos = this.viewCom.GlobalToLocal(new Vector2(inputEvent.x, inputEvent.y)); CheckNearbyPos(mousePos); } private void OnClickUIMove(EventContext context) { InputEvent inputEvent = (InputEvent)context.data; Vector2 mousePos = this.viewCom.GlobalToLocal(new Vector2(inputEvent.x, inputEvent.y)); CheckNearbyPos(mousePos); if (comStars.Count == 0)//所有星星都点亮了主动结束 { this.OnClickUIEnd(); } } //检测鼠标附近的星星 private void CheckNearbyPos(Vector2 mousePos) { for (int i = comStars.Count - 1; i >= 0; i--) { Vector2 comStarPos = (Vector2)comStars[i].data; if (IsSamePos(mousePos, comStarPos)) { if (curComStar != null) { SetCurComStarTransfrom(comStarPos); } UI_ComStar comStar = UI_ComStar.Proxy(comStars[i]); comStar.m_c1.selectedIndex = 1; curComStar = comStars[i]; lastPos = Vector2.right; comStars.RemoveAt(i); } else { if (curComStar != null) { Vector2 curPos = mousePos - (Vector2)curComStar.data; SetCurComStarTransfrom(mousePos); lastPos = curPos; } } } } private void SetCurComStarTransfrom(Vector2 targetPos) { Vector2 curPos = targetPos - (Vector2)curComStar.data; float angle = Vector3.Angle(lastPos, curPos); //求出两向量之间的夹角 Vector3 normal = Vector3.Cross(lastPos, curPos);//叉乘求出法线向量 angle *= Mathf.Sign(Vector3.Dot(normal, Vector3.forward)); //Mathf.Sign()求符号,Vector3.Dot()求方向,求法线向量与物体上方向向量点乘,结果为1或-1,修正旋转方向 UI_ComStar comStar = UI_ComStar.Proxy(curComStar); comStar.m_imgLine.rotation += angle; comStar.m_imgLine.width = Vector2.Distance(targetPos, (Vector2)curComStar.data); } private void OnClickUIEnd() { if (isGuide && comStars.Count > 0) { isFirst = false; ResetStartView(); } else { TryCompleteGuide(); Timers.inst.Add(0.3f, 1, ClickUIEnd); GuideController.HideGuide(); GuideController.TryCompleteGuide(ConstGuideId.MAIN_UI_BTN_ZHAI_XING); } } private void ClickUIEnd(object param) { if (curComStar != null) { RemoveListener(); ViewManager.Show(ViewName.LUCKY_BOX_CARD_VIEW, new object[] { _rewardList, FirstGetCardViewType.JUMP }); this.Hide(); } } private bool IsSamePos(Vector2 mousePos, Vector2 comStarPos) { return (mousePos.x < comStarPos.x + checkDistance) && (mousePos.x > comStarPos.x - checkDistance) && (mousePos.y < comStarPos.y + checkDistance) && (mousePos.y > comStarPos.y - checkDistance); } private void RemoveListener() { _ui.target.onTouchBegin.Remove(OnClickUIBegin); _ui.target.onTouchMove.Remove(OnClickUIMove); _ui.target.onTouchEnd.Remove(OnClickUIEnd); } private void OnClickBtnBack() { this.Hide(); RemoveListener(); ViewManager.Show(ViewName.LUCKY_BOX_VIEW); } protected override void OnHide() { base.OnHide(); // _gameObjects.Clear(); // _wrappers.Clear(); // _gameObjects1.Clear(); // _wrappers1.Clear(); // for (int i = 0; i < _gameObjects.Count; i++) // { // SceneController.DestroyObjectFromView(_gameObjects[i]); // SceneController.DestroyObjectFromView(_gameObjects1[i]); // } Timers.inst.Remove(UpdateToCheckGuide); } private void UpdateToCheckGuide(object param) { if (!ViewManager.CheckIsTopView(this.viewCom)) return; GuideController.TryGuide(null, ConstGuideId.LUCKY_BOX, 4, "点击将星星链接在一起", false, 0, true, false, (int)(this.viewCom.height - 150)); TryCompleteGuide(); } private void TryCompleteGuide() { if (comStars.Count == 0) { GuideCfg cfg = GuideCfgArray.Instance.GetCfg(ConstGuideId.LUCKY_BOX); GuideController.TryCompleteGuideIndex(cfg.id, 4); GuideController.TryCompleteGuide(ConstGuideId.LUCKY_BOX, 4); } else { GuideDataManager.currentGuideIdIndex = 3; } } } }