Zefirot
@Zefirot

Как изменять массово свойства элементам?

Мне вот нужно чтобы нескольким элементам менялась альфа медленно, я делаю так
Update(){
  ActiveAlpha();
  }
private void ActiveAlpha(){
float alf += Time.deltaTime;
  for(int n = 0; n < ArrayObj; ++n){
    ArrayObj[n].gameObject.GetComponent<SpriteRenderer>().color = new Color(1f, 1f, 1f, alf);
    }
}

Но может есть какой-то метод в юнити по проще чтобы нескольким элементам менять свойства?
а то как бы при каждом апдейте перебор массива....

(данный вопрос затрагивался в другой теме, но думаю это стоит отдельной темы)
  • Вопрос задан
  • 87 просмотров
Решения вопроса 1
@Ente
Unity developer
Создаешь скрипт AlphaChanger.cs, в нем такой код

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


Вешаешь этот скрипт на все спрайты, которые будут фейдится. Если нужно вызвать его у детей gameobjecta, заводишь еще один скрипт AlphaChangerManager, в нем пишешь такие функции.

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


Преимущество в том, что можно вызвать как и отдельный фейд у любого спрайта, так и все сразу, через общий скрипт
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы