You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

207 lines
4.0 KiB
C#

1 month ago
/*
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);
}
}
}
}
}
}