Какую часть турели я должен повернуть лицом к цели?И на какой скорости? - PullRequest
0 голосов
/ 05 июня 2018

Код, который вращает турель, довольно прост:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Rotateturret : MonoBehaviour
{
    public Transform target;
    public Transform partToRotate;
    public float turnSpeed = 10f;

    private void Update()
    {
        transform.LookAt(target);
    }
}

В этом случае цель вращается вокруг турели с фиксированной скоростью, но произвольно изменяет высоту.

Если этот скрипт RotateTurretесли я прикреплю его к детской части Turret, он будет вращаться и будет смотреть на цель.Как делать LookAt.Это скриншот части башни:

Turret

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

Скриншот части пилона:

Pylon

Мои проблемы: Какая часть башния должен вращаться?Логика гласит: «Пилон», я думаю.

Во-вторых, как рассчитать скорость вращения револьверной головки?Всегда ли она должна быть идеально обращена к цели?Или иногда, если цель движется со случайной скоростью, турель не будет все время стоять на 100%?Какова логика в этом случае?Просто использовать LookAt недостаточно.И я не использую физику, но это еще одна проблема, я думаю.Если и турель, и цель будут использовать физику, но пока не уверены, как сделать логику турели (или я должен назвать ее AI).

Для тестирования я тоже попробовал этот скрипт:

public class Rotateturret : MonoBehaviour
{
    public Transform target;
    public Transform partToRotate;
    public float turnSpeed = 10f;

    private void Update()
    {
        Debug.DrawRay(transform.position, transform.forward, Color.green, 1000);
        Vector3 dir = target.position - transform.position;
        Quaternion lookRotation = Quaternion.LookRotation(dir);
        Vector3 rotation = Quaternion.Lerp(partToRotate.rotation, lookRotation, Time.deltaTime * turnSpeed).eulerAngles;
        partToRotate.rotation = Quaternion.Euler(0f, rotation.y, 0f);
    }
}

И снова, если я поверну Турель, она будет более точной, но если пилон, то она будет позади цели.А кто сказал, что скорость вращения турели должна быть 10 и 20 или 50 или 1?Думаю, в этом сценарии нет особой логики.

Другое дело, что в будущем я захочу также повернуть Пистолет, чтобы стрелять пулями.Так что скорострельность и когда начинать стрельбу, это еще одна проблема, может быть, это будет другой вопрос, но я думаю, стрельба пулями также имеет отношение к логике вращения башни.

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Во-первых, существует перегрузка LookRotation, которая принимает ось в качестве второго параметра, поэтому, если вы попробуете

 Quaternion lookRotation = Quaternion.LookRotation(dir,Vector3.up);

, вращение всегда будет вокруг вертикальной оси.Таким образом, вы можете разделить движение на отдельную ось, как если бы вы использовали механическое устройство (т. Е. Пилон вращается только вокруг вертикальной оси)

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

Вы можете, например, взять расстояние между турелью и целью, разделить скорость пули на скорость цели и взять target.transform.forward, умноженное на это соотношение и расстояние (это из головы, но вы поняли).

Немного более интересная альтернатива - воспользоваться возможностью узнать о ПИД-контроллерах, турели являются фантастическим примером того, сколько вы можете сделать с очень простым контроллером.,

PID означает Пропорциональный, Интегральный и Производный, и вы вычисляете выходную мощность вашего привода (т.е. силу, которая управляет вашим вращением) на основе этих трех способов оценки значений.В наиболее упрощенной форме это работает следующим образом: пропорционально - это ваша прямая дельта - какой угол наклона от вашего целевого угла (или от целевой передней точки).Чем вы усредняете этот параметр (т. Е. Перетягиваете текущее значение к цели или используете скользящее среднее) на значительную величину, это ваша неотъемлемая часть - он будет следовать цели намного медленнее.Теперь, если вы вычтите свое усредненное (интегрированное) значение из вашего текущего (пропорционального) значения, вы получите что-то, что представляет ваше изменение, это можно использовать в качестве деивативного компонента.Теперь эта последняя часть - то, что заставляет поток реагировать, когда цель меняет траекторию, вы можете сделать выходной сигнал превышающим изменение или настроить его несколькими другими способами

0 голосов
/ 05 июня 2018

Во-первых, обратите внимание, что на скриншоте Pylon игровой объект forward direction (синяя стрелка) перпендикулярен направлению ствола башни.Таким образом, прикрепление вашего скрипта к этому игровому объекту не приведет к желаемому поведению.

Когда дело доходит до реализации движения башни, это сильно зависит от контекста вашей игры.

Например, если турель будет использоваться в игре Tower Defense , в которой она никогда не должна промахиваться, то обычно анимация вращения и стрельбы турели должна быть просто эффект ,Фактический урон, нанесенный цели, будет нанесен напрямую через скрипт (например, поиск жизнеспособной цели в радиусе действия и отправка события onShoot).В этом случае transform.lookAt() достаточно хорош, поскольку он производит разумный визуальный эффект.

Однако, если ваша турель будет использоваться в игре First Player Shooter , ожидайтечто его вращение будет контролироваться игроком (либо с помощью физики преобразования или твердого тела).Должна ли турель наносить урон противнику, зависит от того, поражает ли снаряд (имитируемый с помощью физика с твердым телом и коллайдером) противника или нет.В этом случае вы должны ограничить максимальную скорость вращения вашей башни.Уровень порога зависит от того, насколько реалистичным он будет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...