3Dワールドができたので、最初のスクリプトを追加する時が来ました。このセクションでは、プレイヤーがコインを収集できるコイン収集メカニックを作成し、コインが収集された後に一時的に無効にします。
コインを作成する
スクリプトを作成する前に、コインとして使用するプレースホルダーオブジェクトをワールドに配置する必要があります。前のセクションで作成した海のスタックプラットフォームのように、コインはシンプルな Part オブジェクトにすることができます。
Workspace > World に新しいフォルダーを作成し、名前を Coins にします。
Coins フォルダー内に、BrickColor を Gold、Material を Metal、Size を 0.6, 8, 4、Orientation を 90, 0, 0 に設定した円柱 Part を Coin と名付けます。
CanCollide を無効にし、Anchored を有効にします。
次に、Coin パートをいくつか複製し、島やプラットフォームの周りに散らばせて、海のスタックレベルからアクセスできるようにします。
各複製の名前は Coin のままにします。スクリプトを作成する
次に、コインがプレイヤーに反応するようにします。Robloxエンジンは、何かがコインに触れたときに検出できますが、コインがどのように反応するかを定義するためにスクリプトを使用する必要があります。
ServerScriptService に CoinService という名前のスクリプトを作成し、次のコードを追加します:
```lua
-- サービスと変数の初期化
local Workspace = game:GetService("Workspace")
local Players = game:GetService("Players")
local coinsFolder = Workspace.World.Coins
local coins = coinsFolder:GetChildren()
local COOLDOWN = 10
-- イベントハンドラーの定義
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
-- イベントリスナーの設定
for _, coin in coins do
coin: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.Coins
local coins = coinsFolder:GetChildren()
local COOLDOWN = 10
...イベントハンドラーの定義
Robloxエンジンは3Dワールドを物理的にシミュレートし、レンダリング、物理、ネットワークに関連するイベントを処理するための多くのロジックを扱います。これらのイベントのいくつかで独自のロジックをスクリプト化したい場合は、イベントをリッスンして処理し、エンジンに残りを処理させることができます。この場合、コインが触れられるイベントをリッスンして処理します。スクリプトは、onCoinTouched() メソッドでこのイベントを処理するロジックを定義します。これにより、次のことが行われます:
- コインが有効かどうかを検出 - すべての Instance には、オブジェクトが3Dワールドに存在するかどうかを定義する Enabled ブール属性があります。インスタンス属性は、GetAttribute() メソッドを使用して取得できます。
- プレイヤーがコインに触れたかどうかを検出 - コインが有効な場合、メソッドはプレイヤーサービスを使用して、コインに触れたオブジェクトが実際にプレイヤーであるかどうかを確認します。タッチイベントが発生すると、Robloxエンジンはコインに触れたオブジェクトを otherPart パラメータとして渡します。スクリプトは、otherPart の親がプレイヤーに属しているかどうかを確認します。
- プレイヤーが触れた場合、コインを無効にし、10秒後に再度有効にする - 最後に、プレイヤーがコインに触れた場合、メソッドはコインを無効にし、10秒待ってからコインを再度収集可能にします。task.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メカニックをプレイテストする
ドロップダウンから Test を選択し、Play をクリックします。キャラクターを動かしてコインに触れてみてください。すべてが正常に動作していれば、コインが消え、Output ウィンドウに プレイヤーがコインを収集しました と表示され、10秒後にコインが再び現れます。
