Как улучшить прицеливание противника, когда игрок стоит на месте, а все остальное движется? - PullRequest
0 голосов
/ 23 февраля 2019

Я делаю бесконечную игру с раннером, используя бесконечный движок, который работает так, что игрок / бегун остается на прежней позиции, в то время как элементы фона, платформы и враги идут на игрока.

Это работало нормально, пока я не ввел вражескую стрельбу, где враги находят и стреляют в игрока.Я использую следующий скрипт, который находится на префабе EnemyBullet:

void Start()
    {


        shooter = GameObject.FindObjectOfType<Player>();
        shooterPosition = shooter.transform.position;
        direction = (shooterPosition - transform.position).normalized;
    }

    // Update is called once per frame
    void Update()
    {
        transform.position += direction * speed * Time.deltaTime;
    }

Это работает, но проблема в том, что он слишком точен, как, например, когда игрок прыгает, пуля имеет тенденциюугадать его положение и выстрелил прямо в игрока.

Я знаю, что это потому, что игрок на самом деле не двигается, и это делает нацеливание игрока очень легким.

Есть ли способулучшить это?Или каким-то образом сделать это более естественным?

Спасибо

1 Ответ

0 голосов
/ 23 февраля 2019

Проблема в том, что в коде

shooter = GameObject.FindObjectOfType<Player>();
shooterPosition = shooter.transform.position;
direction = (shooterPosition - transform.position).normalized;

Поскольку shooter.transform.position - это местоположение игрока, а transform.position - это местоположение пули, тогда shooterPosition - transform.position дает вам вектор, который указывает прямо изместоположение пули на месте игрока.

Звучит так, будто вы хотите добавить некоторую неточность в пулю (поправьте меня, если я ошибаюсь).Вы можете использовать что-то вроде этого, чтобы сделать это (я предполагаю, что это 2D?)

shooter = GameObject.FindObjectOfType<Player>();
shooterPosition = shooter.transform.position;
direction = (shooterPosition - transform.position).normalized;

// Choose a random angle between 0 and maxJitter and rotate the vector that points 
// from the bullet to the player around the z-axis by that amount.  That will add
// a random amount of inaccuracy to the bullet, within limits given by maxJitter
var rotation = Quaternion.Euler(0, 0, Random.Range(-maxJitter, maxJitter));
direction = (rotation * direction).normalized;
...