Я не могу понять, почему AddForce не работает в FixedUpdate. Хотя он работает в обычном обновлении

#c# #unity3d

Вопрос:

Вот мой код, он должен заставить врага двигаться назад, и когда он попадает в коробчатый коллайдер, он уничтожает его и добавляет очко к счету.

 using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class forward : MonoBehaviour
{
    float score;
    public Text text;

    private void FixedUpdate()
    {
        GetComponent<Rigidbody>().AddForce(Vector3.back * 5);
        text.text = "score: "   score;
        print("test");
    }
    private void OnCollisionEnter(Collision collision)
    {
        if(collision.gameObject.tag == "Finish")
        {
           Destroy(gameObject);
            score = score =  1;
        }
    }


}
 

Комментарии:

1. Распечатывается ли «тест»? Если нет, FixedUpdate() то вообще не вызывается.

2. Просто несвязанное примечание: Интересно, что класс, называемый » вперед «, постоянно добавляет силу, указывающую назад ^^

Ответ №1:

Я точно не знаю, почему это происходит, но GetComponent не должен вызываться в обновлении. Кроме того, я думаю, что вы не должны иметь приватности перед FixedUpdate. В этом может быть проблема. Это должно выглядеть так.

 using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class forward : MonoBehaviour
{
    float score;
    public Text text;
    private Rigidbody rb;

    void Start(){
        rb = this.GetComponent<Rigidbody>();
    }

    void FixedUpdate()
    {
        rb.AddForce(Vector3.back * 5);
        text.text = "score: "   score;
        print("test");
    }
    private void OnCollisionEnter(Collision collision)
    {
        if(collision.gameObject.tag == "Finish")
        {
           Destroy(gameObject);
            score = score =  1;
        }
    }


}
 

Комментарии:

1. что это значит. означать

2. «это» может быть излишним, но в основном это то же самое, если вы его удалите. Обычно вы говорите gameobject.GetComponent<…> (), и поэтому вы можете указать игровой объект как «это», который является просто игровым объектом, к которому прикреплен этот скрипт.

3. Я согласен с Калебом Садлером в том, что он не использовал GetComponent в обновлении, это была (вероятно, все еще остается) дорогостоящая операция. Но этот ответ не решит вашу проблему (по крайней мере, я почти уверен).

4. поможет ли частный void FixedUpdate аннулировать FixedUpdate?

5. @CalebSadler нет! Это не имеет абсолютно никакого значения. Без определенной доступности во c# всем, что находится внутри класса private , в любом случае по умолчанию. Вы можете создавать эти методы сообщений private public или protected сколько угодно .. это не имеет никакого значения