/* 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 LevelDesignCell : MonoBehaviour { public Vector2Int pos; public Image selectionImage; public LevelCellData cellData; public Cell cell; public LevelDesignCell RightCell { get { Vector2Int v = pos + Vector2Int.right; if (!IsValidIndex(v)) { return null; } return GetCellFromVector(v); } } public LevelDesignCell LeftCell { get { Vector2Int v = pos + Vector2Int.left; if (!IsValidIndex(v)) { return null; } return GetCellFromVector(v); } } public LevelDesignCell TopCell { get { Vector2Int v = pos + Vector2Int.down; if (!IsValidIndex(v)) { return null; } return GetCellFromVector(v); } } public LevelDesignCell BottomCell { get { Vector2Int v = pos + Vector2Int.up; if (!IsValidIndex(v)) { return null; } return GetCellFromVector(v); } } private void Start() { if (LevelDesigner.instance != null) { GetComponent<PointerEvent>().onLeftClick.AddListener(delegate { LevelDesigner.instance.OnButtonClick(this); }); GetComponent<PointerEvent>().onRightClick.AddListener(delegate { LevelDesigner.instance.OnButtonClick(this); LevelDesigner.instance.cellTypePopup.Open(); }); } } [ContextMenu("Update")] public void UpdateCell() { if (cell != null) { UnityEngine.Object.Destroy(cell.gameObject); } cell = UnityEngine.Object.Instantiate(LevelDesigner.instance._cellPrefab[cellData.CellIndex], base.transform); cell.SetLevelData(cellData); cell.GetComponent<Image>().enabled = false; cell.GetComponent<Button>().enabled = false; cell.GetComponent<RectTransform>().sizeDelta = GetComponent<RectTransform>().sizeDelta; cell.GetComponent<RectTransform>().anchoredPosition = Vector2.zero; } public void RemoveAllPipeColor() { cell.RemoveAllPipeColor(); } private bool IsValidIndex(Vector2Int v) { if (v.x < 0 || v.y < 0 || v.x >= LevelDesigner.instance.column || v.y >= LevelDesigner.instance.row) { return false; } Cell cell = GetCellFromVector(v).cell; if (cell.pipeCellType == CellType.Blank) { return false; } return true; } private LevelDesignCell GetCellFromVector(Vector2Int v) { int index = v.y * LevelDesigner.instance.column + v.x; return LevelDesigner.instance.allCellList[index]; } public bool HasSide(Side side) { foreach (Pipe pipe in cell.pipes) { if (pipe.R && side == Side.R) { return true; } if (pipe.L && side == Side.L) { return true; } if (pipe.T && side == Side.T) { return true; } if (pipe.B && side == Side.B) { return true; } } return false; } public bool HasAnyColor() { foreach (Pipe pipe in cell.pipes) { if (pipe.fillColor.Count > 0) { return true; } } return false; } public void FillColor(List<PipeColor> c, LevelDesignCell source, Side sourceSide) { if (cell.pipeCellType != CellType.Start) { foreach (Pipe pipe in cell.pipes) { if ((pipe.L && sourceSide == Side.R) || (pipe.R && sourceSide == Side.L) || (pipe.T && sourceSide == Side.B) || (pipe.B && sourceSide == Side.T)) { if (pipe.AddColor(c) == 0) { break; } if (pipe.L && LeftCell != null && LeftCell != source) { LeftCell.FillColor(c, this, Side.L); } if (pipe.R && RightCell != null && RightCell != source) { RightCell.FillColor(c, this, Side.R); } if (pipe.T && TopCell != null && TopCell != source) { TopCell.FillColor(c, this, Side.T); } if (pipe.B && BottomCell != null && BottomCell != source) { BottomCell.FillColor(c, this, Side.B); } } } } } }