как поменять направление движения объекта при столкновении с чем-либо Unity 3D и сделать этот процесс бесконечным

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

вот код врага:

private void Awake() {
    rb = GetComponent<Rigidbody>();
}


private void FixedUpdate() {
    rb.AddForce(0, 0, runSpeed * Time.deltaTime);
}

private void OnTriggerEnter(Collider other){
    GameObject colliderWith = other.gameObject;
    if (colliderWith.tag == "PushEnemy") {
        runSpeed *= -negative;
    }
    GameObject coliderWith = other.gameObject;
    if(colliderWith.tag == "NegativePushEnemy") {
        runSpeed *= 1;
    }

Проблема с передвижением решена, но этот процесс происходит 1 раз. Мне нужно чтобы объект бесконечно передвигался из стороны в сторону по z.


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

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

Во-первых, если всякие вычисления по типу движения и вращения объектов находятся в FixedUpdate(), то Time.deltaTime только всё испортит. Советую заменить rb.AddForce(0, 0, runSpeed * Time.deltaTime); на rb.AddForce(0, 0, runSpeed);, а вот если бы у тебя была функция Update(), вместо FixedUpdate(), то Time.deltaTime был бы нужен.

Во-вторых, если у куба есть RigidBody и любой Collider И у объекта, в который врезается куб тоже есть свои RigidBody и любой Collider, то нужно использовать OnCollisionEnter(Collision other), вместо OnTriggerEnter(Collider other), так как мы хотим сделать что-то, когда объекты ВРЕЗАЮТСЯ друг в друга, а не входят друг в друга (Учитывая то, что в компоненте коллайдера не поставлена галочка около "Is Trigger")

В-третьих, в твоём случае при столкновении куба об что-то надо написать всего ОДИН раз это:

GameObject colliderWith = other.gameObject;
if (colliderWith.tag == "PushEnemy") {
    runSpeed *= -1;
}

Если написать это дважды, как сделал ты, то условие будет выполняться дважды, а значит runSpeed будет умножаться на -1 дважды, а значит направление движения куба не изменится.

В общем вот (вроде) правильный код:

private void Awake()
{
    rb = GetComponent<Rigidbody>();
}
private void FixedUpdate()
{
    rb.AddForce(0, 0, runSpeed);
}
private void OnTriggerEnter(Collider other)
{
    GameObject colliderWith = other.gameObject;
    if (colliderWith.tag == "PushEnemy")
    {
        runSpeed *= -1;
    }
}
→ Ссылка