Вызов случайного метода со случайным методом в качестве параметра - PullRequest
0 голосов
/ 12 февраля 2020

Итак, я работаю в SpawnController для моей игры Unity. Я хочу порождать случайный тип врага в случайной позиции.

В настоящее время у меня есть два метода рандомизации позиции появления:

В верхней части экрана:

void SpawnTop(IEnumerator spawnMethod)
{
    //There's 4 positions on plane X where the enemy can spawn
    randomXSpawnSection[0] = Random.Range(-13f, -6.5f);
    randomXSpawnSection[1] = Random.Range(-6.5f, 0f);
    randomXSpawnSection[2] = Random.Range(0f, 6.5f);
    randomXSpawnSection[3] = Random.Range(6.5f, 13.1f);

    StartCoroutine(spawnMethod);
}

А со стороны экрана:

void SpawnSide(IEnumerator spawnMethod)
{
    //There's 4 positions on plane Z where the enemy can spawn
    randomZSpawnSection[0] = Random.Range(-7f, 1.5f);
    randomZSpawnSection[1] = Random.Range(1.5f, 10f);
    randomZSpawnSection[2] = Random.Range(10f, 18.5f);
    randomZSpawnSection[3] = Random.Range(18.5f, 27.1f);

    StartCoroutine(spawnMethod);
}

Оба эти метода используют в качестве параметра другой метод, который создает экземпляр определенного типа врага, подобного этому:

IEnumerator SpawnEnemyGunner(float randXSpawn, float randTimeSpawn)
{
    yield return new WaitForSeconds(randTimeSpawn);

    randZSpawn = Random.Range(24, 30);
    Instantiate(enemyGunner, new Vector3(randXSpawn, 1.5f, randZSpawn), enemyGunner.transform.rotation);

    spawning = false;
}

У меня есть несколько врагов в игре, поэтому несколько из этих методов.

Пример вызова вложенных методов без их рандомизации:

SpawnTop(SpawnEnemyGunner(Random.Range(0, randomXSpawnSection.Length), Random.Range(3, 6)));

Я хочу рандомизировать метод и его параметр метода.

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

Специфический c generi c подход может выглядеть следующим образом:

IEnumerator Foo1(float someParam)
        { 
            yield return new WaitForSeconds(1);
            Debug.Log($"Foo1: {someParam}");
        }

        IEnumerator Foo2(float someParam2)
        {
            yield return new WaitForSeconds(1);
            Debug.Log($"Foo2: {someParam}");
        }

        void CallRandomFoo()
        {
            Func<float, IEnumerator>[] foos = { Foo1, Foo2 };
            var randomParam = Random.value;
            StartCoroutine(foos[Random.Range(0, foos.Length)](randomParam));
        }
1 голос
/ 12 февраля 2020

Должно быть так же просто, как

var x = randomXSpawnSection[Random.Range(0, randomXSpawnSection.Length)];
var y = randomZSpawnSection[Random.Range(0, randomZSpawnSection.Length)];
var enemy = Prefabs[Random.Range(0, Prefabs.Length)];

Instantiate(enemy, new Vector3(x, 1.5f, y), enemyGunner.transform.rotation);
...