处理浮点精度
Dealing with floating point precision
我正在 unity 中创建游戏,运行 在将速度重置为 0 时遇到问题。
游戏使用多个油门级别:-2 -1 0 1 2。当设置为油门级别时,对象将加速到设定的速度。这行得通,但是当我将其重置为 0 时,即使设置了 0,速度也会将其自身设置为 0.0999999。
我该如何解决这个问题?
using UnityEngine;
using System.Collections;
using System;
public class Script_Control : MonoBehaviour {
public static float speedLvL;
public static float speed;
public static float health;
public static float manoverablity;
public static float tarSpeed;
public static float curSpeed;
// Use this for initialization
void Start () {
//setting per ship stats
speedLvL = 0F;
speed = .25F;
health = 25F;
manoverablity = .25F;
//General Stats
tarSpeed = 0F;
curSpeed = 0F;
}
// FixedUpdate is called once per Time
void FixedUpdate () {
Debug.Log(curSpeed);
//setting speed
if (speedLvL == 0F){
tarSpeed = 0.00000F;
}
if (speedLvL == 1F) {
tarSpeed = speed/2F;
}
if (speedLvL == 2F) {
tarSpeed = speed;
}
if (speedLvL == -1F) {
tarSpeed = -speed/5F;
}
if (speedLvL == -2F) {
tarSpeed = -speed/2.5F;
}
if (curSpeed < tarSpeed){
curSpeed += .1F;
}
if (curSpeed > tarSpeed){
curSpeed -= .1F;
}
transform.Translate(curSpeed, 0, 0);
}
void Update(){
if (Input.GetAxis("Throttle") > 0 && speedLvL <= 1 && speedLvL >= -2){
speedLvL = speedLvL+1;
DateTime t = DateTime.Now;
DateTime tf = DateTime.Now.AddSeconds(.25);
while (t < tf)
{
t = DateTime.Now;
}
}
if (Input.GetAxis("Throttle") < 0 && speedLvL <= 2 && speedLvL >= -1){
speedLvL = speedLvL-1;
DateTime t = DateTime.Now;
DateTime tf = DateTime.Now.AddSeconds(.25);
while (t < tf)
{
t = DateTime.Now;
}
}
if (Input.GetAxis("Stearing") < 0){
transform.Rotate(Vector3.forward* Time.deltaTime, manoverablity );
}
if (Input.GetAxis("Stearing") > 0){
transform.Rotate(Vector3.forward* Time.deltaTime, -manoverablity);
}
}
}
`
您无法与浮点值(float
或 double
)进行精确比较,因为它们对其表示的值的精度有固有的限制。
当您需要比较浮点值时,您必须始终在要比较的目标值周围使用一个范围(高于和低于)- 这样您就可以解决浮点存储的不精确性.
阅读此问题/答案了解更多详情:Is it safe to check floating point values for equality to 0?
在 FixedUpdate 函数中,您设置了将速度重置为 0 的 if 语句,
if (speedLvL == 0F){
tarSpeed = 0.00000F;
}
然而,在同一功能中,您可以在以下功能中加速或减速船舶。
if (curSpeed < tarSpeed){
curSpeed += .1F;
}
在我看来,当你将飞船重置为 0 时,它会在停止调整之前添加 .1F
您可能需要将该功能拆分为两个独立的部分!
希望对您有所帮助
我正在 unity 中创建游戏,运行 在将速度重置为 0 时遇到问题。
游戏使用多个油门级别:-2 -1 0 1 2。当设置为油门级别时,对象将加速到设定的速度。这行得通,但是当我将其重置为 0 时,即使设置了 0,速度也会将其自身设置为 0.0999999。
我该如何解决这个问题?
using UnityEngine;
using System.Collections;
using System;
public class Script_Control : MonoBehaviour {
public static float speedLvL;
public static float speed;
public static float health;
public static float manoverablity;
public static float tarSpeed;
public static float curSpeed;
// Use this for initialization
void Start () {
//setting per ship stats
speedLvL = 0F;
speed = .25F;
health = 25F;
manoverablity = .25F;
//General Stats
tarSpeed = 0F;
curSpeed = 0F;
}
// FixedUpdate is called once per Time
void FixedUpdate () {
Debug.Log(curSpeed);
//setting speed
if (speedLvL == 0F){
tarSpeed = 0.00000F;
}
if (speedLvL == 1F) {
tarSpeed = speed/2F;
}
if (speedLvL == 2F) {
tarSpeed = speed;
}
if (speedLvL == -1F) {
tarSpeed = -speed/5F;
}
if (speedLvL == -2F) {
tarSpeed = -speed/2.5F;
}
if (curSpeed < tarSpeed){
curSpeed += .1F;
}
if (curSpeed > tarSpeed){
curSpeed -= .1F;
}
transform.Translate(curSpeed, 0, 0);
}
void Update(){
if (Input.GetAxis("Throttle") > 0 && speedLvL <= 1 && speedLvL >= -2){
speedLvL = speedLvL+1;
DateTime t = DateTime.Now;
DateTime tf = DateTime.Now.AddSeconds(.25);
while (t < tf)
{
t = DateTime.Now;
}
}
if (Input.GetAxis("Throttle") < 0 && speedLvL <= 2 && speedLvL >= -1){
speedLvL = speedLvL-1;
DateTime t = DateTime.Now;
DateTime tf = DateTime.Now.AddSeconds(.25);
while (t < tf)
{
t = DateTime.Now;
}
}
if (Input.GetAxis("Stearing") < 0){
transform.Rotate(Vector3.forward* Time.deltaTime, manoverablity );
}
if (Input.GetAxis("Stearing") > 0){
transform.Rotate(Vector3.forward* Time.deltaTime, -manoverablity);
}
}
}
`
您无法与浮点值(float
或 double
)进行精确比较,因为它们对其表示的值的精度有固有的限制。
当您需要比较浮点值时,您必须始终在要比较的目标值周围使用一个范围(高于和低于)- 这样您就可以解决浮点存储的不精确性.
阅读此问题/答案了解更多详情:Is it safe to check floating point values for equality to 0?
在 FixedUpdate 函数中,您设置了将速度重置为 0 的 if 语句,
if (speedLvL == 0F){
tarSpeed = 0.00000F;
}
然而,在同一功能中,您可以在以下功能中加速或减速船舶。
if (curSpeed < tarSpeed){
curSpeed += .1F;
}
在我看来,当你将飞船重置为 0 时,它会在停止调整之前添加 .1F
您可能需要将该功能拆分为两个独立的部分!
希望对您有所帮助