前提・実現したいこと
こちらの質問において、Time.deltaTimeが掛かっていないことに気づき、
自分なりに解釈したのですが、その認識で合っているか教えていただけませんか?
また、Time.deltaTimeに関して、Lerpのイージング処理やQuaternion.EulerでSinを動かす処理に関しても、
気づいたことがあり、こちらも質問させていただけたらと思います。
ご教示お願いします。
試したこと
・質問1。
こちらの質問において、
Time.deltaTimeを掛けてなくてもよい理由を以下のように考えましたが、この認識で合っていますか?
まず、前提として、経過時間を換算する処理は下記になると思うのですが、
これはfpsが異なっても、下記コードで必ず(正確に(?))経過時間を取得できると認識しています。
C#
1 float seconds = 0; 2 void Update(){ 3 seconds += Time.deltaTime; 4 Debug.Log(seconds); // 経過時間 5 }
以下のようなコルーチン内におけるfor文では、fpsが異なるどのデバイスにおいても、
変数timeは一律に経過時間を取得し、this.animationLength未満の経過時間までfor文が回るので、
下記コードは、fpsが異なっても、Time.deltaTimeを掛けずに、一律にthis.animationLengthの経過時間で、
LerpメソッドやSmoothStepメソッドの補間値tを0~1まで遷移させる処理が実装できている、
という認識で合っていますか?
C#
1 for (float time = 0.0f; time < this.animationLength; time += Time.deltaTime) 2 { 3 var t = time / this.animationLength; 4 // Time.deltaTimeを掛けない補間値tを使った処理。LerpメソッドやSmoothStepメソッド等。 5 yield return null; 6 } 7 // 補間値t=1の調整処理
・質問2。
Lerpのイージング処理では、質問1と違って、Time.deltaTimeを掛けることが必要と思い、
下記コードを組んでみたのですが、一瞬で、startPointからendPointに移動してしまいます。
for文の中で2つのログを取ってみたのですが、問題なさそうでした。
下記コードはどのように修正すればイージング処理になりますか?
C#
1 float animationLength = 5.0f; 2 3 IEnumerator MoveCoroutine(Transform move, Transform startPoint, Transform endPoint){ 4 move.position = startPoint.position; 5 for (float time = 0.0f; time < animationLength; time += Time.deltaTime){ 6 move.position = Vector3.Lerp(move.position, endPoint.position, Time.deltaTime * 5); 7 yield return null; 8 Debug.Log(time); 9 Debug.Log("t:" + Time.deltaTime * 5); 10 } 11 }
また、上記コードが修正できたとしても、「animationLength時間でイージングされる」だけであって、
「animationLength時間でendPointの場所までイージング」はされないですよね?
Lerpのイージング処理で、「指定時間で、指定終点まで到達される」ことは実装不可能と考えているのですが、
合っていますか?(それとも実装可能ですか?)
イージング系のアセットを使えば解決するとは思いますが、Lerpの実装において教えていただきたいです。
・質問3。
こちらの質問ですが、
デバイス間のfpsの差異をなくすためには、Time.deltaTimeを掛けて、以下のようにすべきでしょうか?
それとも不要ですか?
最初は必要に思えたのですが、「Time.time - startTime」を考慮すると不要なのか、わからない状態です。
C#
1 void Update() 2 { 3 transform.rotation = startRotation * Quaternion.Euler(0f, 0f, Mathf.Sin((Time.time - startTime) * speed * Time.deltaTime) * maxAngle); 4 }
追記①
・時間を指定しないイージング。
C#
1 float speed = 0.5f; 2 IEnumerator MoveCoroutine(Transform move, Transform startPoint, Transform endPoint){ 3 move.position = startPoint.position; 4 while(move.position != endPoint.position){ 5 move.position = Vector3.Lerp(move.position, endPoint.position, Time.deltaTime * speed); 6 float distance = (endPoint.position - move.transform.position).sqrMagnitude; 7 if(distance < 0.0001){ 8 move.position = endPoint.position; 9 } 10 yield return null; 11 } 12 Debug.Log("finish"); 13 }
追記②
・easeOutElasticの元のコード。
function easeOutElastic(x: number): number { const c4 = (2 * Math.PI) / 3; return x === 0 ? 0 : x === 1 ? 1 : pow(2, -10 * x) * sin((x * 10 - 0.75) * c4) + 1; }
・試したコード(EaseOutElastic)
C#
1 static float EaseOutElastic(float t) 2 { 3 const float c4 = (2.0f * Mathf.PI) / 3.0f; 4 5 t = Mathf.Clamp01(t); 6 return t == 0 ? 0 : t == 1 ? 1 : Mathf.Pow(2, -10 * t) * Mathf.Sin((t * 10 - 0.75f) * c4) + 1; 7 } 8 9 float animationLength = 5.0f; 10 IEnumerator MoveCoroutine(Transform move, Transform startPoint, Transform endPoint){ 11 move.position = startPoint.position; 12 for (float time = 0.0f; time < animationLength; time += Time.deltaTime){ 13 move.position = Vector3.Lerp(startPoint.position, endPoint.position, EaseOutElastic(time / this.animationLength)); 14 yield return null; 15 } 16 } 17 18 static float EaseOutExpo(float t) 19 { 20 t = Mathf.Clamp01(t); 21 return t < 1.0f ? 1.0f - Mathf.Pow(2.0f, -10.0f * t) : 1.0f; 22 } 23 24 static float EaseOutCubic(float t) 25 { 26 var it = 1.0f - Mathf.Clamp01(t); 27 return 1.0f - (it * it * it); 28 }
回答1件
あなたの回答
tips
プレビュー