- Home /
RigidBody2D.velocity inconsistant
Here is the simple test.
My player (the white square) moves on a horizontal axis to the left for this test. Here is the code for that
horizontalMove = Input.GetAxisRaw("Horizontal");
m_Rigidbody2D.velocity = new Vector2(horizontalMove * speed * Time.deltaTime, m_Rigidbody2D.velocity.y);
Debug.Log(m_Rigidbody2D.velocity.x * Time.deltaTime);
As you can see in the console I have 273 different velocity values for the ~4 seconds of left movement and can't get a consistent time.
Here is the timer script also. The timer start code is in the movement script, the same one as above
if (m_Rigidbody2D.velocity != Vector2.zero) //timer start
timerStart = true;
timer script:
public class timer : MonoBehaviour
{
public Text timerText;
private float startTime;
string seconds;
public bool finish;
private float time;
private float finishComparable;
public prefInit scores;
public Movement player;
private bool activeTimer;
void Start()
{
startTime = Time.time; //time since beginning of this frame
}
void Update()
{
if (finish) //------------check if current time is lower than playerpref time
return;
else if (!finish && activeTimer)
{
string minutes = ((int)time / 60).ToString(); //update minutes for time
int minutes_int = ((int)time / 60);
float seconds1 = (time % 60); //temporary time variable for easy comparison
if (seconds1 < 10)
{
seconds = "0" + seconds1.ToString("f3"); //update if seconds is less than 10 for the extra 0
}
else
{
seconds = seconds1.ToString("f3"); //updates seconds for time
}
time += Time.deltaTime; //sets local time value to ingame time
finishComparable = (minutes_int * 60) + seconds1;
timerText.text = minutes + ":" + seconds; //sets screen timer text to ingame time
}
else if (player.timerStart)
{
activeTimer = true;
}
}
public void Finish()
{
finish = true;
PlayerPrefs.SetFloat("composite", (PlayerPrefs.GetFloat("composite") + finishComparable));
Debug.Log(PlayerPrefs.GetFloat("composite"));
if (PlayerPrefs.GetInt("sceneIndex") == 2)
PlayerPrefs.SetFloat("level1", 1);
else if (PlayerPrefs.GetInt("sceneIndex") == 3)
PlayerPrefs.SetFloat("level2", 1);
else if (PlayerPrefs.GetInt("sceneIndex") == 4)
PlayerPrefs.SetFloat("level3", 1);
else if (PlayerPrefs.GetInt("sceneIndex") == 5)
PlayerPrefs.SetFloat("level4", 1);
Debug.Log(finishComparable);
Composite();
}
private void Composite()
{
bool lvl1 = (PlayerPrefs.GetInt("level1") != 0);
bool lvl2 = (PlayerPrefs.GetInt("level2") != 0);
bool lvl3 = (PlayerPrefs.GetInt("level3") != 0);
if (lvl1 && lvl2 && lvl3)
scores.UpdateScore();
}
}
I understand that this script is poorly written; this is my first game
Answer by Casiell · Jan 29, 2020 at 02:19 PM
You will never get exactly the same values due to floating point precision
Time.DeltaTime is not a constant, it changes from frame to frame, so when you are multiplying something by it, you will not get the same values every frame
You may have things like drag, changing your velocity
That's mostly it I think