Как создать массив из функций?

Небольшой скрипт или скорее просто пример. Допустим, при взаимодействии игровых объектов, нужно чтобы была выполнена та или иная функция, выбранная рандомно. И тут возникает вопрос, как создать массив из различных функций, а затем выполнить какую-либо по номеру индекса? В общем, как и в любом обычном массиве. Конечно, можно обойтись, например, используя switch, и переключаться между нужными функциями. Тем не менее, возможность создавать массивы из самих функций скрипта, полагаем будет не лишнем. Конструкция достаточно простоя, поэтому берем и пользуемся, предоставленным ниже примером.

Собственно пример:

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {

	private System.Action myUpdate = () => {}; 
	private System.Action[] actions;

	void Start()
	{
		actions = new System.Action[]{FunctionA, FunctionB, FunctionC};
	}

	public void FunctionUpdate(int index)
	{
		myUpdate = actions[index];
		myUpdate();
	}

	void FunctionA()
	{
		Debug.Log("Function A");
	}

	void FunctionB()
	{
		Debug.Log("Function B");
	}

	void FunctionC()
	{
		Debug.Log("Function C");
	}
}



Если мы хотим выполнить рандомную функцию, сделать это можно так:

FunctionUpdate(Random.Range(0, actions.Length));

Комментариев 5

Офлайн
Всё очень круто, а вы можете скинуть свой канал на ютубе, или если его нет то хоть как-то подробно всё объяснить, я в том смысле что объяснить все детали, мне к примеру не очень то и понятна эта строка private System.Action myUpdate = () => {}; , а хотелось бы узнать как и что происходит. Изучаю юнити уже где-то пол года недавно увидел ваш сайт и понял как много я не знаю ))
Офлайн
Light 13 июня 2017
Андрей Пивень, по конкретному примеру можно почитать здесь
Офлайн
grPre1 2 июля 2017
Спасибо за код.
Есть вопрос. У меня эти методы с параметром, а Юнити ругается "Cannot implicitly convert type `void' to `System.Action'". Понятно почему, но не понятно как это лечить. Ну и я убрал у себя вашу FunctionUpdate(), а просто оставил myUpdate = actions[index]; Подскажите, пжл, как подправить.
Офлайн
Light 2 июля 2017
grPre1, если с параметрами, тогда вот так:

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {

	private System.Action<int, string> myUpdate = (int i, string t) => {};
	private System.Action<int, string>[] actions;

	void Start()
	{
		actions = new System.Action<int, string>[]{FunctionA, FunctionB, FunctionC};
	}

	public void FunctionUpdate(int value, string text, int index)
	{
		myUpdate = actions[index];
		myUpdate(value, text);
	}

	void FunctionA(int i, string t)
	{
		Debug.Log("Function A --> int = [ " + i + " ] | string = [ " + t + " ]");
	}

	void FunctionB(int i, string t)
	{
		Debug.Log("Function B --> int = [ " + i + " ] | string = [ " + t + " ]");
	}

	void FunctionC(int i, string t)
	{
		Debug.Log("Function C --> int = [ " + i + " ] | string = [ " + t + " ]");
	}
}
Офлайн
grPre1 2 июля 2017
Light,
Большое спасибо. ))
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
  • Яндекс.Метрика