Нужна помощь в перемещении сферы в параболе как части симулятора снаряда?

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

public class SphereJump : MonoBehaviour{

    public float gravity = 9.8f;
    public float InitialSpeed = 10.0f;
    public float LaunchAngle = 45.0f;

    public Transform Sphere;

    void Start () {

        float InitialX = Mathf.Sin(LaunchAngle) * InitialSpeed;
        float InitialY = Mathf.Cos(LaunchAngle) * InitialSpeed;

        float Range = Mathf.Sin(2*LaunchAngle)*Mathf.Pow(InitialSpeed,2)/gravity;

        float MaxHeight = Mathf.Sin(LaunchAngle) * Mathf.Pow(InitialSpeed, 2) / 2 * gravity;

        float FlightTime = Range / InitialX;

        float ElapsedTime = 0;

        while (ElapsedTime < FlightTime)
        {
            float NewPositionX = transform.position.z+InitialX*ElapsedTime;
            float NewPositionY = transform.position.y +InitialY -gravity / 2*ElapsedTime;

            Sphere.Translate(0f, NewPositionY, NewPositionX);

            ElapsedTime += Time.deltaTime;
        }
    }

}

Будучи совершенно новым для Unity, в моей голове это должно работать математически, однако, когда я запускаю игру, либо ничего не происходит, либо объект сферы исчезает. В начале его позиция (1, 0,5, 1) - что всего на 0,5 выше плоскости, на которой он сидит - и, насколько я знаю, скрипт правильно прикреплен. Также появляется предупреждение "Из-за ограничений точности с плавающей запятой...". Поможет ли использование Vector3? Я полностью перепутал сценарий?

1 ответ

Решение

Это должно идти в Update() Вы можете добавить этот метод самостоятельно и переместить код.

Что касается вашего второго вопроса:

Вектор 3 - это система координат для положения точки в трехмерном пространстве, X,Y и Z! вам понадобится координата z для обозначения глубины, или единица не знает, где разместить ваш объект

так:

Vector3 newPos= new Vector3(x,y,z);

z может оставаться постоянным, если вы не хотите, чтобы расстояние от камеры менялось.

Vector3 newPos= new Vector3(transform.position.z+InitialX*ElapsedTime,transform.position.y +InitialY -gravity / 2*ElapsedTime,z);

тем не мение,

в единстве есть компонент, называемый твердым телом. прикрепление этого к вашему объекту добавит гравитации и физики.

затем вы можете получить в теле сценарий:

RigidBody body = this.GameObject.GetComponent<RigidBody>();

тогда вы можете сделать:

body.AddForce(position,direction,force);

или же body.gravity=3;

или несколько других корректировок, чтобы справиться с вашей физической задачей.

Другие вопросы по тегам