- Home /
How to make a number Whole after SmoothDamp ?
Hello, so I have my points Script, and I wanted to make it count smoothly like 188 189 190 as count.
And I have a problem trying to resolve this
Please try to help me out here. :)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
public class ScoreManager : MonoBehaviour {
Animator anim;
public static int score;
private float m_smoothScore;
private float m_smoothScoreVelocity;
private int m_displayedScore = -1;
TextMeshProUGUI text;
public static bool collected;
public float min;
public float max;
public float t;
void Awake()
{
text = GetComponent<TextMeshProUGUI> ();
score = 0;
}
void Start()
{
anim = GetComponent<Animator> ();
collected = false;
}
void Update () {
//smooth score animation
m_smoothScore = Mathf.SmoothDamp(m_smoothScore,(float)score,ref m_smoothScoreVelocity, 0.2f, Mathf.Infinity, Time.deltaTime);
//display the text
int toDisplay = (int)Mathf.Round(m_smoothScore);
if (toDisplay != m_displayedScore)
{
m_displayedScore = toDisplay;
text.text = "Score: " + m_smoothScore;
}
//text.text = score + " PTS";
if (score > 0)
{
anim.SetBool ("Points", true);
}
if (collected == true) {
t = Time.time;
text.fontSize = Mathf.Lerp (min, max, t);
collected = false;
} else {
t = Time.time;
text.fontSize = Mathf.Lerp (max, min, t);
}
}
}
the cast to int suffices. you don't need that following check because a float almost never equals an int created from it (floating point precision). besides that, what exactly is the problem?
the main problem that I dont need the numbers after the comma I need just Even Numbers
Answer by Harinezumi · Feb 13, 2018 at 02:46 PM
The issue is that to display a number you have to convert it to a string, and when you convert a float into a string, even if it equals an int, it will display values after the decimal (e.g. 1.0
, or 1523.0
).
There are various approaches to solve this, but the simplest and best in this case is the following:
int toDisplay = Mathf.RoundToInt(m_smoothScore);
text.text = "Score: " + toDisplay;
Don't modify your m_smoothScore for the purpose of displaying it, because that will mess up your calculation. In general, try to separate mentally (and in the code as well) the logic and the display, always deriving the displayed values from the logical ones, and the displayed values never* modifying the logical ones (*there are always exceptions, but they are rare).
Btw, another issues you will have is that you use Time.time
for the t parameter of lerping the font size... after the first second you will always start at maximum font size, because Time.time is the time since the start of the application. Instead, use Time.deltaTime
when you are "blowing up" your score display, like this:
if (collected) { // you don't have to check if a bool variable equals true, it is implicit
t += Time.deltaTime;
}
else {
t -= Time.deltaTime;
}
text.fontSize = Mathf.Lerp(min, max, Mathf.Clamp01(t));
He actually had a duplicate post over here where i've answered the question already ^^