3D 世界を持っていることになると、このチュートリアルのセクションでは、コインの収集メカニズムを定義する方法を学びます。このメカニズムは、プレイヤーがコインを集めることを許可し、最近収集されたコインを無効にします。
コインを作成する
何もスクリプトできる前に、コインとして使用するために世界にプレースホルダーオブジェクトが必要です。例え、前のセクションで作成した海賊スタックプラットフォームのように、コインはシンプルな Part オブジェクトです。
コインを作成するには:
In the エクスプローラー window, add a new フォルダ into the ワールド フォルダ, then rename it コイン .
コインフォルダに シリンダー部分を挿入する 、そして コイン にパートを名前変更します。
パーツを選択し、 プロパティ ウィンドウで、
- Set BrickColor to Gold 。
- Set 素材 を 金属 に設定します。
- サイズ を 0.6、8、4 に設定します。
- 無効にする CanCollide 。これはエンジンに他のパーツがコインを通過できるようになるためのコインで、プレイヤーがコインを通過してコレクションに追加できるようになります。
- 固定 を有効にする。これは、エンジンがどのような物理的シミュレーションに対応するかに関わらず、コインの位置を変更しないことをエンジンに伝えます。これは、プレイヤーがコインの位置に影響を与えないことを意味します。
コインをいくつか追加し、マップ上に配置してテスト用に使用します。
シリンダーパーツはコインのように見え、物理シミュレーションを防止しますが、コインにロジックを追加して、プレイヤーがコインを集めることができるようにする必要があります。
スクリプトの作成
コインを集められるようにするには、プレイヤーが触れるとコインを集めるようになります。Roblox エンジンは、コインに何かが触れたときに通知してください。ただし、スクリプトでそれを宣言する必要があります。スクリプトを作成するには:
In the Explorer ウィンドウ, ServerScriptService の上にマウスポインタを置き、 ⊕ ボタンをクリックします。コンテキストメニューが表示されます。
コンテキストメニューから スクリプト を選択します。サーバースクリプトサービスの下に新しいスクリプトが表示され、エンジンがサーバーでスクリプトを実行させ、クライアントがコードにアクセスできないようにします。
スクリプトを CoinService に名前変更します。
次のコードをデフォルトコードと交換します:
-- サービスと変数の初期化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("Player collected coin")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 秒間消え、そして出力ログに Player collected coin が印刷されます。
コード説明次のセクションでは、スクリプトの作動方法を説明します。
サービスと変数の初期化
他の言語で作成したコードと同様に、変更可能な変数をスクリプトのトップに定義します。私たちのコードはフォロー中のことを行います:
コインのオブジェクトにアクセスするための参照をすべて入手する - スクリプトは次に 3D ワークスペースからコインオブジェクトの参照をすべてのコインオブジェクトに GetChildren() メソッドでクエリーします。このメソッドは、以前に作成
グローバル変数を定義します - COOLDOWN 変数は、コインが収集された後にどれくらい長く無効にするかを定義するために使用されます。
サービスと変数の初期化local Workspace = game:GetService("Workspace")local Players = game:GetService("Players")local coinsFolder = Workspace.World.Coinslocal coins = coinsFolder:GetChildren()local COOLDOWN = 10...
イベントハンドラーを定義する
Roblox エンジンは、3D 世界を物理的にシミュレートし、レンダリング、物理、およびネットワークに関連するイベントを処理するためのロジックを多くの処理を処理します。当該イベントのスクリプトを作成するために、エンジンはコーヒンタイム、
コインが有効かどうかを検出します - すべての Instance には、3D 世界にオブジェクトが存在するかどうかを定義する Enabled ブールストラティビティが含まれています。Enabled メソッドを使用してインスタンス属性を取得できます。
コインがタッチされたかどうかを検出するから。 - コインが有効になっている場合、メソッドはプレイヤーサービスを使用してコインがタッチしたオブジェクトが本当にプレイヤーであるかをチェックします。タッチイベントが発生すると、Roblox エンジンはコイン
コインをタッチした場合、プレイヤーが 10 秒後に再び有効化するようにします。 - 最終的に、プレイヤーがコインをタッチした場合、メソッドはコインを無効にし、10秒後に再び有効化します。task.wait()
イベントハンドラーを定義する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("Player collected coin")task.wait(COOLDOWN)coin.Transparency = 0coin:SetAttribute("Enabled", true)endendend
イベントハンドラーを接続する
すべてのシミュレートされた 3D オブジェクトは BasePart から継承され、それゆえ Touched() イベントがあります。次のループは、onTouchedEvent() ハンドラーをすべてのコインのタッチイベントに接続するようにしまフォロー中:
コインをすべてループします - ループするコインをすべて使用して、一般的なイテレーションを使用します。
ハンドラーをイベントに接続する - コインは、ループの初期化中にデフォルトで有効になるため、コインは 3D 世界で初期のスタートに表示されます。onCoinTouched() ハンドラーメ
イベントハンドラーを接続するfor _, coin in coins docoin:SetAttribute("Enabled", true)coin.Touched:Connect(function(otherPart)onCoinTouched(otherPart, coin)end)end
メカニックをプレイテスト
コインコレクションメカニズムが期待通りに機能するかどうかを確認する時間です。エクスペリエンスをプレイテストするには:
メニューバーで プレイ ボタンをクリックします。Studio はプレイテストモードに入ります。
キャラクターをコインに触れるように移動します。スクリプトが正しく動作すると、出力 ウィンドウは Player collected coin を表示し、コインは 10秒間消えてから再び表示されます。