problème : - le range d'attaque n'apparaissait pas sur le placeholder des unités - le outline ne fonctionnait pas bien sur toutes les unités - le placeholder étant opaque, on ne pouvait pas voir la tuile en dessous solutions : - utiliser les bounds du collider de détection pour tracer le range des unités sur le placeholder - utiliser un shader pour tracer un outline colorable autour des unités - rendre le placeholder plus transparent
53 lines
1.9 KiB
C#
53 lines
1.9 KiB
C#
using UnityEngine;
|
|
|
|
public class GameObjectPlacementButton : UnitPlacementButton
|
|
{
|
|
[SerializeField]
|
|
private GameObject _prefab;
|
|
protected override void Place()
|
|
{
|
|
var instance = Instantiate(_prefab);
|
|
|
|
//we need to do that before stripping the object
|
|
var detectComp = instance.GetComponentInChildren<Detection>();
|
|
Rect detectionRect = default;
|
|
if(detectComp) detectionRect = instance.GetComponentInChildren<Detection>().DetectionRectangle;
|
|
|
|
//strip the objecty
|
|
foreach (var comp in instance.transform.GetAllComponents<Rigidbody2D>()) Destroy(comp);
|
|
foreach (var comp in instance.transform.GetAllComponents<Collider2D>()) Destroy(comp);
|
|
foreach (var comp in instance.transform.GetAllComponents<MonoBehaviour>()) Destroy(comp);
|
|
|
|
foreach (var comp in instance.transform.GetAllComponents<SpriteRenderer>())
|
|
{
|
|
var color = (comp as SpriteRenderer).color;
|
|
color.a = 0.6f;
|
|
(comp as SpriteRenderer).color = color;
|
|
|
|
(comp as SpriteRenderer).material = _outlineMaterial;
|
|
}
|
|
|
|
|
|
var placeholder = instance.AddComponent<ObjectPlaceholder>();
|
|
placeholder.Prefab = _prefab;
|
|
|
|
CreateRange(placeholder, detectionRect);
|
|
}
|
|
|
|
void CreateRange(DraggablePlaceholder placeholder, Rect detectionRect)
|
|
{
|
|
if (detectionRect == default) return;
|
|
|
|
var detection = new GameObject("Detection");
|
|
|
|
var rend = detection.AddComponent<SpriteRenderer>();
|
|
rend.sprite = _detectionRangeSprite;
|
|
rend.sortingLayerName = "Character";
|
|
rend.sortingOrder = 0;
|
|
rend.color = new Color(1, 1, 1, 0.2f);
|
|
|
|
detection.transform.SetParent(placeholder.transform);
|
|
detection.transform.localPosition = detectionRect.center;
|
|
detection.transform.localScale = detectionRect.size;
|
|
}
|
|
} |