Unity3D 异步游戏对象实例化
Unity3D async game object instantiation
我现在正在 Unity3D
做我的第一个项目。这是一个2D游戏。这是某种 runner
,但玩家有可能后退一段距离。为了暂时实现这个功能,我正在做这样的事情:
- 创建两个包含内容的屏幕(第一个在游戏开始时看到,第二个在玩家超过第一个屏幕后显示)
- 当玩家进入下一个屏幕时,我正在计算当前屏幕的位置和大小以在其后创建新的屏幕(所以从一开始它是 2,当玩家进入第二个屏幕时,第三个正在创建等等上)
当我在我的 PC 上测试它时,一切都很好,但由于某种原因,当创建下一个屏幕时它导致我的 phone 有点滞后一秒钟,现在代码如何:
在脚本的 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 个对象导致了这种行为。
更多关于 "Textures/web" 的详细信息,如果需要: 这是一个带有圆形碰撞器和刚体的预制件,设置为运动学
问题: 为什么它只滞后于 5 个项目?我是否以错误的方式使用 Instantiate
?我怎样才能让它更快?有没有办法将其称为异步?
如评论中所述。
行内:
obj = Instantiate (Resources.Load ("Textures/web", typeof(GameObject)), position, Quaternion.identity) as GameObject;
您每次调用此代码时都从设备内存中加载资源。只需将 GameObject
存储在某个变量中,例如 Start()
方法中。
我现在正在 Unity3D
做我的第一个项目。这是一个2D游戏。这是某种 runner
,但玩家有可能后退一段距离。为了暂时实现这个功能,我正在做这样的事情:
- 创建两个包含内容的屏幕(第一个在游戏开始时看到,第二个在玩家超过第一个屏幕后显示)
- 当玩家进入下一个屏幕时,我正在计算当前屏幕的位置和大小以在其后创建新的屏幕(所以从一开始它是 2,当玩家进入第二个屏幕时,第三个正在创建等等上)
当我在我的 PC 上测试它时,一切都很好,但由于某种原因,当创建下一个屏幕时它导致我的 phone 有点滞后一秒钟,现在代码如何:
在脚本的 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 个对象导致了这种行为。
更多关于 "Textures/web" 的详细信息,如果需要: 这是一个带有圆形碰撞器和刚体的预制件,设置为运动学
问题: 为什么它只滞后于 5 个项目?我是否以错误的方式使用 Instantiate
?我怎样才能让它更快?有没有办法将其称为异步?
如评论中所述。
行内:
obj = Instantiate (Resources.Load ("Textures/web", typeof(GameObject)), position, Quaternion.identity) as GameObject;
您每次调用此代码时都从设备内存中加载资源。只需将 GameObject
存储在某个变量中,例如 Start()
方法中。