回答編集履歴

2

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

2019/09/16 05:40

投稿

Bongo
Bongo

スコア10807

test CHANGED
@@ -259,3 +259,67 @@
259
259
  }
260
260
 
261
261
  ```
262
+
263
+
264
+
265
+ **FixedUpdateの世界の時間の流れと実際の時間の流れの比較**
266
+
267
+ ```C#
268
+
269
+ using UnityEngine;
270
+
271
+
272
+
273
+ public class FixedTimeVersusRealTime : MonoBehaviour
274
+
275
+ {
276
+
277
+ private float previousFixedTime;
278
+
279
+ private float previousRealTime;
280
+
281
+
282
+
283
+ private void Start()
284
+
285
+ {
286
+
287
+ this.previousFixedTime = Time.fixedTime;
288
+
289
+ this.previousRealTime = Time.realtimeSinceStartup;
290
+
291
+ }
292
+
293
+
294
+
295
+ private void FixedUpdate()
296
+
297
+ {
298
+
299
+ var fixedTime = Time.fixedTime;
300
+
301
+ var realTime = Time.realtimeSinceStartup;
302
+
303
+ var fixedDeltaTime = fixedTime - this.previousFixedTime;
304
+
305
+ var realDeltaTime = realTime - this.previousRealTime;
306
+
307
+
308
+
309
+ Debug.Log($"Fixed:{fixedTime:F5} Delta:{fixedDeltaTime:F5} Real:{realTime:F5} Delta:{realDeltaTime:F5}");
310
+
311
+
312
+
313
+ this.previousFixedTime = fixedTime;
314
+
315
+ this.previousRealTime = realTime;
316
+
317
+ }
318
+
319
+ }
320
+
321
+ ```
322
+
323
+
324
+
325
+ ![図](43fd61009dedf5e1e277df1398b2b2aa.png)

1

コードの計算量を削減

2019/09/16 05:40

投稿

Bongo
Bongo

スコア10807

test CHANGED
@@ -151,3 +151,111 @@
151
151
 
152
152
 
153
153
  ですがわざわざ[Exp](https://docs.unity3d.com/ja/current/ScriptReference/Mathf.Exp.html)なんかを使ってまで調整精度を上げるだけの価値があるかというと微妙でした。
154
+
155
+
156
+
157
+ **計算量削減、基準フレームレートとイージング調整値を変更できるように修正**
158
+
159
+ ```C#
160
+
161
+ using System;
162
+
163
+ using UnityEngine;
164
+
165
+
166
+
167
+ public class LerpAndDeltaTime : MonoBehaviour
168
+
169
+ {
170
+
171
+ public enum Mode
172
+
173
+ {
174
+
175
+ Coarse,
176
+
177
+ Fine
178
+
179
+ }
180
+
181
+
182
+
183
+ [SerializeField] private float deltaTime = 1.0f / 60.0f;
184
+
185
+ [SerializeField] private float duration = 2.0f;
186
+
187
+ [SerializeField] private Mode mode;
188
+
189
+ [SerializeField] private GameObject dotPrefab;
190
+
191
+ [SerializeField] private float damping = 1.0f;
192
+
193
+ [SerializeField] private double referenceFrameRate = 60.0;
194
+
195
+
196
+
197
+ private float time;
198
+
199
+
200
+
201
+ private void Start()
202
+
203
+ {
204
+
205
+ var y = 0.0f;
206
+
207
+ var referenceDeltaTime = 1.0 / this.referenceFrameRate;
208
+
209
+ while (this.time < this.duration)
210
+
211
+ {
212
+
213
+ switch (this.mode)
214
+
215
+ {
216
+
217
+ case Mode.Coarse:
218
+
219
+ // 単純なdeltaTimeによる調整
220
+
221
+ y = Mathf.Lerp(y, 1.0f, this.damping * this.deltaTime);
222
+
223
+ break;
224
+
225
+ case Mode.Fine:
226
+
227
+ // referenceFrameRate FPSのときのカーブに近づくよう補正した調整
228
+
229
+ var t = (float)(1.0 - Math.Pow(
230
+
231
+ 1.0 - (this.damping * referenceDeltaTime),
232
+
233
+ this.referenceFrameRate * this.deltaTime));
234
+
235
+ y = Mathf.Lerp(y, 1.0f, t);
236
+
237
+ break;
238
+
239
+ }
240
+
241
+
242
+
243
+ this.time += this.deltaTime;
244
+
245
+ Instantiate(
246
+
247
+ this.dotPrefab,
248
+
249
+ this.transform.position + new Vector3(this.time, y, 0.0f),
250
+
251
+ Quaternion.identity,
252
+
253
+ this.transform);
254
+
255
+ }
256
+
257
+ }
258
+
259
+ }
260
+
261
+ ```