Files
Sokoban/Assets/Scripts/Level/LayoutCell.cs
2023-06-16 09:26:12 +03:00

143 lines
4.3 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Objects;
namespace Level
{
public class LayoutCell
{
[System.Serializable]
public struct LayoutCellData
{
public enum CellContent
{
None,
Block,
Player,
Crate
}
public CellContent cellContent;
public bool isTarget;
public Vector3Int cellPos;
}
// Public
public LayoutCellData cellData;
public Vector3 worldPos;
public Crate crate;
public Vector2Int layoutPosition;
// Private
private SpriteRenderer bgSpriteRenderer;
private SpriteRenderer envSpriteRenderer;
// Properties
public bool IsFree
{
get
{
return cellData.cellContent == LayoutCellData.CellContent.None;
}
}
private Grid grid => LevelBuilder.Instance.grid;
private Sprite blockSprite => LevelBuilder.Instance.blockSprite;
private Sprite environmentSprite => LevelBuilder.Instance.environmentSprite;
private Sprite groundSprite => LevelBuilder.Instance.groundSprite;
private GameObject spritePrefab => LevelBuilder.Instance.spritePrefab;
private GameObject cratePrefab => LevelBuilder.Instance.cratePrefab;
public LayoutCell(Vector3Int cellPos, Vector2Int layoutPos)
{
layoutPosition = layoutPos;
// Init data
cellData = new LayoutCellData
{
cellContent = LayoutCellData.CellContent.None,
isTarget = false,
cellPos = cellPos
};
worldPos = grid.GetCellCenterWorld(cellPos);
// Init sprite objects
GameObject bgObject = GameObject.Instantiate(spritePrefab, worldPos, Quaternion.identity);
bgSpriteRenderer = bgObject.GetComponent<SpriteRenderer>();
bgSpriteRenderer.sprite = groundSprite;
GameObject envObject = GameObject.Instantiate(spritePrefab, worldPos, Quaternion.identity);
envSpriteRenderer = envObject.GetComponent<SpriteRenderer>();
envSpriteRenderer.sortingOrder = 1;
// Subscribe to destroy event
LevelBuilder.Instance.LevelDestroyed += Destroy;
}
public void ChangeEnv(LevelBuilderButtons.PlacementOption placementOption)
{
// Clean previous contents
cellData.cellContent = LayoutCellData.CellContent.None;
cellData.isTarget = false;
if (crate)
{
GameObject.Destroy(crate.gameObject);
}
// Place new object
if (placementOption == LevelBuilderButtons.PlacementOption.Block)
{
cellData.cellContent = LayoutCellData.CellContent.Block;
}
else if (placementOption == LevelBuilderButtons.PlacementOption.Environment)
{
cellData.isTarget = true;
}
else if (placementOption == LevelBuilderButtons.PlacementOption.Crate)
{
cellData.cellContent = LayoutCellData.CellContent.Crate;
GameObject crateObject = GameObject.Instantiate(cratePrefab, worldPos, Quaternion.identity);
crate = crateObject.GetComponent<Crate>();
crate.layoutPosition = layoutPosition;
}
else if (placementOption == LevelBuilderButtons.PlacementOption.Player)
{
Player.Instance.Teleport(this);
}
UpdateSprites();
}
public void UpdateSprites()
{
if (cellData.cellContent == LayoutCellData.CellContent.Block)
{
envSpriteRenderer.sprite = blockSprite;
}
else if (cellData.isTarget)
{
envSpriteRenderer.sprite = environmentSprite;
}
else
{
envSpriteRenderer.sprite = null;
}
}
public void Destroy()
{
GameObject.Destroy(bgSpriteRenderer.gameObject);
GameObject.Destroy(envSpriteRenderer.gameObject);
LevelBuilder.Instance.LevelDestroyed -= Destroy;
}
}
}