Нужна помощь в перемещении сферы в параболе как части симулятора снаряда?
Привет! В настоящее время я работаю над школьным проектом по информатике, для которого я решил создать простой симулятор снаряда, в котором пользователь просто указывает начальную скорость запуска, угол запуска и гравитацию. До сих пор я пытался создать сценарий, который использует эти значения для расчета шаблона траектории и изменения положения 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;
или несколько других корректировок, чтобы справиться с вашей физической задачей.