2016-06-27 3 views
-1

Я делаю свой первый проект в 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?

+0

Как я помню, операция 'Resources.Load' комбинированная ведьма' Instantiate' занимала много времени. Если это возможно, попробуйте, например, загрузить «GameObject» в «Stat» и просто создать объект, когда вам нужно. –

+0

@ PawełMarecki, так, в основном, что вы говорите, это то, что я загружаю тот же ресурс снова и снова? О, это плохо, я постараюсь сделать его доступным GameObject, инициализированным один раз, всего лишь минуту –

+0

@ PawełMarecki, ничего себе, спасибо большое, вы на самом деле решили мою проблему, я не понимал, что загружаю один и тот же ресурс несколько times = ( –

ответ

2

Как обсуждалось в комментариях.

В строке:

obj = Instantiate (Resources.Load ("Textures/web", typeof(GameObject)), position, Quaternion.identity) as GameObject; 

Вы погрузочные ресурсы из устройств памяти каждый раз, когда вы вызываете этот код. Просто сохраните GameObject в некоторой переменной, например, в методе Start().

 Смежные вопросы

  • Нет связанных вопросов^_^