Unity3D异步游戏对象实例化

本文关键字:实例化 对象 游戏 异步 Unity3D | 更新日期: 2023-09-27 17:49:27

我现在正在制作我在Unity3D的第一个项目。这是款2D游戏。这是一种runner,但玩家有可能返回一段距离。为了实现这个功能,我正在做这样的事情:

  • 创建两个屏幕显示内容(第一个在游戏开始时看到,第二个在玩家超过第一个屏幕后显示)
  • 当玩家进入下一个屏幕时,我正在计算当前屏幕的位置和大小,以便在它之后创建一个新屏幕(所以它是从开始的2,当玩家进入第二个屏幕时,第三个正在创建,等等)

当我在我的PC上测试它时,一切都很好,但由于某种原因,当下一个屏幕创建时,它会导致我的手机延迟大约一秒钟,现在代码是这样的:

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()中,我检查玩家是否超出当前场景并创建新场景:

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个对象,导致了这种行为。

如果需要,关于"纹理/web"的更多细节:这是一个带有圆形碰撞器和刚体的预制件,设置为运动学

问题:为什么只有5项滞后?我是否以错误的方式使用Instantiate ?我怎样才能让它更快呢?有没有办法叫它async?

Unity3D异步游戏对象实例化

如注释中所述。

:

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

每次调用此代码时都从设备内存中加载资源。只需将GameObject存储在某些变量中,例如Start()方法。