Единство запускает твердое тело под углом - PullRequest
0 голосов
/ 17 мая 2018

Я хочу запустить мой Arrow GameObject под углом 30˚ и скоростью 30 м / с. В сценарии я добавляю жесткое тело к этой Стрелке . Однако я также пытаюсь запустить эту стрелку в направлении игрока (от врага) в 3D-сцене . Я не могу понять, как подключить эти переменные, чтобы получить Vector3 для "arrowRigidbody.velocity"

//THE VARIABLES REFERENCED ABOVE APPEAR LIKE SO:
Rigidbody arrowRigidbody;
Transform playerTransform;
Transform enemyTransform;
float angle = 30f;
float velocity = 30f;

//How do I use these variables in order to shoot the projectile at a speed
//of 30 m/s and an angle of 30˚ in the direction of the player in 3D scene
arrowRigidbody.velocity = /*????*/;

Спасибо за ваше время и терпение :)

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

При условии, что вы стреляете только вперед, вы можете использовать упрощенное:

    var targetDirn = transform.forward;
    var elevationAxis = transform.right;

    var releaseAngle = 30f;
    var releaseSpeed = 30f;

    var releaseVector = Quaternion.AngleAxis(releaseAngle, elevationAxis) * targetDirn;
    arrowRigidbody.velocity = releaseVector * releaseSpeed;

Если вам нужно стрелять вне оси, вы можете заменить первые две строчки:

    var targetDirn = (target.transform.position - transform.position).normalized;
    var elevationAxis = Vector3.Cross(targetDirn, Vector3.up);
0 голосов
/ 17 мая 2018

Используя некоторую геометрию, зная, что вектор будет иметь величину (m), равную 1, y-компонент будет равен m / 2, а x-компонент будет равен m * (3 ^ .5) / 2. Который сделает ваше окончательное значение:

arrowRigidbody.velocity = new Vector2(Mathf.Pow(3, .5f)/2, 1/2) * velocity;

Для меняющегося угла вы знаете, что компонент x будет m * cos (угол), а компонент y будет m * sin (угол), оставляя вас с:

float velx = velocity * Mathf.Cos(angle * Mathf.Deg2Rad);
float vely = velocity * Mathf.Sin(angle * Mathf.Deg2Rad);
arrowRigidbody.velocity = new Vector2(velx, vely);
...