ArXen42
@ArXen42

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

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

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

Для понимания масштаба бедствия - вот текущий LevelBuilder (про очевидные нарушения правил именования, принципов ООП и т.д. можете не говорить - над этим и работаю).
  • Вопрос задан
  • 714 просмотров
Решения вопроса 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, а контролер астероидов дальше сам по себе живёт, так будет аккуратнее, чем один большой класс.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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