using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using DG.Tweening; using UnityEngine.SceneManagement; using static InterfaceManager; using static LoginSceneUIManager; using System.IO; using Newtonsoft.Json; using TMPro; using System.Linq; /// /// 自由编程面板 /// public class FreeProgrammingPanel : PanelBasic { /// /// 进入场景按钮 /// public Button enter_scene_button; /// /// 当前场景名称 /// public TextMeshProUGUI scene_name_text; /// /// 实例化节点 /// public Transform instantiate_root; /// /// 预制体 /// public FreeSceneItem free_scene_item_prefab; /// /// 实例化的所有场景对象 /// public List free_scene_items = new List(); /// /// 当前组件的场景对象 /// public List current_component_scene_items = new List(); /// /// 场景名称 /// public ClockScrolling scene_name_clock_scrolling; /// /// 计时器 /// private float timer; /// /// 虚化效果 /// private bool weakening_state; Button left_button; Button right_button; protected override void Awake() { base.Awake(); } // Start is called before the first frame update void Start() { Init(); } private void Update() { timer += Time.deltaTime; if (timer >= 3f) { if (!weakening_state) { weakening_state = true; if (Current != Next && Current != Last) { current_component_scene_items[Last].SetWeakening(); current_component_scene_items[Next].SetWeakening(); } } } } int Current = 0; int Last => Current == 0 ? current_component_scene_items.Count - 1 : Current - 1; int Next => Current == current_component_scene_items.Count - 1 ? 0 : Current + 1; void Init() { free_scene_item_prefab ??= Resources.Load("Prefabs/UIItem/FreeSceneItem"); //读取场景配置文件 StartCoroutine(Get(Path.Combine(Application.streamingAssetsPath, "LocalConfig/FreeScene.txt"),false, OnFreeDataUpdated)); right_button.onClick.AddListener(Right); left_button.onClick.AddListener(Left); enter_scene_button.onClick.AddListener(() => { if (SceneManager.GetSceneByName(current_preselect_scene) != null) { GameManager.current_main_menu_type = MainMenuType.自由编程; loading_panel.OnActive(this); } }); } void OnFreeDataUpdated(string _data) { var _free_scene_item_datas = JsonConvert.DeserializeObject(_data); for (int i = 0; i < _free_scene_item_datas.Length; i++) { var _free_scene_item = Instantiate(free_scene_item_prefab, instantiate_root); _free_scene_item.Init(_free_scene_item_datas[i]); _free_scene_item.name = i.ToString(); free_scene_items.Add(_free_scene_item); if (_free_scene_item.free_scene_item_data.scene_type == GameManager.current_component_type.ToString()) { current_component_scene_items.Add(_free_scene_item); } else _free_scene_item.SetActiveManual(false); } GameManager.scene_detail_datas = _free_scene_item_datas.ToList(); UpdateOrder(); } /// /// 更新顺序及文字 /// void UpdateOrder() { for (int i = 0; i < current_component_scene_items.Count; i++) { var _item = current_component_scene_items[i]; //第Length-1,第0个,第1个 if (i == Current) { //当前的放在最后一个位置 _item.SetAnchoredPositionMiddle(true); } else if (i == Next) { //下一个放在倒数第二个位置,右边 _item.SetAnchoredPositionRight(); } else if (i == Last) { //上一个放在倒数第三个位置,左边 _item.SetAnchoredPositionLeft(); } else { //其余的默认隐藏,中间,以方便切换 _item.SetAnchoredPositionMiddle(false); } } UpdateText(); } /// /// 左切换 /// void Left() { if (current_component_scene_items.Count <= 1) return; if (weakening_state) { /* * 终结掉 * current_component_scene_items[Last].SetWeakening(); * current_component_scene_items[Next].SetWeakening(); */ DOTween.KillAll(); } //反向移动 Current = Last; //scene_name_text.text = free_scene_items[Current].free_scene_item_data.scene_name; current_component_scene_items[Last].SetAnchoredPositionLeft(); current_component_scene_items[Current].SetAnchoredPositionMiddle(true); current_component_scene_items[Next].SetAnchoredPositionRight(); //居中其他,并隐藏 for (int i = 0; i < current_component_scene_items.Count; i++) { if (i != Current && i != Last && i != Next) { current_component_scene_items[i].SetAnchoredPositionMiddle(false); } } scene_name_clock_scrolling.ScrollingUp(); UpdateText(); timer = 0; weakening_state = false; } /// /// 右切换 /// void Right() { if (current_component_scene_items.Count <= 1) return; if (weakening_state) { /* * 终结掉 * current_component_scene_items[Last].SetWeakening(); * current_component_scene_items[Next].SetWeakening(); */ DOTween.KillAll(); } //正向移动 Current = Next; current_component_scene_items[Last].SetAnchoredPositionLeft(); current_component_scene_items[Current].SetAnchoredPositionMiddle(true); current_component_scene_items[Next].SetAnchoredPositionRight(); //居中其他,并隐藏 for (int i = 0; i < current_component_scene_items.Count; i++) { if (i != Current && i != Last && i != Next) { current_component_scene_items[i].SetAnchoredPositionMiddle(false); } } scene_name_clock_scrolling.ScrollingDown(); UpdateText(); timer = 0; weakening_state = false; } /// /// 更新场景名称显示 /// private void UpdateText() { current_preselect_scene = scene_name_clock_scrolling.SetCurrentText(current_component_scene_items[Current].free_scene_item_data.scene_name); scene_name_clock_scrolling.SetNextText(current_component_scene_items[Next].free_scene_item_data.scene_name); scene_name_clock_scrolling.SetLastText(current_component_scene_items[Last].free_scene_item_data.scene_name); } protected override void OnEnable() { base.OnEnable(); //显示时,根据选择的组件显示对应的场景列表 Current = 0; if (free_scene_items.Count > 0) { for (int i = 0; i < free_scene_items.Count; i++) { if (free_scene_items[i].free_scene_item_data.scene_type == GameManager.current_component_type.ToString()) { free_scene_items[i].gameObject.SetActive(true); current_component_scene_items.Add(free_scene_items[i]); } } } if (current_component_scene_items.Count > 0) { UpdateOrder(); } } protected override void OnDisable() { base.OnDisable(); current_component_scene_items.ForEach(item => item.gameObject.SetActive(false)); current_component_scene_items.Clear(); } }