【发布时间】:2019-07-13 01:03:09
【问题描述】:
过去几周我一直在试验 Unity;我还是新人。我稍微涉足 ECS、计算着色器等,但如果由于复杂性而没有必要,我真的不想实现这些解决方案。
默认的 Unity 物理引擎真的不能同时使用刚体处理移动 500 个立方体实例吗?还是我做事的方式对性能特别不利?
这是我正在使用的代码;它只是一个空游戏对象上的一个脚本。实例化 500 个立方体时,它会减慢到 16FPS,然后通过 Rigidbody MoveTowards 一次移动它们时减慢到 0.3 FPS。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SpawnAndMove : MonoBehaviour
{
public TargetCube TargetCube;
public GameObject CubePrefab;
public Vector3 brickPosition = new Vector3(10, 0, 0);
GameObject[] objects;
int moveCubeInstances;
// Start is called before the first frame update
void Start()
{
StartCoroutine(Countdown());
}
IEnumerator Countdown()
{
yield return new WaitForSeconds(3f);
for (int i = 0; i < 500; i++)
{
var cubeClone = Instantiate(CubePrefab, transform.position + brickPosition, transform.rotation);
cubeClone.tag = "CubeInstance";
}
objects = GameObject.FindGameObjectsWithTag("CubeInstance");
yield return new WaitForSeconds(3f);
moveCubeInstances = 1;
while (moveCubeInstances == 1)
{
for (int i = 0; i < 500; i++)
{
objects[i].GetComponent<Rigidbody>().transform.position =
Vector3.MoveTowards(objects[i].GetComponent<Rigidbody>().transform.position, TargetCube.transform.position, 12f);
}
yield return new WaitForFixedUpdate();
}
print("exited while loop");
}
}
感谢您在此提供的任何帮助。
【问题讨论】:
-
GetComponent 是一项昂贵的操作。避免每次固定更新调用 1000 次
标签: c# performance unity3d instance frame-rate