Магнит в Unity - как уменьшить количество GetComponent?

552
09 декабря 2016, 08:54

Делаю в Unity магнит - через PhysicsOverlap находим, ищем rigidbody и притягиваем к себе. Код

public float radiusdal;
public float forcedal;

void FixedUpdate() {
    Collider[] coldal = Physics.OverlapSphere(transform.position, radiusdal);

    foreach (var col1 in coldal)
    {
        if (col1.GetComponent<Rigidbody>())
        {
            var ux = Vector3.Distance(transform.position,  col1.transform.position);
            var aux = 0.5f / (ux); 

            col1.GetComponent<Rigidbody>().AddForce((transform.position - col1.transform.position)* aux*  forcedal, ForceMode.Acceleration);
        }}}}

Проблема - в коде много GetComponent, и когда на карте больше одного rigidbody - он безбожно тормозит. Как нибудь можно этого избежать? Думается, можно найти все объекты на сцене, вычленить из них те, которые rigidbody, засунуть их в массив. Ну а что дальше? Нам же нужны столкновения, вернее пересечения границы Overlap, а что сделаешь с массивом?

Или пойти другим каким нибудь путем?

Answer 1

У каждого collider есть ссылка на rigidbody к которому он привязан Collider.attachedRigidbody. Так что нет нужды получать ссылку через GetComponent

Answer 2

В приведенном коде можно уменьшить количество вызовов GetComponent<> как минимум в 2 раза.

foreach (var col1 in coldal)
{
    Rigidbody colRB = col1.GetComponent<Rigidbody>();
    if (colRB != null)
    {
        var ux = Vector3.Distance(transform.position,  col1.transform.position);
        var aux = 0.5f / (ux); 
        colRB.AddForce((transform.position - col1.transform.position)* aux*  forcedal, ForceMode.Acceleration);
    }
}

Если не ошибаюсь, то обращение к transform через точку, это тот-же GetComponent. Тогда и больше можно ускорить, просто закешировав и все трансформы тоже.

Answer 3

Если элементов много, а магнит один(мало), то пусть объекты проверяются сами на столкновение. И только те у которых есть rigidbody(проверяй это при создании объекта) А начинают притяжение только при срабатывании события столкновения с коллайдером магнита. Причем магниту вообще не надо знать кто к нему притягивается, а вот объектам нужно знать только позицию магнита и силу притяжения.

Код (там три этапа притяжения - чем ближе тем сильнее притягивает)

зачем три этапа? Почему просто не вычислить силу притяжения из расстояния

READ ALSO
Как улучшить глобальный хук на языке C# в Microsoft Visual Studio?

Как улучшить глобальный хук на языке C# в Microsoft Visual Studio?

В форме у меня есть следующий код

375
Как программно поставить указатель в TextBox?

Как программно поставить указатель в TextBox?

Делаю что-то вроде анкеты, в которой необходимо заполнить все поляКак сделать, чтобы по нажатию кнопки, если не заполнено какое либо поле,...

515
RichTextBox в C#

RichTextBox в C#

Как сделать так, чтобы в richtextbox соблюдались все абзацы, пробелы? А не просто сплошной текст(во 2 картинке текст был отформатирован через GUI Visual...

435
Импорт ключа реестра из кода

Импорт ключа реестра из кода

Хочу текст файлов реестра перенести в код в переменные stringИмпортировать уже из переменных

313