using UnityEngine; using UnityEngine.UI; using System.Collections; using System.Collections.Generic; using GCGame.Table; using Games.LogicObj; using Games.Mission; using Games.GlobeDefine; using Module.Log; using Games.Item; // 每日/每周跑环 public class MissionCircleAward : MonoBehaviour { public CircleMissionManager.CircleType cricleType; private static MissionCircleAward _instance_day; private static MissionCircleAward _instance_week; public static MissionCircleAward MissionCircleAward_Day { get { if(_instance_day != null) { return _instance_day; } return null; } } public static MissionCircleAward MissionCircleAward_Week { get { if (_instance_week != null) { return _instance_week; } return null; } } public CircleAnim _OutCircle; public CommonItemContainerItem[] _AwardItems; public CircleAnim _InnerCircle; public Text[] _AwardRate; public Text _AutoTips; public Text _LastTimes; public Button _BtnSelect; public Button _BtnGet; public Toggle _SkipAnim; public float _OutAwardPosRange; public float _InAwardPosRange; public float _InitIdxOut; public float _InitIdxIn; public float _TargetIdxOut; public float _TargetIdxIn; void Start() { //InitAward(); } private void OnEnable() { if (_instance_day == null && cricleType == CircleMissionManager.CircleType.daily) { _instance_day = this; } if (_instance_week == null && cricleType == CircleMissionManager.CircleType.weekly) { _instance_week = this; } Refresh(); InitBtn(); _AutoTips.text = ""; _SkipAnim.isOn = GameManager.gameManager.CircleMissionManager.SkilAnimByType(cricleType); StartCoroutine(InitAward()); } private void OnDisable() { if (cricleType == CircleMissionManager.CircleType.daily) { _instance_day = null; } if (cricleType == CircleMissionManager.CircleType.weekly) { _instance_week = null; } WaittingAward = false; GameManager.gameManager.CircleMissionManager.GetAward(cricleType); } void Update() { //AutoUpdate(); for (int i = 0; i < _AwardItems.Length; ++i) { _AwardItems[i]._ItemSlot.rotation = Quaternion.Euler(Vector3.zero); } } public void Close() { if (cricleType == CircleMissionManager.CircleType.daily) { UIManager.CloseUI(UIInfo.MissionCircleAward_Day); } if (cricleType == CircleMissionManager.CircleType.weekly) { UIManager.CloseUI(UIInfo.MissionCircleAward_Week); } } #region Rot private float _DeltaAngleIn = 0; private float _DeltaAngleOut = 0; private IEnumerator InitAward() { var mainRole = Singleton.GetInstance().MainPlayer; while (mainRole == null || mainRole.BaseAttr.Level <= 0) { yield return null; } int roleLevel = mainRole.BaseAttr.Level; float startAngle = 0; _DeltaAngleOut = 360.0f / _AwardItems.Length; Tab_CircleTaskGameRewards awardRecord = null; var ciclrRewardTabs = TableManager.GetCircleTaskGameRewards().Values; // 读表,获得适合玩家当前等级的一组奖励和倍数 // 每日是 1 每周是 2 int ctID = cricleType == CircleMissionManager.CircleType.daily ? 1 : 2; foreach (var circleRewardTab in ciclrRewardTabs) { if (circleRewardTab.LevelMin <= roleLevel && circleRewardTab.LevelMax >= roleLevel && circleRewardTab.CircleType == ctID) { awardRecord = circleRewardTab; break; } } // 外圈奖品内容初始化 for (int i = 0; i < _AwardItems.Length; ++i) { var missionParam = new CommonItemContainerItem.ItemInfo(); missionParam.itemNum = awardRecord.GetRewardNumbyIndex(i); missionParam.itemID = awardRecord.GetRewardSubTypebyIndex(i); _AwardItems[i].InitItem(missionParam); Vector2 gemPos = Vector2.zero; gemPos.x = Mathf.Sin((_DeltaAngleOut * i + startAngle) * Mathf.Deg2Rad) * _OutAwardPosRange; gemPos.y = Mathf.Cos((_DeltaAngleOut * i + startAngle) * Mathf.Deg2Rad) * _OutAwardPosRange; _AwardItems[i].GetComponent().anchoredPosition = gemPos; _AwardItems[i].GetComponent().localRotation = Quaternion.Euler(new Vector3(0, 0, -_DeltaAngleOut * i - startAngle)); _AwardItems[i]._ItemSlot.rotation = Quaternion.Euler(Vector3.zero); } // 内圈倍率初始化, float startAngleInner = 0; _DeltaAngleIn = 360.0f / _AwardRate.Length; // 每日是 1 每周是 2 int ctmID = cricleType == CircleMissionManager.CircleType.daily ? 1 : 2; var awardMulti = TableManager.GetCircleTaskGameRewardMultiByID(ctmID, 0); for (int i = 0; i < _AwardRate.Length; ++i) { _AwardRate[i].text = StrDictionary.GetClientDictionaryString("#{46264}", awardMulti.GetMultiNumbyIndex(i).ToString()); Vector2 gemPos = Vector2.zero; gemPos.x = Mathf.Sin((_DeltaAngleIn * i + startAngleInner) * Mathf.Deg2Rad) * _InAwardPosRange; gemPos.y = Mathf.Cos((_DeltaAngleIn * i + startAngleInner) * Mathf.Deg2Rad) * _InAwardPosRange; _AwardRate[i].GetComponent().anchoredPosition = gemPos; _AwardRate[i].GetComponent().localRotation = Quaternion.Euler(new Vector3(0, 0, -_DeltaAngleIn * i - startAngleInner)); } InitCircleAngle(); } public void InitCircleAngle() { var initAngelOut = _DeltaAngleOut * GameManager.gameManager.CircleMissionManager.RewardIndexByType(cricleType); _OutCircle.transform.localRotation = Quaternion.Euler(new Vector3(0, 0, initAngelOut)); var initAngelIn = _DeltaAngleIn * GameManager.gameManager.CircleMissionManager.MultiNumIndexByType(cricleType); _InnerCircle.transform.localRotation = Quaternion.Euler(new Vector3(0, 0, initAngelIn)); } public void Refresh() { _AutoStartTime = Time.time; _OutCircle.ResetAll(); _InnerCircle.ResetAll(); InitBtn(); InitCircleAngle(); _LastTimes.text = StrDictionary.GetClientDictionaryString("#{46265}", GameManager.gameManager.CircleMissionManager.LastAwardCntByType(cricleType)); } #endregion #region auto private float _AutoStartTime; private float _AutoSelectTime = 10; private float _AutoGetTime = 5; private bool _AutoAwarding = false; private void AutoUpdate() { //if (!_AutoAwarding) // return; if (_BtnSelect.gameObject.activeSelf) { if (!_BtnSelect.interactable) { _AutoTips.text = StrDictionary.GetClientDictionaryString("#{46261}"); } else { if (Time.time - _AutoStartTime > _AutoSelectTime) { OnBtnSelect(); //_BtnSelect.interactable = false; _AutoStartTime = Time.time; } else { int autoDelay = (int)(_AutoSelectTime - (Time.time - _AutoStartTime)); _AutoTips.text = StrDictionary.GetClientDictionaryString("#{46260}", autoDelay); } } } else if(_BtnGet.gameObject.activeSelf) { if (_BtnGet.interactable) { if (Time.time - _AutoStartTime > _AutoGetTime) { OnBtnGet(); //_BtnSelect.interactable = false; } else { int autoDelay = (int)(_AutoGetTime - (Time.time - _AutoStartTime)); _AutoTips.text = StrDictionary.GetClientDictionaryString("#{46262}", autoDelay); } } else { _AutoTips.text = StrDictionary.GetClientDictionaryString("#{46261}"); } } } #endregion #region interface private int _ActingCircleCnt = 0; private bool _WaittingAward = false; public bool WaittingAward { get { return _WaittingAward; } set { _WaittingAward = value; } } public void InitBtn() { HideBtnEffect(); HideItemEffect(); if (GameManager.gameManager.CircleMissionManager.CurStateByType(cricleType) == 2) { _BtnSelect.gameObject.SetActive(false); _BtnSelect.interactable = true; _BtnGet.gameObject.SetActive(true); _BtnGet.interactable = true; PlayBtnEffect(); PlayItemEffect(); } else if (GameManager.gameManager.CircleMissionManager.LastAwardCntByType(cricleType) > 0) { _BtnSelect.gameObject.SetActive(true); _BtnSelect.interactable = true; _BtnGet.gameObject.SetActive(false); _AutoAwarding = true; } else { _BtnSelect.gameObject.SetActive(true); _BtnSelect.interactable = false; _BtnGet.gameObject.SetActive(false); _AutoTips.text = ""; } } public void OnBtnSelect() { GameManager.gameManager.CircleMissionManager.SelectAward(cricleType); WaittingAward = true; } public void SelectAward() { WaittingAward = false; // 将服务器确定好的索引转成角度,设置到内外圈动画的目标角度中 float deltaAngle = 360.0f / _AwardItems.Length; _OutCircle._TargetAngle = deltaAngle * _TargetIdxOut; float deltaAngleInner = 360.0f / _AwardRate.Length; _InnerCircle._TargetAngle = deltaAngleInner * _TargetIdxIn; // 更新按钮状态 _BtnSelect.gameObject.SetActive(false); _BtnGet.gameObject.SetActive(true); _BtnGet.interactable = false; // 若跳过动画勾选 if (_SkipAnim.isOn) { _ActingCircleCnt = 1; // 直接设定内外圈角度,并停止动画。 _OutCircle._RotCircle.localRotation = Quaternion.Euler(new Vector3(0, 0, _OutCircle._TargetAngle)); _InnerCircle._RotCircle.localRotation = Quaternion.Euler(new Vector3(0, 0, _InnerCircle._TargetAngle)); StopAnimCircleBack(); } else { _ActingCircleCnt = 2; _OutCircle.StartRot(); _InnerCircle.StartRot(); } } public void OnBtnGet() { GameManager.gameManager.CircleMissionManager.GetAward(cricleType); if (GameManager.gameManager.CircleMissionManager.LastAwardCntByType(cricleType) > 1) { //Refresh(); } //else //{ // Close(); //} } /// /// 跳过动画设置,并保存设置 /// public void OnSkilAnim() { GameManager.gameManager.CircleMissionManager.SetSkilAnimByType(cricleType, _SkipAnim.isOn); } /// /// 停止动画,并播放奖励特效,“获取” 按钮可用 /// public void StopAnimCircleBack() { --_ActingCircleCnt; if (_ActingCircleCnt == 0) { _AutoStartTime = Time.time; _BtnGet.interactable = true; PlayBtnEffect(); } PlayItemEffect(); } #endregion #region effect public GameObject _BtnEffect; public GameObject _ItemEffect; public void PlayBtnEffect() { _BtnEffect.transform.position = _BtnGet.transform.position; _BtnEffect.SetActive(true); } public void HideBtnEffect() { _BtnEffect.SetActive(false); } public void PlayItemEffect() { // 为防止位置不正确,将再赋值特效位置 _ItemEffect.transform.position = _AwardItems[(int)_TargetIdxOut]._ItemSlot.transform.position; _ItemEffect.SetActive(true); } public void HideItemEffect() { _ItemEffect.SetActive(false); } #endregion }