前提・実現したいこと
下記はUnityの書籍のコードの一部を抜粋したものですが
(Unity標準アセットのSmoothFollow.csを改造したものらしく、ほぼSmoothFollow.csのコードでした)、
このLerpにおける処理に関して質問です。
Lerpの戻り値を開始位置として更新するLerpの処理とはどういうものなのか、
また、Time.deltaTimeを掛けている理由やコード中のheightDampingについて
ご教示お願いします。
//高さに変化を加えるときにどのくらい遅延させるか。 [SerializeField] private float heightDamping; void Update() { var currentHeight = transform.position.y; var wantedHeight = target.position.y + height; currentHeight = Mathf.Lerp(currentHeight, wantedHeight, heightDamping * Time.deltaTime); transform.position = new Vector3(transform.position.x ,currentHeight , transform.position.z); }
試したこと
簡単な数に置き換えて試してみました。
float i = 0; // Update is called once per frame void LateUpdate() { float j = 24; i = Mathf.Lerp(i, j, 0.5f); Debug.Log(i); }
出力結果。
12 18 21 22.5 23.25 …
出力結果から、これはイージング処理になるのではないかと思いました。
続いて、Time.deltaTimeで試してみました。
float i = 0; float t = 0; // Update is called once per frame void LateUpdate() { float j = 24; i = Mathf.Lerp(i, j, Time.deltaTime * 5); t += Time.deltaTime; Debug.Log(i); Debug.Log(t); if(t>5){ Debug.Break(); } }
5秒後に終点に収束になるのかと予想したのですが、出力結果はそうではなさそうでした。
t==2.972162の時点で、i==23.99999の値を取っていました。
Time.deltaTimeを使っている理由がやはりわかりません。
以上を踏まえて質問です。
・質問1。
「Lerpの戻り値を開始位置として更新するLerpの処理」は、イージングになるという認識で合っていますか?
また、それは必ずEase outのイージングになるということでしょうか?
例外や間違いがあればご指摘お願いします。
・質問2。
Time.deltaTimeを使っている理由や効果は何ですか?
指定時間でLerpが終点に収束したりするのでしょうか?
書籍のコードだけならば、何かの間違い、誤植かなと思ったのですが、
Unity公式アセットでもTime.deltaTimeを書いているので、何かしらの意味はあるのではないかと思っています。
・質問3。
heightDampingは、どういう役割を果たしていますか?
書籍のコメントの「遅延させるか」というキーワードが引っかかって、気になったのですが、
Lerpは初めから開始されているので(出遅れてLerpが動いているわけではないと思うので)、
遅延の意味がよくわからないと思いました。
イージングの調整値で合っていますか?
また、heightDamping * Time.deltaTimeが1だったら、一気に終点に来てしまうと思うので、
heightDamping * Time.deltaTime < 1 を満たすようなheightDampingの値を設定すればよいという認識で合っていますか?
(heightDamping自体は1未満であろうと1以上であろうと特に問題ないという認識で合っていますか?)
また、試したことで、heightDampingの時間で終点に辿り着かないという認識で合っていますか?
それともheightDampingは何か時間に作用するものでしょうか?
・質問4。
終点に収束するまでは、Lerpを動かして、収束、もしくは超えたら、
終点に設定するみたいなコードを書きたいのですが、
下記「if(i < j)」の条件だと、ずっとこのif文に引っ掛かるので、
終点への調整処理みたいなのは、どういった書き方をすればよいですか?
float j = 24; if(i < j){ i = Mathf.Lerp(i, j, Time.deltaTime * 5); Debug.Log(i); }else{ i = 24; Debug.Log("Break"); Debug.Break(); }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/09/15 06:44
2019/09/15 12:01
退会済みユーザー
2019/09/15 15:59
2019/09/15 20:38
退会済みユーザー
2019/09/16 04:11
2019/09/16 05:41
退会済みユーザー
2019/09/16 06:50