Я делаю свой первый проект в Unity3D
прямо сейчас. Это 2D-игра. Это своего рода runner
, но с возможностью для игрока вернуться на некоторое расстояние. Для достижения этой функции на данный момент, я делаю что-то вроде этого:Unity3D async экземпляр объекта игры
- Создание двух экранов с содержанием (первый, чтобы увидеть в начале игры, второй, чтобы показать это после того, как игрок exceedes первый экран)
- Когда игрок переходит на следующий экран, я вычисляю текущую позицию и размер экрана, чтобы создать новый после него (так что это 2 с самого начала, и когда игрок переходит ко второму, третий создает и т. Д.)
Когда я тестировал его на своем ПК, все было в порядке, но по какой-то причине, когда следующий экран создает, он заставляет мой телефон задерживаться то, что как второй, как теперь код идет:
Start()
В методе сценария я инициализирующий две сцены:
Scene scene = new Scene();
scene.setSceneBounds (screenBounds);
scene.createBackground (cameraOffsetOnStart, sceneSize);
scene.createContent();
sceneNumber++;
currentScenePosition = sceneSize * sceneNumber;
Vector2 nextScenePosition = new Vector2 (cameraOffsetOnStart.x + currentScenePosition.x, cameraOffsetOnStart.y);
Scene scene2 = new Scene();
screenBounds.min = new Vector2(min.x + currentScenePosition.x, min.y);
screenBounds.max = new Vector2(max.x + currentScenePosition.x, max.y);
scene2.setSceneBounds (screenBounds);
scene2.createBackground (nextScenePosition, sceneSize);
scene2.createContent();
А потом в Update()
я буду, если игрок exceedes текущей сцены и создания проверка новый:
void Update() {
if (player.transform.position.x - playerOffset > sceneNumber * (max.x - min.x)) {
Debug.Log("current scene is : " + (++sceneNumber));
currentScenePosition = sceneSize * sceneNumber;
Vector2 nextScenePosition = new Vector2 (cameraOffsetOnStart.x + currentScenePosition.x, cameraOffsetOnStart.y);
Scene scene = new Scene();
screenBounds.min = new Vector2(min.x + currentScenePosition.x, min.y);
screenBounds.max = new Vector2(max.x + currentScenePosition.x, max.y);
scene.setSceneBounds (screenBounds);
scene.createBackground(nextScenePosition, sceneSize);
scene.createWebs();
sceneManager.Scenes.Add(scene);
}
}
И код для создания контента:
public void createBackground(Vector2 position, Vector2 size) {
background = new Background (position, size);
}
public void createContent() {
Vector2[] positions = Utilities.generateRandomPositions(5, sceneBounds, 4f);
for (int i = 0; i < positions.Length; i++) {
Web web = ScriptableObject.CreateInstance<Web>();
web.init(positions[i]);
}
}
Проблема запаздывания исходит от метода createContent
. Код для init
:
public void init(Vector2 position) {
if (position != Vector2.zero) {
obj = Instantiate (Resources.Load ("Textures/web", typeof(GameObject)), position, Quaternion.identity) as GameObject;
}
}
Очевидно, что Instantiate
метод вызова 5 раз подряд в течение 5 объекта вызывает этот behviour.
Более подробная информация о «Текстурах/Сетях», если это необходимо: Это сборное с окружностью коллайдером и RigidBody, которые устанавливают, что кинематической
Вопросов: Почему это отставание от всего 5 пунктов? Я использую Instantiate
неправильно? Как я могу сделать это быстрее? Есть ли способ назвать это async?
Как я помню, операция 'Resources.Load' комбинированная ведьма' Instantiate' занимала много времени. Если это возможно, попробуйте, например, загрузить «GameObject» в «Stat» и просто создать объект, когда вам нужно. –
@ PawełMarecki, так, в основном, что вы говорите, это то, что я загружаю тот же ресурс снова и снова? О, это плохо, я постараюсь сделать его доступным GameObject, инициализированным один раз, всего лишь минуту –
@ PawełMarecki, ничего себе, спасибо большое, вы на самом деле решили мою проблему, я не понимал, что загружаю один и тот же ресурс несколько times = ( –