roblox-core について
Roblox の基本的なランタイム構成と日常的なゲームスクリプトを扱うスキルです。コードの実行場所を判断し、スクリプトやモジュール、一般的なゲーム処理を整理する開発者向けです。
主な機能
- 01クライアントとサーバーの役割分担
- 02スクリプト種別と配置先
- 03サービス、モジュール、属性
- 04同一側での Bindable 通信
- 05入力、カメラ、Workspace のパターン
- 06Studio でのテストとデバッグ
活用シーン
- 01ゲーム処理の実行場所の選定
- 02再利用可能な Roblox モジュールの整理
- 03クライアント側の入力とカメラ処理
- 04レイキャスト、衝突、CFrame の利用
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ flatbedj/ roblox-skills --skill roblox-coreインストール後、Claude Code で/roblox-coreを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/attributes.mdbindable-events.mdclient-server-runtime.mdinput-overview.mdmodulescripts-and-reuse-patterns.mdscript-locations-and-script-types.mdscripting-overview.mdservices.mdworkspace-basics-camera-raycasting-collisions-and-cframes.md詳細
roblox-core
使用する場面
タスクの主な内容が、Roblox のランタイムの基本構造や日常的なゲームプレイのスクリプト作成である場合に、このスキルを使用します。
- ロジックをクライアント、サーバー、または両方のどこに置くかを選ぶ場合。
Script、LocalScript、ModuleScriptのインスタンスをどこに配置するかを決める場合。ServerScriptService、ServerStorage、ReplicatedStorage、ReplicatedFirst、StarterPlayer、StarterGui、Workspaceにまたがってコードを整理する場合。- 通常のゲームプレイコードで、サービス、モジュールの再利用、属性、バインダブルを使用する場合。
- プレイテスト、エクスプローラーのレイアウト、
WaitForChild()、Output を使ったデバッグなど、一般的な Studio のスクリプト作成ワークフローに取り組む場合。 - 通常のエクスペリエンスのスクリプト作成の一環として、基本的な入力、カメラ、レイキャスティング、衝突、
CFrameの動作を実装する場合。
タスクの主な内容が以下の場合は、このスキルを使用しないでください。
- エンジン API の網羅的な検索や、クラスごとのリファレンスの閲覧。
- 境界をまたぐリモート設計、高度なリモートのセキュリティ、サーバー権限アーキテクチャ。
- 永続化、メモリストア、メッセージング、Open Cloud、OAuth、外部自動化。
判断ルール
- 主な質問が構造に関するもの、つまり、コードをどこに置くか、どこで実行されるか、何がレプリケーションされるか、再利用可能な Roblox ロジックをどう整理するかである場合は、このスキルを使用します。
- サービス、モジュール、属性、バインダブル、基本的な入力、ワークスペースへのアクセス、衝突、レイキャスト、カメラ、
CFrameなど、ほとんどのエクスペリエンスで使われる基本的なエンジンパターンには、このスキルを使用します。 - タスクの中心が
RemoteEvent、RemoteFunction、信頼境界、リクエストの検証、マルチプレイヤーのメッセージ設計である場合は、roblox-networkingに引き継ぎます。 - タスクの主な内容が、広範な Roblox の領域にわたる「どの API/メンバーを呼び出すか」である場合は、
roblox-apiに引き継ぎます。 - タスクの中心が、保存、読み込み、クォータ、バージョン管理、サーバー間の状態、一時的な共有状態である場合は、
roblox-dataに引き継ぎます。 - タスクに Open Cloud、ウェブ API、認証情報、OAuth、外部ツールの自動化が含まれる場合は、
roblox-cloudまたはroblox-oauthに引き継ぎます。 - リクエストに基本構造と対象外のシステムが混在する場合は、Roblox の基本的な部分だけに回答し、それ以外は明示的に対象外とします。
- 判断に迷う場合は、より限定的に解釈し、ネットワーキング、データ、クラウド、API リファレンスの各スキルと重複する内容は省きます。
手順
- 各責務をどちらの実行環境で担うかを、まず特定します。
- サーバー:権威あるワールド状態、スポーン、ルールの適用、共有シミュレーション。
- クライアント:プレイヤーごとの入力、カメラ、瞬間的な表示、ローカルのフィードバック。
- 共有モジュール:両側で同じコードや定数が必要な場合にのみ使用します。
- レプリケーションの動作に合ったコンテナにコードを配置します。
ServerScriptService:サーバー専用のスクリプトとモジュール。ServerStorage:レプリケーションが不要なサーバー専用のアセットやモジュール。ReplicatedStorage:共有モジュールとレプリケートされるアセット。ReplicatedFirst:最も早い段階でのクライアント起動処理にのみ使用します。StarterPlayerScripts、StarterCharacterScripts、StarterGui、StarterPack:各プレイヤーにコピーされるクライアント側の動作。
- スクリプトの意図を明確にします。
- クライアントコードには、
LocalScriptまたはRunContext = Clientを設定したScriptを使用します。 - サーバーコードには、
RunContext = Serverを設定したScript、または通常のサーバー配置を使用します。 - 再利用可能なロジックと設定には
ModuleScriptを使用します。
- クライアントコードには、
- スクリプトの先頭付近で
game:GetService()を使ってサービスを一度取得し、名前をサービス名に合わせます。 - 使用するコンテナによって読み込み順が保証されていない限り、クライアントからレプリケートされたオブジェクトにアクセスする際は
WaitForChild()を使用します。 ModuleScriptの戻り値は、Luau の各環境でキャッシュされるものとして扱います。- スクリプトごとに一度だけ
requireし、返されたテーブルまたは関数を再利用します。 - 循環
requireは避けます。 - モジュールを意図的にサーバー専用またはクライアント専用とする場合を除き、共有モジュールは実行側に依存しないようにします。
- スクリプトごとに一度だけ
- インスタンス自体に保持する軽量な状態や設定には、属性を使用します。
- バインダブルは、クライアントとサーバーの境界の同じ側での通信にのみ使用します。ローカルイベント API を簡潔にできる場合は、モジュールが所有するバインダブルを優先します。
- 入力とカメラのコードはクライアント側に実装し、デスクトップ専用の操作を前提とせず、プレイヤーのアクティブな入力モードに合わせます。
- ワークスペースのスクリプト作成では、次の点に従います。
- 明確な参照を通じてオブジェクトの状態を読み書きします。
- 意図的な空間クエリにはレイキャストを使用します。
- 衝突の挙動には、衝突グループまたはパーツのプロパティを使用します。
- 向きや相対的な変換が重要な場合は、
CFrame操作を使用します。
- 例やガイダンスは基礎的な内容に留めます。永続化、高度なネットワークセキュリティ、網羅的なリファレンス調査には踏み込みません。
リファレンスの使用
- Studio での基本的な Roblox スクリプト作成ワークフローと、サービス・モジュール・関数・イベントで構成される標準的なスクリプトの形式については、
references/scripting-overview.mdを開いてください。 - 権限、レプリケーション、編集時と実行時のデータモデル、各側で安全に前提とできることについて検討する場合は、
references/client-server-runtime.mdを開いてください。 Script、LocalScript、ModuleScript、実行コンテキスト、コンテナの配置を判断する場合は、references/script-locations-and-script-types.mdを開いてください。- 基本的な
game:GetService()のパターンと、基礎的なコードで重要となるコンテナやゲームプレイサービスについては、references/services.mdを開いてください。 - モジュールのキャッシュ、共有コードの配置、設定モジュール、カプセル化のパターンについては、
references/modulescripts-and-reuse-patterns.mdを開いてください。 - インスタンスごとの状態、レプリケーション順序に関する注意点、変更検出のパターンについては、
references/attributes.mdを開いてください。 - 同じ側のスクリプト間の通信、非同期イベント、同期コールバック、引数の形式に関する注意点については、
references/bindable-events.mdを開いてください。 - クライアント側の入力処理と、デバイスごとの優先入力タイプへの適応については、
references/input-overview.mdを開いてください。 - ワールドを扱う最も一般的な実行時パターンについては、
references/workspace-basics-camera-raycasting-collisions-and-cframes.mdを開いてください。
チェックリスト
- 各責務が適切なランタイム側に割り当てられています。
- スクリプトとモジュールの配置が、レプリケーションと可視性の要件に合っています。
- コードをスクリプト間で重複させず、
ModuleScript形式で共有しています。 - レプリケーション順序が不確かな場合、クライアントコードでは
WaitForChild()を使用しています。 - サービスは一度取得し、再利用しています。
- 属性は軽量なインスタンス状態に使用し、任意のモジュールデータには使用していません。
- Bindable はクライアントとサーバーの境界の片側だけで使用しています。
- 入力とカメラのコードはクライアント側に置いています。
- レイキャスト、衝突判定、
CFrameの操作は、空間ロジックのために意図的に使用しています。 - 高度なリモートセキュリティ設計は含まれていません。
- 永続化、Open Cloud、OAuth、外部 API の自動化に関するガイダンスは含まれていません。
- API の網羅的なカタログは含まれていません。
よくある間違い
- サーバー専用のロジックを
ReplicatedStorageやほかのレプリケートされるコンテナに配置する。 - 場所や
RunContextを考慮せず、通常のScriptがどこでも実行されると想定する。 - 再利用可能なロジックを共有
ModuleScriptに置くべきところで、LocalScriptを使用する。 - レプリケートされたオブジェクトがすでにクライアントに存在すると想定し、
WaitForChild()を省略する。 - Bindable をネットワーク越しの通信ツールとして扱う。
- モジュールが返す値を変更し、その環境内ではキャッシュされた参照が再利用されることに気づかない。
- モジュールやシステムオブジェクトに格納すべき大規模な構造化データに属性を使用する。
- サーバーからカメラや入力のコードを制御する。
- レイキャストや明示的な空間クエリを使うべき非物理的な重なり判定に
Touchedを使用する。 - 相対変換や向きに
CFrameが必要な場面で、単純な位置ロジックを使ってパーツを移動する。
例
責務に応じて配置を選択する
-- ServerScriptService/SpawnController
-- Spawns and manages shared world state on the server.
-- StarterPlayer/StarterPlayerScripts/InputController
-- Reads player input and drives local presentation on the client.
-- ReplicatedStorage/Shared/Constants
-- Shared module used by both sides.
local Constants = {
MaxHealth = 100,
RoundLength = 120,
}
return Constants
標準的なスクリプトの形を使用する
local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local RoundConfig = require(ReplicatedStorage:WaitForChild("RoundConfig"))
local function onPlayerAdded(player)
print(player.Name, "joined; round length:", RoundConfig.RoundLength)
end
Players.PlayerAdded:Connect(onPlayerAdded)
クライアント専用のカメラコードはローカルに置く
local Workspace = game:GetService("Workspace")
local camera = Workspace.CurrentCamera
camera.CameraType = Enum.CameraType.Scriptable
camera.CFrame = CFrame.lookAt(Vector3.new(0, 10, 20), Vector3.new(0, 5, 0))
camera.Focus = CFrame.new(0, 5, 0)
ローカルの構造化には属性と Bindable を使用する
local part = script.Parent
part:SetAttribute("Active", true)
local changed = Instance.new("BindableEvent")
changed.Event:Connect(function(state)
print("State changed:", state)
end)
changed:Fire(part:GetAttribute("Active"))
コメント
Markdown 対応