le fait qu'il faille updater des tiles du tilemap posait un réel problème création d'un système d'héritage pour que les game objects et les tiles puissent cohabiter dans une même game loop - ILevelObject contient des fonctions de start, de destroy, d'update, d'égalité et une position - LevelTile et LevelObject héritent de ILevelObject et peuvent être hérité par des tiles ou des MonoBehaviours. - le level manager est un monobehaviour singleton qui update tous les ILevelObjects à chaque frame.
54 lines
1.7 KiB
C#
54 lines
1.7 KiB
C#
using UnityEngine;
|
|
using UnityEngine.Tilemaps;
|
|
|
|
/// <summary>
|
|
/// can be inherited by tiles in order to be added to the level manager
|
|
/// </summary>
|
|
public abstract class LevelTile : TileBase, ILevelObject
|
|
{
|
|
[SerializeField]
|
|
private Sprite _sprite;
|
|
public Vector3 Position { get; protected set; }
|
|
public Tilemap Tilemap { get; private set; }
|
|
|
|
public abstract void LevelStart();
|
|
public abstract void LevelDestroy();
|
|
public abstract void LevelUpdate();
|
|
public abstract bool Equals(ILevelObject other);
|
|
|
|
public override bool StartUp(Vector3Int position, ITilemap tilemap, GameObject go)
|
|
{
|
|
//only execute if application is in play mode
|
|
if (!Application.isPlaying)
|
|
{
|
|
return base.StartUp(position, tilemap, go);
|
|
}
|
|
|
|
var comp = tilemap.GetComponent<Tilemap>();
|
|
|
|
//need to create an instance of the tile, otherwise the position will change for all tiles instead of only this one.
|
|
var instance = Instantiate(this);
|
|
instance.Position = position;
|
|
instance.Tilemap = comp;
|
|
|
|
//lambda expression to be used to check if the tile already exists
|
|
bool isSameTile(LevelTile tile) => tile.Equals(instance);
|
|
|
|
//if tile is exactly the same as before, don't add.
|
|
if (LevelManager.Instance.Has<LevelTile>(isSameTile)) return base.StartUp(position, tilemap, go);
|
|
|
|
|
|
|
|
LevelManager.Instance.Add(instance);
|
|
return base.StartUp(position, tilemap, go);
|
|
}
|
|
public override void GetTileData(Vector3Int position, ITilemap tilemap, ref TileData tileData)
|
|
{
|
|
tileData.sprite = _sprite;
|
|
tileData.transform.SetTRS(Vector3.zero, Quaternion.identity, Vector3.one);
|
|
tileData.color = Color.white;
|
|
}
|
|
|
|
|
|
|
|
} |