2016-03-06 43 views

回答

1

除非你是初学者,并且只是乱搞Unity3D,然后生成并销毁对象。如果你计划发布任何游戏,那不是。不要这样做!

那么当玩家向前移动时,是否需要删除/销毁先前生成的物体 ?

它会改善内存使用情况吗?

如果您生成一个新对象或者内存不足,则需要删除/销毁对象。 但是生成和删除/销毁GameObjects会减慢你的游戏速度,因为这会调用垃圾回收器。

正确地做到这一点的方法是使用称为对象池的东西。 您必须创建自己的对象池类。

它很长的解释,但我会尽量保持它的简短。

对象池的工作原理是再使用游戏对象,而不是实例化/生成新的对象和销毁旧的。

有很多方法可以做到这一点,但我会谈论我做到这一点。

  1. 找出假设在场景中的最大物体。 让你的枪使用7颗子弹,你需要20个子弹在你的FPS游戏的游泳池。

  2. 在游戏开始之前,在场景中创建20个子弹,并通过禁用所有子弹来隐藏它们。

  3. startAwake功能,得到所有的子弹性能那会变化当你它。 变换旋转/四元数是通常会改变的事情之一。

Vector3 defaultPosition = bullet.transform.position; Quaternion defaultRotation = bullet.transform.rotation;

  1. 有一个bool变量来确定项目符号何时被使用,以便它不能被重新分配,直到它不再被使用。我们可以称之为bool isInUse = false;

  2. 使重置功能重置子弹。里面的复位,所有你所要做的就是重置那些改变他们默认值值拍摄,然后禁用子弹时。还将isInUse设置为false。 例如,

空隙复位{

bullet.transform.position = defaultPosition;

bullet.transform.rotation = defaultRotation;

bullet.SetActive(false);

isInUse = false;

}

  • 创建一个名为 “WaitForReset” 协程函数,确定当子弹应复位。 您可以根据距离重置项目符号,它已被移除,它已被移除多少次后,或者​​何时移除与另一个GameObject碰撞。这是由你来实现的。我下面有一个将等待5秒钟,然后重置GameObject /项目符号。

    `的IEnumerator WaitForReset(){

    收率返回新WaitForSeconds(5);

    reset();

    }`

  • 拍摄子弹,检查如果20发子弹财产isInUse之一是false,然后加载第一一个返回false。如果当前项目符号是InUse,请转到下一个项目。一旦你射击子弹,调用WaitForReset()函数,以便子弹可以稍后重置。

  • StartCoroutine(WaitForReset());

    这将会一遍又一遍地发生,无需分配和释放内存,从而提高游戏速度。

    解决方案为大型独特模型在现场如建筑物。 假设你有大对象与他们的HQ纹理,池可能不是最好的方式去做这件事。

    详细程度LOD)应该被使用。所以基本上你会为每个大型游戏对象创建多个3D模型。高细节的物体,中细节,低细节,真的是真正的细节多边形。

    当你远离那个物体时,Unity只会显示低详细的3D模型。只要您靠近物体,Unity就会自动将3D模型与高度详细的3D模型交换。这提高了游戏的内存和速度。要了解如何设置Google的“细节层次统一”并观看视频。它需要视觉来理解。

    0

    Unity不会为您删除实例化的GameObjects。我不知道你在谈论什么水平,但如果它是某种无尽的水平,你最终必须照顾内存,可能需要删除创建的GameObjects。

    如果有可能重用这些GameObjects,您应该看看一个名为“对象池”的方法。下面是从团结的官方视频教程:

    https://unity3d.com/learn/tutorials/modules/beginner/live-training-archive/object-pooling

    注意:这仅仅是一个建议,以稀疏的信息。根据你的关卡类型,根本不删除游戏对象也是有意义的。例如,如果您不希望它们消失,因为您可以重新访问部分级别,并且内存使用率较低而不在意。 (在Unity编辑器的“游戏”窗口中激活统计面板。)

    +0

    我在说'庙宇跑'那种游戏。当玩家前进时,我认为游戏会产生新的物体。 – RainingComputers