浮動小数点数とMathf
CoddyのUnityジャーニー「Unityスクリプティングの基礎」セクションの一部。レッスン 9/67。
Unity では float を使います。位置、速度、角度、Time.deltaTime はすべて float です。C# は 0.5 を double として読み取り、精度が失われる可能性があるため、指示がない限り double を float に変換しません。初心者が最初に書くスクリプトでは、ほとんどの場合、これが原因で次の2つのコンパイルエラーが発生します。
float half = 0.5;はCS0664: Literal of type double cannot be implicitly converted to type 'float'; use an 'F' suffixになります。float s = Math.Sin(x);はCS0266: Cannot implicitly convert type 'double' to 'float'になります。これはSystem.Mathが double を使うためです。
修正方法は、float リテラルには f を付け、Math の Unity 版である Mathf(Mathf.Sin、Mathf.Abs、Mathf.Sqrt、Mathf.PI)を使うことです。この浮きブイの上下動には両方のエラーがありましたが、次のようにするとコンパイルできます。
// 変更前: float y = 1 + Math.Sin(Time.time * 2) * 0.5;
float y = 1 + Mathf.Sin(Time.time * 2) * 0.5f;
transform.position = new Vector3(0, y, 0);1 や 2 のような整数には接尾辞は必要ありません。int は精度を失うことなく float に変換されます。
チャレンジ
簡単ハートを脈打たせます。サイズは1から1.5まで大きくなって戻り、1秒間に3回、すべての軸で同じように変化します。スクリプトはコンパイルできません。Unityの浮動小数点演算に関するエラーを修正し、数式はそのままにしてください。
Playを押してConsoleでエラーを確認し、修正してからCheckを押してください。
自分で試してみよう
using System;
using UnityEngine;
public class Pulse : MonoBehaviour
{
void Update()
{
float size = 1 + Math.Abs(Math.Sin(Time.time * 3)) * 0.5;
transform.localScale = new Vector3(size, size, size);
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。