Intereting Posts
Оберните каждый метод в try-catch или определенную часть кода C # Language Design: группа методов внутри оператора `is` Winforms Arabic Введите текстовое поле лить дочерний объект как родителя Asp.Net MVC против Castle MonoRail Как получить объект System.Drawing.Image из изображения, действие сборки которого обозначено как «Ресурс»? Чтение элементов ячейки из сетки данных в SysListView32 другого приложения с использованием C # linq как выбрать родителя с дочерней коллекцией, которая содержит один или многие из массива (или списка) значений Почему нам нужно установить размер Min pool в ConnectionString KeyEventArgs.Handled против KeyEventArgs.SupressKeyPress Удалите повторяющиеся внутренние списки из списка списка в c # Реализация инициализатора коллекции для моей оболочки List в C # Сопоставление проблемных отношений в Entity Framework с использованием кода Owin Bearer Token Authentication + Авторизованный controller Создание элементов управления динамически

Как сделать ход снаряда дугой

У меня есть пушка, которая стреляет пhive в параболической дуге. Прямо сейчас, когда я стреляю, пуля остается в том же росте, что и в том случае, когда она стреляла из пушки.

анимация

Как я могу сделать так, чтобы rotation пули следовало за дугой, когда она путешествовала по airу?

Я попробовал следующее как скрипт, запущенный на пуле

Иллюстрация 1

public class PointingBehaviour:MonoBehaviour { private Rigidbody rb; private void Awake() { rb = GetComponent(); } public void Update() { transform.up = rb.velocity; } } 

И это работает довольно хорошо. но я вижу небольшое мерцание на первом фрейме, в котором объект существует (я думаю, это потому, что в этот момент скорость все еще равна 0), и объект бесконтрольно вращается, когда он попадает на землю.

анимация

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

 public class BulletController : MonoBehaviour { private Rigidbody _rb; private bool _followArc; private bool _firstFrame; private void Start() { _rb = GetComponent(); _firstFrame = true; _followArc = true; } public void LateUpdate() { if (_followArc && !_firstFrame) transform.up = _rb.velocity; _firstFrame = false; } public void OnCollisionEnter(Collision collision) { _followArc = false; } } 

Но если мне ударит что-то в airе, он перестает следовать дуге и просто делает свободную волну, пока не приземлится. Что такое «правильный» способ сделать то, что я хочу сделать?


Потому что люди хотели его увидеть, вот код для порождения пули.

 public class TankController : MonoBehaviour { private Transform _barrelPivot; private Transform _bulletSpawn; public GameObject Bullet; public float FirePower; public float RotationSpeed; public float TiltSpeed; private void Start() { _barrelPivot = GetComponentsInChildren().First(x => x.CompareTag("BarrelPivotPoint")); _bulletSpawn = GetComponentsInChildren().First(x => x.CompareTag("BulletSpawn")); } private void Update() { if (Input.GetKeyDown(KeyCode.Space)) { FireCannon(); } //(SNIP) Handle turning left and right and pivoting up and down. } private void FireCannon() { var newBullet = SpawnBullet(); var rb = newBullet.GetComponent(); rb.AddForce(_bulletSpawn.up * FirePower, ForceMode.Impulse); } private GameObject SpawnBullet() { var newBullet = (GameObject) Instantiate(Bullet, _bulletSpawn.position, _bulletSpawn.rotation); newBullet.transform.localScale = Bullet.transform.localScale; return newBullet; } } 

    Я верю, что вы говорите, – ваш сценарий выставки1 отлично работает.

    Если вы думаете об этом, все, что вам нужно сделать, это отключить это поведение, когда захотите.

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

    Очень легко отключить MonoBehaviour , как вы знаете, просто enabled = false;

    Итак, у вас есть сценарий где-то вроде Bullet или, возможно, BulletBoss

    Там у вас будет переменная частная PointingBehaviour pb и вы будете просто pb.enabled = false

    (Я не могу сказать вам «когда» вы хотите это сделать, это зависит от вашей игры .. так что это может быть что-то вроде «когда высота меньше, чем бла» или «когда я что-то ударяю» … возможно, OnCollisionEnter .)

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

    Прекрасная очень легкая вещь, когда вы пишете поведение, указывающее на такой снаряд, старайтесь осторожно его касатьться касательной. Результат потрясающий. Затем, возможно, добавьте некоторые случайные «вигглы», которые очень похожи на бомбы. Удивительно, как пользователь может видеть такие вещи, только несколько кадров. (Следующий шаг – настоящая физика в airе, я думаю!)

    Обратите внимание, что, безусловно, PointingBehaviour должен быть просто собственным скриптом. Вы должны полностью придерживаться поведения.


    Что LateUpdate упомянутого LateUpdate , его никогда не нужно использовать.

    Unity предлагает систему исполнения сценария (см. Опцию меню «Настройки»), если вы действительно хотите заказать в рамках фрейма. Но о единственной причине сделать это, возможно, по какой-то причине экспериментирования.

    Это скорее похоже на «использование глобального» – для этого просто нет причин. Как и в случае с любым кодом, если вам нужно что-то делать в определенном порядке, просто позвоните по порядку.