【发布时间】:2019-08-16 19:22:48
【问题描述】:
我开发了洞游戏,玩家必须在地板上吸收一些立方体,一切看起来都很好,只是存在一些优化问题。我认为问题是由于寻找范围内的可吸收物体落入洞中引起的,我有 2 种方法,它们在 FixedUpdate 中被调用。在我在 Cubes 列表上迭代的每一帧上称为 CountNearbyCubes 的方法中,有时它的计数甚至是 500-600 个对象,如果一些对象靠近孔,那么它们被添加到另一个列表中,第二个列表用于名为 AttractCubes 的方法。在这种方法中,我遍历所有对象并查看它们的变换位置并将它们推向孔的变换位置。
这是方法和 FixedUpdate 的代码,我正在添加游戏的屏幕截图以更加清晰。
对不起,如果我的问题令人困惑。提前感谢您的帮助。
void FixedUpdate() {
//count real nearbyCubes
CountNearbyCubes(ref NearbyCubes, CubesContainers, GravityCenterTransform.position);
//count minor nearbyCubes
AttractCubes(NearbyCubes);
}
private void AttractCubes(List<GameObject> cubes) {
foreach (GameObject cube in cubes) {
if (!cube.GetComponent<AbsorbableObject>().IsAbsorbed) {
Vector3 force = CentripetalMovement.GetGravitationForce(GravityCenterTransform, cube.transform, Mass, CubeMass);
if (cube.tag == "Bomb") {
force /= 5;
}
cube.GetComponent<Rigidbody>().AddForce(force, ForceMode.Impulse);
}
}
}
private void CountNearbyCubes(ref List<GameObject> nearbyCubes, GameObject cubesContainer, Vector3 gravityCenter) {
foreach (Transform cube in cubesContainer.transform) {
if (Vector3.SqrMagnitude(cube.position - gravityCenter) < Mathf.Pow(NearbyDistance, 2)) {
if (!nearbyCubes.Contains(cube.gameObject)) {
if (cube.tag == "Cube" && !cube.gameObject.GetComponent<CubeController>().IsAbsorbed)
nearbyCubes.Add(cube.gameObject);
else if (cube.tag == "Bomb")
nearbyCubes.Add(cube.gameObject);
}
}
else {
nearbyCubes.Remove(cube.gameObject);
}
}
}
如果你明白我在做什么,只是想知道是否有另一种方法可以更有效地提高运行时的 fps
【问题讨论】:
标签: c# unity3d optimization game-development