3Dワールドができたので、最初のスクリプトを追加する時が来ました。このセクションでは、プレーヤーがコインを収集できるコイン収集メカニクスを作成し、一度収集されたコインは一時的に無効にします。
コインの作成
スクリプトを書き始める前に、ワールド内にコインのプレースホルダーオブジェクトを用意する必要があります。前のセクションで作成した海のスタックプラットフォームのように、コインは単純な Part オブジェクトで構成できます。
コインの作成Workspace > World内に「Coins」という新しいフォルダーを作成します。Coinsフォルダー内に、「Coin」という名前のシリンダーPartを作成し、BrickColorをGold、MaterialをMetal、Sizeを0.6, 8, 4、Orientationを90, 0, 0に設定します。CanCollideを無効にし、Anchoredを有効にします。その後、Coinパーツを複数回複製し、島の周りやプラットフォームに散らばらせて、海のスタックレベルからアクセスできるようにします。各複製の名前はCoinのままにしておきます。
スクリプトの作成
次に、コインがプレーヤーに反応するようにします。Robloxエンジンは何かがコインに触れたときに検出できますが、コインがどのように反応するかを定義するためにはスクリプトを使用する必要があります。
Create CoinServiceServerScriptService内に「CoinService」という名前のスクリプトを作成し、次のコードを追加します:```lua-- サービスと変数の初期化local Workspace = game:GetService("Workspace")local Players = game:GetService("Players")local coinsFolder = Workspace.World.Coinslocal coins = coinsFolder:GetChildren()local COOLDOWN = 10-- イベントハンドラーの定義local function onCoinTouched(otherPart, coin)if coin:GetAttribute("Enabled") thenlocal character = otherPart.Parentlocal player = Players:GetPlayerFromCharacter(character)if player then-- プレーヤーがコインに触れたcoin.Transparency = 1coin:SetAttribute("Enabled", false)print("プレーヤーがコインを収集しました")task.wait(COOLDOWN)coin.Transparency = 0coin:SetAttribute("Enabled", true)endendend-- イベントリスナーの設定for _, coin in coins docoin:SetAttribute("Enabled", true)coin.Touched:Connect(function(otherPart)onCoinTouched(otherPart, coin)end)end```
これで、プレーヤーがコインに触れるたびにコインが消え、10秒後に再び現れ、出力ログに プレーヤーがコインを収集しました と表示されます。
以下のセクションでは、スクリプトがどのように機能するかを詳細に説明します。
サービスと変数の初期化
おそらく他の言語で書いたコードの多くと同様に、後で必要な変数をスクリプトの先頭に定義します。私たちのコードは次のように機能します:
- すべてのコインへの参照の取得 - スクリプトは次に、 GetChildren() メソッドを使用して、3Dワークスペース内のすべてのコインオブジェクトへの参照を照会します。このメソッドは、そのオブジェクトに関連付けられているすべてのものを含む配列を返します。この場合、それは以前に作成したWorkspace.World.Coinsフォルダーです。
- グローバル変数の定義 - COOLDOWN 変数は、コインが収集された後にどれだけの時間コインを無効にするかを定義するために後で使用されます。
サービスと変数の初期化local Workspace = game:GetService("Workspace")local Players = game:GetService("Players")local coinsFolder = Workspace.World.Coinslocal coins = coinsFolder:GetChildren()local COOLDOWN = 10...
イベントハンドラーの定義
Robloxエンジンは3Dワールドを物理的にシミュレートし、レンダリング、物理、ネットワーク関連のイベントを処理します。独自のロジックをスクリプトで作成したい場合、これらのイベントをリッスンして処理することができ、エンジンにはそれ以外の部分を処理させることができます。この場合、コインに触れることに関連するイベントをリッスンして処理します。スクリプトは onCoinTouched() メソッド内でこのイベントを処理するロジックを定義し、次のように実行します:
- コインが有効かどうかを検出 - すべての Instance には、オブジェクトが3Dワールドに存在するかどうかを定義する Enabled ブール属性があります。インスタンスの属性を取得するには、 GetAttribute() メソッドを使用します。
- プレーヤーがコインに触れたかどうかを検出 - コインが有効な場合、メソッドはプレーヤーサービスを使用して、コインに触れたオブジェクトが本当にプレーヤーであるかを確認します。タッチイベントが発生すると、Robloxエンジンはコインに触れたオブジェクトを otherPart パラメータとして渡します。スクリプトは、otherPart の親がプレーヤーに属するかどうかを確認します。
- プレーヤーがコインに触れた場合、コインを無効にし、10秒後に再度有効化 - 最後に、プレーヤーがコインに触れた場合、メソッドはコインを無効化し、10秒待ってからコインを収集できるように再度有効化します。task.wait() は wait() の代わりに使用されます。wait()よりも性能が良く、コードの実行を完全に停止せずに、他のスレッド内のタスクが並行して実行されます。
イベントハンドラーの定義
local function onCoinTouched(otherPart, coin)
if coin:GetAttribute("Enabled") then
local character = otherPart.Parent
local player = Players:GetPlayerFromCharacter(character)
if player then
-- プレーヤーがコインに触れた
coin.Transparency = 1
coin:SetAttribute("Enabled", false)
print("プレーヤーがコインを収集しました")
task.wait(COOLDOWN)
coin.Transparency = 0
coin:SetAttribute("Enabled", true)
end
end
end
イベントハンドラーを接続
すべてのシミュレーションされた3Dオブジェクトは BasePart を継承しており、したがって Touched() イベントを持っています。次のループでは、すべてのコインのタッチイベントに対して onTouchedEvent() ハンドラーを接続します:
- すべてのコインをループ - 一般的な反復を使用して、すべてのコインをループします。
- イベントにハンドラーを接続 - ループの各反復で、コインは初期のゲーム開始時に3Dワールド内で表示されるようにデフォルトで有効にされます。onCoinTouched() ハンドラー方法はコインの Touched イベントにも接続され、イベントが発生するたびに実行されるようにします。エンジンがタッチを検出すると、オブジェクトがタッチされたことも otherPart として渡されます。
イベントハンドラーの接続
for _, coin in coins do
coin:SetAttribute("Enabled", true)
coin.Touched:Connect(function(otherPart)
onCoinTouched(otherPart, coin)
end)
end
メカニクスをプレイテストする
ドロップダウンからテストを選択し、プレイをクリックします。キャラクターを動かしてコインに触れてみてください。すべてがうまくいくと、コインが消え、Outputウィンドウに プレーヤーがコインを収集しました と表示され、10秒後にコインが再び現れます。
