結論から言うと:
🟥 Roblox Lua(Luau)に Byte 型は存在しない
Roblox の Luau には Byte 専用のプリミティブ型はない。
整数はすべて number(倍精度浮動小数点) として扱われる。
🟦 ただし「Byte 的に扱う」ことは可能
Roblox には 0〜255 の整数を扱うための専用型はないけれど、
次のような方法で「バイト列」を扱える。
1. 🟩 string をバイト列として扱う
Lua 伝統の string.byte / string.char が使える。
local b = string.byte("A") -- 65
local c = string.char(65) -- "A"
これは内部的には バイト列として動くので、
「Byte 型が欲しい」用途の多くはこれで代替できる。
2. 🟦 table に 0〜255 の整数を入れてバイト配列として扱う
local bytes = { 0, 255, 128, 64 }
Luau の number は整数も扱えるので、
0〜255 の範囲であれば「実質 Byte」として使える。
3. 🟨 Buffer 型(Luau の新機能)を使う
Roblox には Buffer というバイナリデータ用の型がある。
local buffer = buffer.create(4)
buffer.writeu8(buffer, 0, 255) -- 1バイト書き込み
local value = buffer.readu8(buffer, 0)
これは 実際にバイト単位でメモリを扱えるので、
「Byte 型が欲しい」場合の最も近い存在。
🟧 まとめ
| 方法 | Byte 型としての近さ | 特徴 |
|---|---|---|
| number(0〜255) | △ | 最も簡単。型は number。 |
| string.byte / char | ○ | Lua 伝統のバイト操作。 |
| Buffer 型 | ◎ | 実際にバイト単位で扱える。 |
🟦 あなたの用途に合わせるなら…
あなたの Roblox プロジェクトは スパイダー移動ゲームで、
物理計算や UI などのデータ構造を扱うことが多い。
- 高速・大量のデータ処理 → Buffer が最適
- 軽いデータ交換 → number(0〜255)で十分
- 文字列との相互変換 → string.byte / char
用途に合わせて最適な方式を選べる。
必要なら、
- Byte 配列の高速処理
- Buffer を使った構造体の定義
- ネットワーク送信用のバイナリパック
なども一緒に設計できるよ。
これは Buffer のメモリ設計そのものに関わる部分なので、OS レベルの視点で説明すると一気に理解が深まるところだよ。
🟥 結論
buffer.create(4) の 4 は「確保するバイト数(メモリサイズ)」を意味する。
つまり:
buffer.create(4)→ 4 バイトのバッファを作るbuffer.create(1024)→ 1 KB のバッファを作るbuffer.create(n)→ n バイトの連続メモリ領域を確保
🟦 なぜ「バイト数」を指定するのか
Buffer は 生のメモリブロックだから、
「何バイト必要か」を自分で決める必要がある。
例:
| データ | 必要バイト数 |
|---|---|
| u8(0〜255) | 1 byte |
| u16 | 2 bytes |
| u32 | 4 bytes |
| float32 | 4 bytes |
| float64 | 8 bytes |
なので、例えば:
local buf = buffer.create(4)
buffer.writeu8(buf, 0, 255)
buffer.writeu8(buf, 1, 128)
buffer.writeu8(buf, 2, 64)
buffer.writeu8(buf, 3, 32)
これは 4 バイトの配列を作っているのと同じ。
🟩 Buffer は「バイト配列」そのもの
あなたが以前扱っていた「0〜255 の数値を高速に扱う」用途に対して、
Buffer は まさにバイト配列のための構造体。
writeu8→ 1 バイト書き込みwriteu16→ 2 バイト書き込みwritef32→ 4 バイト書き込み
など、用途に応じて使い分ける。
🟧 例:4 バイトの構造体を作る
local buf = buffer.create(4)
buffer.writeu16(buf, 0, 500) -- 2 バイト
buffer.writeu16(buf, 2, 999) -- 2 バイト
これは C 言語でいう:
struct {
uint16 a;
uint16 b;
}
と同じ。
🟦 あなたのプロジェクトでの意味
あなたのスパイダー移動ゲームでは:
- 位置情報
- ベクトル
- 入力状態
- 衝突データ
などを 軽量にパックして扱う可能性がある。
その場合、Buffer は:
- 高速
- 軽量
- GC が走らない
- バイト単位で正確
というメリットがある。
🟩 もしよければ
あなたが扱いたいデータ構造(例:3D ベクトル、Ray 情報、UI の色など)を教えてくれれば、
最適なバイト構造体(Buffer レイアウト)を一緒に設計できるよ。
OS レベルの「構造体設計」はあなたの得意領域だから、
そこに合わせて最適化できる。
これはシンプルで気持ちいいほど明快だよ。
🟥 結論
buffer.writef32 で書き込んだ値は、
buffer.readf32(buffer, offset) で取り出せる。
🟦 使い方の最小例
local buf = buffer.create(4)
buffer.writef32(buf, 0, 3.14159)
local value = buffer.readf32(buf, 0)
print(value) -- 3.14159
writef32→ 4 バイトの float32 を書くreadf32→ 同じ位置から float32 を読む
これで 完全に対称になっている。
🟩 もう少し深く:offset の意味
float32 は 4 バイトなので、複数入れるなら offset を 4 ずつ進める。
local buf = buffer.create(12)
buffer.writef32(buf, 0, 1.5)
buffer.writef32(buf, 4, -2.25)
buffer.writef32(buf, 8, 99.99)
print(buffer.readf32(buf, 0)) -- 1.5
print(buffer.readf32(buf, 4)) -- -2.25
print(buffer.readf32(buf, 8)) -- 99.99
🟧 あなたのプロジェクトでの応用
スパイダー移動ゲームで:
- 位置(x, y, z)
- 速度ベクトル
- Ray の距離
- UI の座標計算
などを float32 でパックすると、
GC が走らず高速で、ネットワーク送信にも向く。
必要なら、
「3D ベクトル構造体を Buffer で作る」
みたいな OS レベルの構造体設計も一緒にできるよ。