Как оптимизировать разворот объекта в полете?

Я разворачиваю стрелу в полете вот таким скриптом:

void FixedUpdate ()
{
    for (int i = 0; i < transform.childCount ; i++)
    {           
        Vector3 vel = transform.GetChild(i).GetComponent<Rigidbody2D>().velocity;
        float angleZ = Mathf.Atan2(vel.y, vel.x) * Mathf.Rad2Deg;
        float angleY = Mathf.Atan2(vel.z, vel.x) * Mathf.Rad2Deg;
        transform.GetChild(i).transform.eulerAngles = new Vector3(0, -angleY, angleZ);
    }
}

Проблема в том, что когда стрел слишком много все начитает тормозить.


Можно как-то добиться того же результата, но при этом с меньшими затратами производительности?


Ответы (1 шт):

Автор решения: Yaroslav

Слишком много это сколько?

Не запрашивать лишний раз GetComponent с transform (что есть тот-же GetComponent) и кешировать ссылки на них.

private Transform _transform;
private int _childCount;
private Transform[] _childTransform;
private Rigidbody2D[] _childBody;

private void Awake () {
    _transform = transform;
}

private void FixedUpdate () {
    if (_transform.childCount != _childCount)
        UpdateChildArray();
    for (int i = 0; i < _childCount; i++) {
        Vector3 vel = _childBody[i].velocity;
        float angleZ = Mathf.Atan2(vel.y, vel.x)*Mathf.Rad2Deg;
        float angleY = Mathf.Atan2(vel.z, vel.x)*Mathf.Rad2Deg;
        _childTransform[i].eulerAngles = new Vector3(0, -angleY, angleZ);
    }
}

private void UpdateChildArray () {
    _childCount = _transform.childCount;
    _childTransform = new Transform[_childCount];
    _childBody = new Rigidbody2D[_childCount];
    for (int i = 0; i < _childCount; i++) {
        _childTransform[i] = _transform.GetChild(i);
        _childBody[i] = _childTransform[i].GetComponent<Rigidbody2D>();
    }
}
→ Ссылка