teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

FixedUpdateの実行間隔について実験

2019/09/16 05:40

投稿

Bongo
Bongo

スコア10816

answer CHANGED
@@ -128,4 +128,36 @@
128
128
  }
129
129
  }
130
130
  }
131
- ```
131
+ ```
132
+
133
+ **FixedUpdateの世界の時間の流れと実際の時間の流れの比較**
134
+ ```C#
135
+ using UnityEngine;
136
+
137
+ public class FixedTimeVersusRealTime : MonoBehaviour
138
+ {
139
+ private float previousFixedTime;
140
+ private float previousRealTime;
141
+
142
+ private void Start()
143
+ {
144
+ this.previousFixedTime = Time.fixedTime;
145
+ this.previousRealTime = Time.realtimeSinceStartup;
146
+ }
147
+
148
+ private void FixedUpdate()
149
+ {
150
+ var fixedTime = Time.fixedTime;
151
+ var realTime = Time.realtimeSinceStartup;
152
+ var fixedDeltaTime = fixedTime - this.previousFixedTime;
153
+ var realDeltaTime = realTime - this.previousRealTime;
154
+
155
+ Debug.Log($"Fixed:{fixedTime:F5} Delta:{fixedDeltaTime:F5} Real:{realTime:F5} Delta:{realDeltaTime:F5}");
156
+
157
+ this.previousFixedTime = fixedTime;
158
+ this.previousRealTime = realTime;
159
+ }
160
+ }
161
+ ```
162
+
163
+ ![図](43fd61009dedf5e1e277df1398b2b2aa.png)

1

コードの計算量を削減

2019/09/16 05:40

投稿

Bongo
Bongo

スコア10816

answer CHANGED
@@ -74,4 +74,58 @@
74
74
 
75
75
  ![図2](16b1bb22b17799b07a51b1f59aee42c7.gif)
76
76
 
77
- ですがわざわざ[Exp](https://docs.unity3d.com/ja/current/ScriptReference/Mathf.Exp.html)なんかを使ってまで調整精度を上げるだけの価値があるかというと微妙でした。
77
+ ですがわざわざ[Exp](https://docs.unity3d.com/ja/current/ScriptReference/Mathf.Exp.html)なんかを使ってまで調整精度を上げるだけの価値があるかというと微妙でした。
78
+
79
+ **計算量削減、基準フレームレートとイージング調整値を変更できるように修正**
80
+ ```C#
81
+ using System;
82
+ using UnityEngine;
83
+
84
+ public class LerpAndDeltaTime : MonoBehaviour
85
+ {
86
+ public enum Mode
87
+ {
88
+ Coarse,
89
+ Fine
90
+ }
91
+
92
+ [SerializeField] private float deltaTime = 1.0f / 60.0f;
93
+ [SerializeField] private float duration = 2.0f;
94
+ [SerializeField] private Mode mode;
95
+ [SerializeField] private GameObject dotPrefab;
96
+ [SerializeField] private float damping = 1.0f;
97
+ [SerializeField] private double referenceFrameRate = 60.0;
98
+
99
+ private float time;
100
+
101
+ private void Start()
102
+ {
103
+ var y = 0.0f;
104
+ var referenceDeltaTime = 1.0 / this.referenceFrameRate;
105
+ while (this.time < this.duration)
106
+ {
107
+ switch (this.mode)
108
+ {
109
+ case Mode.Coarse:
110
+ // 単純なdeltaTimeによる調整
111
+ y = Mathf.Lerp(y, 1.0f, this.damping * this.deltaTime);
112
+ break;
113
+ case Mode.Fine:
114
+ // referenceFrameRate FPSのときのカーブに近づくよう補正した調整
115
+ var t = (float)(1.0 - Math.Pow(
116
+ 1.0 - (this.damping * referenceDeltaTime),
117
+ this.referenceFrameRate * this.deltaTime));
118
+ y = Mathf.Lerp(y, 1.0f, t);
119
+ break;
120
+ }
121
+
122
+ this.time += this.deltaTime;
123
+ Instantiate(
124
+ this.dotPrefab,
125
+ this.transform.position + new Vector3(this.time, y, 0.0f),
126
+ Quaternion.identity,
127
+ this.transform);
128
+ }
129
+ }
130
+ }
131
+ ```