gather-and-defend/Assets/Scripts/Drag&Drop/GameObjectPlacementButton.cs
Felix Boucher 092aa026c8 drag&drop - montrer range et tweaker outline
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
2023-06-13 18:30:15 -04:00

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;
}
}