using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public abstract class DraggablePlaceholder : MonoBehaviour
{
[SerializeField]
protected Color _validColor = Color.green;
[SerializeField]
protected Color _invalidColor = Color.red;
[SerializeField]
protected Transform _outline;
protected Camera _mainCamCache;
protected Rect _lvlBoundsCache;
protected bool _isOnValidPosition;
protected virtual void Start()
{
_mainCamCache = Camera.main;
_lvlBoundsCache = LevelManager.Instance.CurrentLevel.CalculateBounds();
_lvlBoundsCache.xMax += 1;
_lvlBoundsCache.yMax += 1;
UpdatePosition();
}
protected virtual void Update()
{
if (!Input.GetMouseButton(0))
{
if (_isOnValidPosition)
{
Place();
}
Destroy(gameObject);
}
UpdatePosition();
_isOnValidPosition = CanBePlacedHere();
ShowValidity();
}
protected virtual void UpdatePosition()
{
var mousePos = Vector3Int.RoundToInt(_mainCamCache.ScreenToWorldPoint(Input.mousePosition) - new Vector3(0.5f, 0.5f));
mousePos.z = 0;
if (!_lvlBoundsCache.Contains(mousePos)) return;
transform.position = mousePos;
}
///
/// helps determine if a unit can be placed on the tile sitting at unit's position (out of bound? obstacle? invalid tile?
/// default behaviour is : you cant place a tile over an already existing tile
///
public virtual bool CanBePlacedHere()
{
return !LevelManager.Instance.Has(obj => obj.Position.Approximately(transform.position));
}
///
/// how your character will appear depending on the validity of the tile you want to put them on
/// default behaviour is changes color of all sprite renderers (this one and children) to red if invalid, green otherwise
///
///
///
public virtual void ShowValidity()
{
Color getColor() => _isOnValidPosition ? _validColor : _invalidColor;
foreach (var child in _outline.GetComponentsInChildren(true))
{
child.color = getColor();
}
}
public abstract void Place();
}