我目前正在实施玩家在Unity3D中控制的可移动重力井。玩家还可以在重力上添加偏移矢量,这将影响其运动,因此它不会始终朝向重心的中心。利用这些力,我可以确定受重力井影响的每个实体的速度和轨迹;但是,attributes.trajectory
会不断累加,直到达到+/-无穷大并使游戏崩溃。日志显示gravityTrajectory
和gravityOffset
处于正确的向量,崩溃时的速度约为30个单位。日志显示attributes.trajectory
未正确归一化并将保持其幅度。我的问题是为什么没有attributes.trajectory.Normalize()
正确地规范化向量?
我认为对具有无限浮点数的向量进行标准化可能会导致问题,但在此之前它应该已经规范化了。任何试图调试此问题的帮助表示赞赏。
void FixedUpdate()
{
float gravityForce;
float offsetForce;
// calculate forces to apply.
Vector2 gravityTrajectory = FindGravityVector(out gravityForce);
Vector2 gravityOffset = FindGravityOffset(out offsetForce);
// get new velocity from forces.
speed += (gravityForce + offsetForce) * Time.deltaTime;
// add current trajectory to current force vectors.
attributes.trajectory += (gravityTrajectory + gravityOffset);
attributes.trajectory.Normalize();
// scale the trajectory by the velocity
attributes.trajectory *= speed;
// update position based on velocity
rigidbody2D.MovePosition((transform.position + (Vector3)(attributes.trajectory)) * Time.deltaTime);
}
编辑1:
以下是找到重力的方法:
private Vector2 FindGravityVector(out float gravityForce)
{
Vector2 gravityTrajectory = (Vector2)(orb.transform.position - transform.position);
gravityForce = MinionManager.Instance.gravity * orb.GetComponent<Orb>().Mass / Mathf.Pow(gravityTrajectory.magnitude, 2);
return gravityTrajectory;
}
以下是崩溃时每个属性的内容(根据Debug.Log):
attributes.trajectory之前:(3419851000000000000.0,762847100000000000.0)
gravityTrajectory:(64.3,-28.1)
gravityOffset:(0.0,0.0)
gravityForce:0.02031127
offsetForce:0
速度:261.1045attributes.trajectory after:(892938500000000000000.0,199182800000000000000.0)