[SerializedField] private int hitpoints = 100;
public Action<int, int> OnChange;
public void Change(int amount)
{
hitpoints += amount;
OnChange?.Invoke(hitpoints, amount);
}
[SerializedField] private int amount = -10;
public Action<int> OnDamage;
private void OnTriggerEnter2D(Collider2D collider)
{
collider.gameObject.GetComponent<Health>().Change(amount);
OnDamage?.Invoke(amount);
}
[SerializedField] private Transform target;
[SerializedField] private bool isReadyToRun;
private void OnTriggerEnter()
{
isReadyToRun = !isReadyToRun;
}
private void Update()
{
if (!isReadyToRun) return;
transform.position = Vector3.MoveTowards(transform.position, target, Time.deltaTime * 2f);
}
[SerializedField] private int hitpoints = 100;
public Action<int, int> OnChange;
public void Change(int amount)
{
hitpoints += amount;
OnChange?.Invoke(hitpoints, amount);
}
private void OnEnable()
{
GetComponent<Health>().OnChange += OnChange;
}
private void OnDisable()
{
GetComponent<Health>().OnChange -= OnChange;
}
private void OnChange(int hitpoints, int amount)
{
//здесь уже делай всю визуальную часть, основанную на значениях выше.
}
private SpriteRenderer spriteRenderer; //Кэшируем компонент
[SerializeField] private float speed = 1; //Скорость фейдинга
private void Awake()
{
spriteRenderer = GetComponent<SpriteRenderer>();
}
public void Show()
{
StartCoroutine(SetVisibility(1));
}
public void Hide()
{
StartCoroutine(SetVisibility(0));
}
private IEnumerator SetVisibility(float finish)
{
var color = spriteRenderer.color;
while (true)
{
color.a = Mathf.MoveTowards(color.a, finish, speed * Time.deltaTime);
spriteRenderer.color = color;
if (color.a == finish) break;
yield return null;
}
}
private AlphaChanger[] alphaChangers; //Кэшируем компоненты детей
private void Awake()
{
alphaChangers = GetComponentsInChildren<AlphaChanger>();
}
public void ShowAll()
{
alphaChangers.ForEach(a => a.Show());
}
public void HideAll()
{
alphaChangers.ForEach(a => a.Hide());
}
[SerializeField] private Button activationButton;
[SerializeField] private Slider progressSlider;
[SerializeField] private float speed = 1;
private void OnEnable()
{
activationButton.onClick.AddListener(Press);
}
private void OnDisable()
{
activationButton.onClick.RemoveListener(Press);
}
private void Press()
{
activationButton.onClick.RemoveListener(Press);
StartCoroutine(Loop());
IEnumerator Loop()
{
for (var i=progressSlider.value; i<1f; i+= Time.deltaTime * speed)
{
progressSlider.value = i;
yield return null;
}
}
}
[SerializedField] private bool isLeader; //переменная указывает, что данный объект лидер, а остальные повторяют
[SerializedField] private string category; //переменная для разделения объектов на категории, например категория "синие", "красные"
private MovementSyncer leader; //переменная для кеширования лидера на старте
private void Awake()
{
//найди объект-лидер для данной категории
leader= FindObjectsOfType<MovementSyncer>().First(ms => ms.category == category && ms.isLeader);
}
private void Update()
{
if (isLeader) return; //пропускаем себя, еcли лидер
transform.position = leader.transform.position;
}