作为射弹模拟器的一部分,需要帮助使球体沿抛物线运动吗?
Need help making a sphere move in parabola as part of a projectile simulator?
您好,我目前正在从事一个学校计算机科学项目,我决定为此制作一个简单的射弹模拟器,用户只需提供初始发射速度、发射角度和重力。
到目前为止,我已经尝试制作一个脚本,该脚本使用这些值来计算轨迹模式并随时间改变球体在平面上的 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 - 据我所知,脚本已正确附加。还会出现一个警告说 "Due to floating point precision limitations..."。使用 Vector3 会有帮助吗?我是否完全混淆了脚本?
这应该放在 Update()
中,您可以自己添加该方法并移动代码。
关于你的第二个问题:
Vector 3是3d中一个点位置的坐标系space,X,Y,Z!你需要一个 z 坐标来表示深度,否则 unity 不知道把你的对象放在哪里
所以:
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);
然而,
unity 中有一个叫做刚体的组件。将它附加到您的对象会增加重力和物理。
然后就可以在脚本中得到刚体了:
RigidBody body = this.GameObject.GetComponent<RigidBody>();
那么你可以这样做:
body.AddForce(position,direction,force);
或body.gravity=3;
或其他几项调整以融入您的物理挑战。
您好,我目前正在从事一个学校计算机科学项目,我决定为此制作一个简单的射弹模拟器,用户只需提供初始发射速度、发射角度和重力。 到目前为止,我已经尝试制作一个脚本,该脚本使用这些值来计算轨迹模式并随时间改变球体在平面上的 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 - 据我所知,脚本已正确附加。还会出现一个警告说 "Due to floating point precision limitations..."。使用 Vector3 会有帮助吗?我是否完全混淆了脚本?
这应该放在 Update()
中,您可以自己添加该方法并移动代码。
关于你的第二个问题:
Vector 3是3d中一个点位置的坐标系space,X,Y,Z!你需要一个 z 坐标来表示深度,否则 unity 不知道把你的对象放在哪里
所以:
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);
然而,
unity 中有一个叫做刚体的组件。将它附加到您的对象会增加重力和物理。
然后就可以在脚本中得到刚体了:
RigidBody body = this.GameObject.GetComponent<RigidBody>();
那么你可以这样做:
body.AddForce(position,direction,force);
或body.gravity=3;
或其他几项调整以融入您的物理挑战。