как поменять направление движения объекта при столкновении с чем-либо 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 шт):
Во-первых, если всякие вычисления по типу движения и вращения объектов находятся в 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;
}
}