[์ค๋ฅ ํด๊ฒฐ] Mathf.SmoothDamp ๊ฒฐ๊ณผ๊ฐ์ NaN์ด ์ค๋ ๋ฌธ์
๐ถ UGUI Scroll ํจํค์ง๋ฅผ ๊ฐ์ ธ์์ ์ฐ๊ณ ์์๋๋ฐ, ๊ทธ ๋ด๋ถ ์ฝ๋์ ๋ฌธ์ ๊ฐ ์์ด. ์์ฑ์์๊ฒ ๋ฌธ์ํด๋ ์ฌํ์ด ์ ๋ ๊ฒ ๊ฐ๊ณ , ๊ทธ๋์ ๊น๋ํ๊ฒ ๋ต์ ํด์ค ์ ์์ ๊ฑฐ ๊ฐ์ง ์์.
๐พ ๋ฌด์จ ์ํฉ์ธ๋ฐ?
๐ถ ์คํฌ๋กค ์๋๋ฅผ ๊ณ์ฐํ๊ธฐ ์ํด์ Mathf.SmoothDamp ํจ์๋ฅผ ์ฌ์ฉํ๊ณ ์๋๋ฐ, ๋ฆฌํด๊ฐ์ NaN์ด ์์ ๊ณจ์น๊ฐ ์ํ.
๐พ ์ฐพ์๋ณด๋ 0์ผ๋ก ๋๋์ ์ ํ๊ฒ ๋ ๊ฒฝ์ฐ ๋ฐ์ํ ์ ์๋. ์ด๋์ 0์ด ๋ค์ด์ค๊ณ ์๋ ๊ฑฐ์ผ?
๐ถ ์ผ๋จ ์ 0์ด ์ค๋ ์ง๋ฅผ ๋ชจ๋ฅด๊ฒ ๋๋ฐ, 0์ด ์ค๋ ๊ณณ์ ์ฐพ๋๋ค๊ณ ํด๋ ์ด๋ค ์ด์ ์์๋ ๋ ๋ค๋ฅธ ๋ฐ์ 0์ด ์ฌ ์ ์์ ๊ฒ ๊ฐ์. ํน์๋ 0์ด ์ค๊ฒ ๋ ๊ฒฝ์ฐ์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ํ๋ ๊ฒ ์ข๊ฒ ์ด.
๐พ ๊ทธ๋๋ ์ผ๋จ ์ 0์ด ์ค๋ ๊ฑด์ง ํ๋ฒ ์๊ฐํด๋ณด์.
๐ถ ์ข์.
(๋ก๊ทธ ์ฐ์ด๋ณด๋ ์ค...)
๐ถ ๋งค ํ๋ ์ ๋ก๊ทธ๋ฅผ ์ฐ์ด๋ดค๋๋ฐ, NaN ๊ฐ์ด ๋ฆฌํด๋๊ธฐ ์ง์ ์ Time.TimeScale์ด 0์ด์ผ.
๐พ ์ฐ์ฐ์ด๋ผ๋ฉด ๋๋ผ์ด ์ฐ์ฐ์ธ๊ฑธ? ์ฐ๊ด๋์ด ์์ ๊ฐ๋ฅ์ฑ์ด ์๊ฒ ์ด.
๐ถ SmoothDamp ์ฐ์ฐ์ผ๋ก ๊ฐ๊ธฐ ์ ์ TimeScale = 1๋ก ์ธํ ์ ํ๋ฒ ํด์ค๋ณด์.
(ํ ์คํธ ์ค...)
๐ถ ๊ทธ๋๋ ์ ๋๋ค.
๐พ ํ .. ๊ทธ๋ฌ๊ณ ๋ณด๋ Time.TimeScale์ 0์ผ๋ก ๋ง๋๋ ๋ถ๋ถ์ด ์ด๋ ๊ฒ์ ๋ก์ง์์ ์์์? ์ง์ง ์ ๊ธฐํ๊ณ ์ด์ํ ์ฐ์ฐ์ด๋ค. ๊ทธ๋ผ ๊ฒฐ๊ตญ์ Time.TimeScale์ด ์๋๋ผ ์ด๋ค ๋ค๋ฅธ ๊ฐ์ ๋ฌธ์ ์ผ ์๋ ์๊ฒ ์ด.
๐ถ ๋ค๋ฅธ ๊ฐ๋ค๋ 0์ด ์ ๋ ๋ค์ด๊ฐ ์ ์๊ฒ ํด๋ฒ๋ฆฌ์. Threshold๋ 0.1 ์ ๋๋ก ํด๋ณผ๊ฒ.
(์คํ ์ค...)
๐พ ํ. ๊ทธ๋๋ NaN์ด ๋์ค๋ ๊ฒฝ์ฐ๊ฐ ์๋ค๋
๐ถ ์ด์ฉ ์ ์๊ตฐ. NaN์ด ๋์ค๋ ๊ฑธ ์ฒดํฌํด์ ๊ทธ ๊ฒฝ์ฐ์ velocity๋ฅผ 0์ผ๋ก ๋ง๋ค์ด๋ฒ๋ฆฌ์...
๐พ ๊ทธ๋. ์ฌ์ฉ์๊ฐ ๋์ด์ ์คํฌ๋กค ์กฐ์์ ๋ชปํ๋ ์ํฉ์ด ๋ฒ์ด์ง๋ ๊ฒ๋ณด๋ค๋ ๋ซ์ง.
if (Time.timeScale < 1)
{
// Debug.Log($"Time.timeScale set to :{Time.timeScale} ");
Time.timeScale = 1;
}
if (mCurSnapData.mCurSnapVal < 0.01)
{
// Debug.Log($"mCurSnapData.mCurSnapVal set to :{0.01} ");
mCurSnapData.mCurSnapVal = 0.01f;
}
if (mCurSnapData.mTargetSnapVal < 0.01)
{
// Debug.Log($"mCurSnapData.mCurSnapVal set to :{0.01} ");
mCurSnapData.mTargetSnapVal = 0.01f;
}
mCurSnapData.mCurSnapVal = Mathf.SmoothDamp(mCurSnapData.mCurSnapVal, mCurSnapData.mTargetSnapVal, ref mSmoothDumpVel, mSmoothDumpRate);
var dump2 = mSmoothDumpVel;
if (float.IsNaN(dump2))
{
// Debug.LogError($"dump2 NaN !!!");
mSmoothDumpVel = 0;
}