3Dワールドができたので、最初のスクリプトを追加する時が来ました。このセクションでは、プレイヤーがコインを収集できるコイン収集メカニクスを作成し、コインが収集された後に一時的に無効にします。
コインを作成する
スクリプトを作成する前に、コインとして使用するプレースホルダーオブジェクトをワールドに配置する必要があります。前のセクションで作成した海のスタックプラットフォームのように、コインはシンプルな Part オブジェクトにすることができます。
Workspace > World内にCoinsという名前の新しいフォルダーを作成します。
Coinsフォルダー内に、BrickColorをGold、MaterialをMetal、Sizeを0.6, 8, 4、Orientationを90, 0, 0に設定したCylinder 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()が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メカニクスをプレイテストする
ドロップダウンからテストを選択し、プレイをクリックします。キャラクターをコインに触れさせます。すべてが正常に動作していれば、コインが消え、出力ウィンドウにプレイヤーがコインを収集しましたと表示され、10秒後にコインが再び現れます。
