【发布时间】:2019-04-30 17:58:44
【问题描述】:
我有一款我一直在开发的游戏。昨晚我构建了它并将其上传到 Google Play。然后我拿起我的安卓手机,去 Play 商店下载我的游戏,当它开始时,它运行得非常糟糕。游戏移动得非常快和滞后,几乎就像我将相机速度设置为一个疯狂的高数字一样。它是完全无法播放的。这将是游戏的主菜单,上面没有 UI 元素:https://youtu.be/Hxih--U8q9g
场景的一点背景:
所有这些建筑物和道具都会在运行时在玩家通过关卡时在更新函数中实例化,但一旦玩家通过它们,它们也会被摧毁。它们都是预制件,并且都使用具有各自纹理的自己的单独材料。玩家实际玩的游戏关卡与主菜单完全相同,只是里面有玩家。我的问题是,这可能仅仅是因为对移动设备的优化不佳吗?
我已经在 Unity 中将质量设置设置为最低,并将所有纹理从 4K 分辨率缩小到 128x128 - 512x512(取决于资产)。即使进行了这些优化,游戏的运行也和以前一样糟糕。
我将改变实例化对象的方式,并改用对象池。我还将使用纹理图集来代替所有这些不同的纹理和材料。
这是我目前实例化预制件的方式:
void Update()
{
if (player.transform.position.z >= spawn.transform.position.z)
{
center = transform.position;
for (int i = 0; i < Random.Range(obstacleDifficulty.x, obstacleDifficulty.y); i++)
{
StartCoroutine(Delay());
}
Vector3 newPos = transform.position;
newPos.z += moveSpawner;
transform.position = newPos;
}
}
public void SpawnObstacles()
{
Vector3 pos = center + new Vector3(Random.Range(-size.x / 2, size.x / 2), 0, Random.Range(-size.z / 2, size.z / 2));
int n = Random.Range(0, obstacles.Length);
GameObject theObstacle = obstacles[n];
Instantiate(theObstacle, pos, rotation);
}
IEnumerator Delay()
{
yield return new WaitForSeconds(0.05f);
SpawnObstacles();
}
我想解决这个问题,让游戏运行得非常流畅。我想知道做我上面描述的事情,使用池和图集,是否足以解决这个问题。
编辑: 这是我的相机控制器脚本:
using UnityEngine;
using System.Collections;
public class CameraController : MonoBehaviour
{
public GameObject player;
public float cameraHeight;
private Vector3 offset;
void Start ()
{
offset = transform.position - player.transform.position;
}
void LateUpdate ()
{
transform.position = player.transform.position + offset;
transform.position = new Vector3(0, cameraHeight, transform.position.z);
}
}
我在 Unity 的官方教程中看到了一些关于使用 Time.deltaTime 的内容,但我认为我应该在玩家的移动中使用它,并且将玩家的速度值与 Time.deltaTime 相乘并没有得到我想要的结果。这是我的玩家的动作:
rb.velocity = new Vector3(xVelocity * Input.acceleration.x * 1.75f, 0, 速度);
昨晚我还禁用了相机上的所有图像效果,并从我的场景中删除了大约 25 个批次,我不知道那些会这么贵。我的场景大约有 15 个批次,之前大约是 55-70 批次,我还没有在我的手机上测试它以查看它是如何移动的。
【问题讨论】:
-
1) 您是否尝试过在统一 3d 中进行分析?这可能很有帮助。 2) 为什么要在 Update 中实例化对象?为什么不在开始时(开始)实例化所有它们并将更新留空,因为它每帧调用一次?
-
@AlexSikilinda 我想在运行时实例化它们的原因是因为我用它来实例化预制件,这些预制件共同构成了我的玩家正在玩的关卡,我不知道他会走多远进入那一轮。我在 Unity 中使用了分析器,但对我来说没有什么奇怪的,除了一些我理解的只发生在编辑器中的事情,所以我不应该担心这些。
-
你试过完全实例化整个关卡吗?它可能比每次在更新中检查它更快?或者您可以实例化关卡的很大一部分,而不是实例化单独的障碍。
-
您还可以在设备上配置文件(请参阅 Unity 文档),您将看到最耗时的内容
-
尽可能避免在运行时实例化。对象池可能会大大提高您的性能,尤其是在移动设备上的 3D 中。