Как создать полет слегка отклоненный от цели выстрел из оружия AI от его цели

137
11 октября 2019, 15:20

Полет пули к цели с практически одинаковой скоростью осуществляется с помощью данного скрипта:

public class RedBullet : MonoBehaviour
{
public Vector3 direction;
public Vector3 step;
public float speed;
public float katetX;
public float katetY;
public float gipotenuza;
public float bulletSpeed = 20f;
void Start()
{
    direction = GameObject.FindGameObjectWithTag("Player").transform.position;
    katetX = direction.x - transform.position.x;
    katetY = direction.y - transform.position.y;
    gipotenuza = Mathf.Sqrt(Mathf.Pow(katetX, 2) + Mathf.Pow(katetY, 2));
    step = new Vector3(katetX/(gipotenuza * bulletSpeed),katetY/(gipotenuza * bulletSpeed),1);
}
void Update()
{
    transform.position += step;
}
private void OnTriggerEnter2D(Collider2D collision)
{
    if (collision.gameObject.CompareTag("BulletWall"))
    {
        Destroy(gameObject);
        // play destroy anim
    }
}
}

Возможно, можно сделать полет снаряда проще, например с помощью Raycast2D, если это правда, то мне хотелось бы узнать как. В любом случае мне нужно, чтобы снаряды летели не только прямо в объект с тегом player, но и на n градусов правее и левее от него, как это сделать?

Answer 1

На самом первом шаге определяем направление оружие-цель

midAngle = atan2(direction.y - transform.position.y, direction.x - transform.position.x);

и производим, например, отклонение этого угла с нормальным распределением

devAngle = randG(midAngle, stdDev);

где randG даёт гауссово распределение с заданным средним и среднеквадратичным отклонением. Например, вот или вот- но, может, в мат библиотеках шарпа что-то готовое появилось с тех пор.

Теперь перерассчитаем целевую позицию с новым углом (эквивалентно ошибке прицеливания),

direction.x = Дистанция * cos(devAngle)
direction.y = Дистанция * sin(devAngle)

и в дальнейшем для расчёта шага будем использовать смещенную позицию

READ ALSO
Как переключать состояние в методе C# .NET

Как переключать состояние в методе C# .NET

Реализую простой фасад для сокрытия более низкоуровневых решенийЕсть модель данных:

118
Не работает асинхронный вызов метода C#

Не работает асинхронный вызов метода C#

Имеется метод, который внутри себя запускает дважды другой метод, но второй раз асинхронноИ вот внутри Task не срабатывает SaveToDB()

141
накопление вызовов корутин

накопление вызовов корутин

Есть такая реализация: переходы три перехода между играми, когда мы перешли, срабатывает некий метод с корутиной в 3 секунды, но если очень...

118
Реализовать страницы в winforms

Реализовать страницы в winforms

В окно из бд загружаются данныеНо нужно сделать чтобы загрузилось не все сразу

117