Как правильно организовать процесс загрузки сложной сцены в unity3d?

Здравствуйте. Есть космическая игра с довольно сложной основной сценой (точнее с постоянно растущим в процессе разработки количеством действий). На данный момент процесс загрузки состоит в основном из создания и инициализации различных GO (звезда, планеты, корабли, астероидные поля и т.д.). Сейчас за это отвечает скрипт LevelBuilder, в котором в методе Start портянка на сотню строк кода. В рамках большого рефакторинга нужно это переработать, пытаюсь понять, как такие вещи делают в нормальных проектах.

По сути мне нужно что-то вроде pipeline, в котором я смогу изолированно добавлять/изменять этапы. В общем, нужен совет, как это лучше сделать - может есть какая общепринятая техника, на событиях может или еще как.

Для понимания масштаба бедствия - вот текущий LevelBuilder (про очевидные нарушения правил именования, принципов ООП и т.д. можете не говорить - над этим и работаю).
  • Вопрос задан
  • 713 просмотров
Решения вопроса 1
BasmanovDaniil
@BasmanovDaniil
Геймдизайнер-телепат
Можете вынести планеты, астероиды и прочее в отдельные контроллеры, в таком духе:
public class AsteroidsController : MonoBehaviour
{
    public GameObject asteroidFieldPrefab;

    private GameObject[] asteroids;

    public void SpawnAsteroids(GameObject star, AsteroidBelt[] asteroidBelts)
    {
        asteroids = new GameObject[asteroidBelts.Length];
        for (int i = 0; i < asteroids.Length; i++)
        {
            AsteroidBelt ast = asteroidBelts[i];
            asteroids[i] = (GameObject) Instantiate(asteroidFieldPrefab, new Vector3(0, 0, 0), Quaternion.identity);

            //Поскольку система изначально имеет радиус 1, она начинает спавнить астероиды внутри звезды. Не надо так
            asteroids[i].SetActive(false);

            asteroids[i].name = ast.name;
            asteroids[i].transform.localScale *= Units_class.MetersToUnityUnits(ast.radius);

            //А теперь надо
            asteroids[i].SetActive(true);

            AsteroidFieldOrbiter_script orbScript = asteroids[i].GetComponent<AsteroidFieldOrbiter_script>();
            orbScript.astdField = ast;
            orbScript.star = star;
            orbScript.SetStartPosit();
        }
    }
}

В LevelBuilder дёргаете SpawnAsteroids, а контролер астероидов дальше сам по себе живёт, так будет аккуратнее, чем один большой класс.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы