/* http://www.cgsoso.com/forum-211-1.html CG搜搜 Unity3d 每日Unity3d插件免费更新 更有VIP资源! CGSOSO 主打游戏开发,影视设计等CG资源素材。 插件如若商用,请务必官网购买! daily assets update for try. U should buy the asset from home store if u use it in your project! */ using MS; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class LevelDesigner : MonoBehaviour { public List _cellPrefab; public LevelDesignCell _levelDesigncellPrefab; public Button newBtn; public Button openBtn; public Button saveBtn; public int row; public int column; public InputField rowInput; public InputField columnInput; public Text levelSizeLbl; public Popup cellTypePopup; public Text pipeColorLbl; public GameObject chooseColorBegin; public GameObject chooseColorEnd; [Header("Layout Setting")] public RectTransform _levelContainer; public float _space = 1f; public bool enableSaveWithoutCheck; [HideInInspector] public List allCellList; private RectTransform rootCanvas; private float _levelContainerMaxHeight; public static LevelDesigner instance; private LevelDesignCell _selectedCell; public LevelDesignCell SelectedCell { get { return _selectedCell; } set { if (_selectedCell != null) { _selectedCell.selectionImage.gameObject.SetActive(value: false); } _selectedCell = value; if (_selectedCell != null) { chooseColorBegin.gameObject.SetActive(SelectedCell != null && SelectedCell.cell.pipeCellType == CellType.Start); chooseColorEnd.gameObject.SetActive(SelectedCell != null && SelectedCell.cell.pipeCellType == CellType.End); _selectedCell.selectionImage.gameObject.SetActive(value: true); } else { chooseColorBegin.gameObject.SetActive(value: false); chooseColorEnd.gameObject.SetActive(value: false); UpdatePipes(); } } } private void Start() { instance = this; rowInput.onValueChanged.AddListener(delegate(string arg) { if (arg.StartsWith("-")) { rowInput.text = string.Empty; } else { int.TryParse(arg, out row); } }); columnInput.onValueChanged.AddListener(delegate(string arg) { if (arg.StartsWith("-")) { columnInput.text = string.Empty; } else { int.TryParse(arg, out column); } }); ResetLevelDesigner(); rootCanvas = base.transform.parent.GetComponent(); _levelContainerMaxHeight = _levelContainer.rect.height; } private void Update() { if (SelectedCell != null) { if (UnityEngine.Input.GetKeyUp(KeyCode.Alpha1) || UnityEngine.Input.GetKeyUp(KeyCode.Keypad1)) { OnCellSilider(2f); OnCRotSilider(1f); } else if (UnityEngine.Input.GetKeyUp(KeyCode.Alpha2) || UnityEngine.Input.GetKeyUp(KeyCode.Keypad2)) { OnCellSilider(2f); OnCRotSilider(0f); } else if (UnityEngine.Input.GetKeyUp(KeyCode.Alpha3) || UnityEngine.Input.GetKeyUp(KeyCode.Keypad3)) { OnCellSilider(6f); } else if (UnityEngine.Input.GetKeyUp(KeyCode.X)) { OnCellSilider(0f); } else if (UnityEngine.Input.GetKeyUp(KeyCode.RightArrow)) { OnCRotSilider((SelectedCell.cellData.RightRotationValue + 1) % 4); } else if (UnityEngine.Input.GetKeyUp(KeyCode.LeftArrow)) { OnCRotSilider((SelectedCell.cellData.RightRotationValue - 1 >= 0) ? (SelectedCell.cellData.RightRotationValue - 1) : 3); } } saveBtn.interactable = (saveBtn.interactable || enableSaveWithoutCheck); } public void OnNewBtn() { if (rowInput.gameObject.activeSelf) { if (string.IsNullOrEmpty(rowInput.text) || string.IsNullOrEmpty(columnInput.text)) { Toast.instance.ShowMessage("You can't leave row or column empty"); return; } if (row == 0 || column == 0) { Toast.instance.ShowMessage("Row and column must be larger than 0"); return; } SetupLevel(row, column); newBtn.GetComponentInChildren().text = "New"; openBtn.gameObject.SetActive(value: true); saveBtn.gameObject.SetActive(value: true); rowInput.gameObject.SetActive(value: false); columnInput.gameObject.SetActive(value: false); } else { newBtn.GetComponentInChildren().text = "Ok"; openBtn.gameObject.SetActive(value: false); saveBtn.gameObject.SetActive(value: false); rowInput.gameObject.SetActive(value: true); columnInput.gameObject.SetActive(value: true); ResetLevelDesigner(); } } public void OnOpenBtn() { } public void OnSaveBtn() { } public void ResetLevelDesigner() { SelectedCell = null; saveBtn.interactable = false; allCellList = new List(); for (int num = _levelContainer.childCount - 1; num >= 0; num--) { UnityEngine.Object.DestroyImmediate(_levelContainer.GetChild(num).gameObject); } } public void SetupLevel(int row, int column) { ResetLevelDesigner(); _levelContainer.sizeDelta = new Vector2(rootCanvas.rect.width, _levelContainerMaxHeight); float a = Mathf.Min(_levelContainer.rect.width / (float)column, _levelContainer.rect.height / (float)row); a = Mathf.Min(a, 140f); _levelContainer.sizeDelta = new Vector2((float)column * a, (float)row * a); for (int i = 0; i < row; i++) { for (int j = 0; j < column; j++) { LevelDesignCell levelDesignCell = UnityEngine.Object.Instantiate(_levelDesigncellPrefab, _levelContainer); levelDesignCell.GetComponent().sizeDelta = Vector2.one * a; levelDesignCell.GetComponent().anchoredPosition = new Vector2((float)j * a + (float)j * _space, (float)(-i) * a - (float)i * _space); levelDesignCell.cellData = new LevelCellData(0, 0, 0, PipeColor.None, redundant: false); levelDesignCell.pos = new Vector2Int(j, i); allCellList.Add(levelDesignCell); levelDesignCell.UpdateCell(); } } SelectedCell = null; } public void OnCellSilider(float t) { int cellIndex = (int)t; if (SelectedCell != null) { SelectedCell.cellData.CellIndex = cellIndex; SelectedCell.cellData.DefaultColor = PipeColor.None; SelectedCell.UpdateCell(); } chooseColorBegin.gameObject.SetActive(SelectedCell != null && SelectedCell.cell.pipeCellType == CellType.Start); chooseColorEnd.gameObject.SetActive(SelectedCell != null && SelectedCell.cell.pipeCellType == CellType.End); UpdatePipes(); } public void OnCRotSilider(float t) { int num = (int)t; if (SelectedCell != null) { SelectedCell.cellData.RightRotationValue = num; SelectedCell.cell.RotationValue = num; SelectedCell.cell.ApplyRotationOnImage(); UpdatePipes(); } } public void OnColorChosen(int v) { Text text = pipeColorLbl; PipeColor pipeColor = (PipeColor)v; text.text = "Color : " + pipeColor.ToString(); SelectedCell.cellData.DefaultColor = (PipeColor)v; SelectedCell.cell.defaultColor = (PipeColor)v; UpdatePipes(); } public void OnButtonClick(LevelDesignCell c) { SelectedCell = c; } private void UpdatePipes() { allCellList.ForEach(delegate(LevelDesignCell obj) { obj.RemoveAllPipeColor(); }); allCellList.ForEach(delegate(LevelDesignCell designCell) { Cell cell = designCell.cell; if (cell.pipeCellType == CellType.Start) { LevelDesignCell levelDesignCell = cell.pipes[0].T ? designCell.TopCell : (cell.pipes[0].B ? designCell.BottomCell : ((!cell.pipes[0].L) ? designCell.RightCell : designCell.LeftCell)); Side sourceSide = cell.pipes[0].T ? Side.T : (cell.pipes[0].R ? Side.R : (cell.pipes[0].B ? Side.B : Side.L)); if (levelDesignCell != null) { levelDesignCell.FillColor(new List { cell.defaultColor }, designCell, sourceSide); } } }); allCellList.ForEach(delegate(LevelDesignCell obj) { obj.cell.UpdatePipeColor(); }); saveBtn.interactable = IsGameOver(); } public bool IsGameOver() { List list = allCellList.FindAll((LevelDesignCell obj) => obj.cell.pipeCellType == CellType.End); List list2 = allCellList.FindAll((LevelDesignCell obj) => obj.cell.pipeCellType == CellType.Start); List list3 = list.FindAll((LevelDesignCell x) => x.cell.defaultColor == PipeColor.None); List list4 = list2.FindAll((LevelDesignCell x) => x.cell.defaultColor == PipeColor.None); if (list.Count == 0 || list2.Count == 0 || list3.Count != 0 || list4.Count != 0) { return false; } foreach (LevelDesignCell item in list) { if (item.cell.defaultColor != ColorManager.MixPipeColor(item.cell.pipes[0].fillColor)) { return false; } } foreach (LevelDesignCell allCell in allCellList) { Cell cell = allCell.cell; foreach (Pipe pipe in cell.pipes) { if (((cell.pipeCellType != CellType.Start && cell.pipeCellType != CellType.End) ? ColorManager.MixPipeColor(pipe.fillColor) : cell.defaultColor) != 0) { if ((pipe.L && allCell.LeftCell == null) || (pipe.R && allCell.RightCell == null) || (pipe.T && allCell.TopCell == null) || (pipe.B && allCell.BottomCell == null)) { return false; } if ((pipe.L && !allCell.LeftCell.HasSide(Side.R)) || (pipe.R && !allCell.RightCell.HasSide(Side.L)) || (pipe.T && !allCell.TopCell.HasSide(Side.B)) || (pipe.B && !allCell.BottomCell.HasSide(Side.T))) { return false; } } } } return true; } }