こんにちは、ともくんのゲーム作り部屋にようこそ!
このページでは、
「C#のuint型ってなに?」
「uint型はどんなときに使うの?」
というお悩みの方に向けた内容となっています。
Unityで使うC#では、データ型の一つにuint型というものがあります。
このuint型は、符号を持たない0以上の整数のデータ型となっていて、0~4,294,967,295までの整数を入れることができます。
ただ、通常の整数を扱うint型とuint型を一緒に使うと管理が複雑になるため、uint型は大きな数値を扱う場合や、RGBなどの値を管理するような場合に使われることが多いです。
そこで、このページでは、UnityのC#で使えるuint型について、どんなデータ型なのか、またUnityで使われるシーンをまとめていきます。
uint型とは?
まずは、uint型がどういうものなのか紹介していきます。
符号を持たない0以上の整数のデータ型
uint型とは、unsigned intという略で、符号を持たない0以上の整数のデータ型を表すものです。
通常の整数値で扱うint型は、負の整数も正の整数も入れることができるデータ型です。
例えば、以下のようにaとbのint型の変数に、「1」と「-1」をそれぞれ入れることができます。
using UnityEngine;
public class Test : MonoBehaviour
{
void Start()
{
int a = 1;
int b = -1;
Debug.Log(a + b);
}
}
一方で、このuint型は、負の整数を入れられず、0以上の正の整数だけを保持することができるデータ型となっています。
先ほどと同じように、aとbのuint型の変数を準備して、「1」と「-1」を入れてみますが、-1は負の値となるため、エラーが発生します。
using UnityEngine;
public class Test : MonoBehaviour
{
void Start()
{
uint a = 1;
uint b = -1; // 負のデータを入れられないためエラー
Debug.Log(a + b);
}
}
このように、uint型は0以上の正の整数だけを入れることができるデータ型となっています。
int型よりも大きな整数を入れることができる
uint型を使うメリットとして、int型よりも大きな正の整数の値を入れることができるという点があります。
int型を使う場合、-2,147,483,648~2,147,483,647までの整数を扱うことができるようになっています。
一方、uint型では、0~4,294,967,295までの整数を扱うことができるため、int型よりも大きな整数の値を保持できるということになります。
つまり、2,147,483,648~4,294,967,295の間の整数の値を扱うような場合は、uint型が活用できるということになります。
数値を扱う場合では基本的に使わない
uint型の変数は、基本的に数値を管理したり、計算を行うような場合には、ほとんど使われることがありません。
先ほどの大きな正の整数を扱う場合は別ですが、通常の整数はint型で足りますし、int型なら負の整数を扱うこともできます。
特に、int型とuint型をスクリプト内で一緒に記述して、計算や数値で変動させたりしてしまうと、負の値が生じてしまった際に不具合になる可能性があります。
using UnityEngine;
public class Test : MonoBehaviour
{
void Start()
{
int a = 5;
uint b = 2;
b -= (uint)a;
Debug.Log(b);
}
}
そのため、基本的に整数の値を管理するような場合は、uint型ではなくint型を使うようにしましょう。
uint型をUnityで使うシーン
先ほどuint型は数値の管理では基本的に使わないと書きましたが、ではどんな時に使うのか、実際にUnityのシーンで紹介していきます。
インスペクターから負の値を入れないようにする
インスペクターから変数に値を入れて指定する際に、uint型の変数を使うことで、絶対に負の整数を入れないようにすることができます。
例えば、以下のようにint型の変数を宣言しておき、SerializeFieldの属性を付けておきます。
using UnityEngine;
public class PlayerController : MonoBehaviour
{
[SerializeField]
int hp;
}そして、アタッチしたオブジェクトをインスペクターから確認すると、以下のように変数に値を入れることができますが、int型だと負の整数も入れることができるようになります。

この変数に正の整数しか絶対に入れたくないのであれば、以下のようにuint型の変数で宣言しておきます。
using UnityEngine;
public class PlayerController : MonoBehaviour
{
[SerializeField]
uint hp;
}すると、インスペクターから負の整数を入れることができなくなるので、入力ミスの発生を防ぐことができます。

ただし、この値を使って計算処理などを行い、uint型の値が負になる可能性がある場合は、以下のようにint型の変数を使って、SerializeFieldの後ろに[Range(下限値, 上限値)]で負の値を指定できないようにする方が良いでしょう。
using UnityEngine;
public class PlayerController : MonoBehaviour
{
[SerializeField]
[Range(0, 100)] // 0から100までの値しか選択できなくなる
int hp;
}
byte型の変数を格納して管理する
Unityでuintを使うもう一つのシーンとして、4つのbyte型の値をuint型に格納するという使い方です。
そもそもbyte型というのは、uint型と同じく符号を持たない整数のデータ型で、0~255までの整数を入れることができます。
そして、byte型は8ビット(1バイト)、uint型は32ビット(4バイト)で表されているので、uint型には4つのbyte型を格納することができます。

実際に格納する際は、以下の行目のようにビットのシフト演算子の「<<」(左シフト)を使って、左に8ビットずつずらしながら格納し、反対に格納したuint型は、「>>」(右シフト)を使うことで戻すことができます。
using UnityEngine;
public class Test : MonoBehaviour
{
// byte型の変数に255までの整数を代入
byte a = 10;
byte b = 243;
byte c = 148;
byte d = 55;
// byte型の変数を宣言
byte _a;
byte _b;
byte _c;
byte _d;
void Start()
{
// uint型にbyte型のデータを格納
uint e = (uint)((a << 24) | (b << 16) | (c << 8) | d);
// uint型からそれぞれのデータを取り出す
_a = (byte)(e >> 24);
_b = (byte)(e >> 16);
_c = (byte)(e >> 8);
_d = (byte)e;
Debug.Log(_a + "," + _b + "," + _c + "," + _d);
}
}
この仕組みを使うことで、UnityのColor構造体で色を表している赤色(r)、緑色(g)、青色(b)、透明度(a)の4つのfloat型の変数をbyte型に変換した後に、1つのuint型に格納することで、メモリを効率的に使うことができます。

このように、uint型は色を表すRGBA値を管理する際に使われることがあります。
まとめ
このページでは、UnityのC#で使えるuint型というものについて、どのようなものなのか、また使われるシーンについてまとめていきましたが、いかがでしたでしょうか?
uint型とは、符号を持たない0以上の整数を入れるデータ型で、0~4,294,967,295までの値を扱うことができます。
通常の数値管理では、基本的にint型が使われますが、必ず正の値を入れたいという場合などにuint型が使われます。
また、uint型にbyte型のデータを格納することができるので、色を表すColor構造体の変数を管理することでメモリの節約に繋げることができます。
最後までお読みいただきまして、ありがとうございました!



コメント