Как мне заставить Rigidbody2D.MovePosition перемещать игровой объект в локальном пространстве?

#c# #unity3d #rotation #rigid-bodies

#c# #unity3d #вращение #жесткие тела

Вопрос:

Я нашел способ найти то, что указано в названии для Rigidbody, но не для Rigidbody2D, поскольку исходный метод предполагает использование Transform .TransformDirection() , который работает только на Vector3, в то время как Rigidbody2D.MovePosition работает на Vector2. По сути, мне нужна пуля для перемещения вперед, при этом еще две пули движутся вперед, но поворачиваются под углом 45 градусов. разница.

Как бы я это сделал?

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

1. Что вы уже пробовали?

Ответ №1:

Ваш вопрос напомнил мне об игре, которую я недавно создал для game jam, поэтому я проверил код, и, похоже, я Quaternion.AngleAxis вращал маркеры.

Я предполагаю, что у вас есть ссылка на сборку, которую вы хотите клонировать (в данном примере это projectilePrefab ), а также firePoint преобразование, представляющее позицию, из которой вы хотите стрелять, и вращение среднего снаряда.

 // Middle Bullet
GameObject mBullet = Instantiate(projectilePrefab, firePoint.position, firePoint.rotation);
var mRb = mBullet.GetComponent<Rigidbody2D>();
middleRb.AddForce(mRb.transform.up * velocity, ForceMode2D.Impulse);

// Left Bullet
GameObject lBullet = Instantiate(projectilePrefab, firePoint.position, firePoint.rotation);
// Rotate here
lBullet.transform.up = Quaternion.AngleAxis(-45, Vector3.forward) * firePoint.transform.up;
var lRb = lBullet.GetComponent<Rigidbody2D>();
lRb.AddForce(lBullet.transform.up * velocity, ForceMode2D.Impulse);

// Right Bullet
GameObject rBullet = Instantiate(projectilePrefab, firePoint.position, firePoint.rotation);
// Rotate here
rBullet.transform.up = Quaternion.AngleAxis(45, Vector3.forward) * firePoint.transform.up;
var lRb = lBullet.GetComponent<Rigidbody2D>();
lRb.AddForce(lBullet.transform.up * velocity, ForceMode2D.Impulse);
 

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

Ответ №2:

Я предполагаю, что у вас есть сборный элемент, и вы создаете экземпляры 3 маркеров одновременно, но хотите, чтобы 2 из них были под углом -45 и 45 градусов соответственно.

//bullet — это любой сборный файл, который у вас есть

 var bl = Instantiate(bullet);
var bl = Instantiate(bullet);
bl.transform.rotation = //Set rotation here to 45 deg
var bl = Instantiate(bullet);
bl.transform.rotation = //Set rotation here to -45 deg
 

Ответ №3:

Между Vector2 и Vector3 существует неявное преобразование и наоборот. Оба типа могут быть более или менее взаимозаменяемыми, которые либо создадут Vector3 where z просто 0 , либо создадут Vector2 только с использованием x and y и просто игнорируют z .

Вы можете просто передать Vector3 параметр as Rigidbody2D.MovePosition в, и он неявно преобразует его в Vector2 игнорирующий Z компонент.