ブラスターの動作を実装することは、プレイヤーがシューティングゲームの体験で爆発メカニックを使用するプログラミングプロセスです。 プレイヤーは、単一クリックまたはボタンのプッシュで爆発できますが、満足して正確な爆発動作を作成することは、プレイヤーのゲームプレイを向上させるために重要です。
参照として使用する サンプルレーザータグエクスペリエンス は、ブラスターの動作を 2 種類の異なるタイプのブラスターに実装するスクリプトについて、次のスクリプトを教えてください:
- プレイヤーが爆弾ボタンを押すときを検出します。
- 最近、爆発ボタンを押した場合、プレイヤーがブラスターを使用できるかどうかをチェックします。
- 爆発を起動したサーバー、その起源、そしてレーザービームの最終目的を告げる爆発データを生成しています。
- 爆発データのサーバーに通知して、爆発が別のプレイヤーと衝突した場合、適切なアクションを実行できるようにします。
- 各ブラストの間にブラスターをリセットして、ブラスターが再び爆発する前にクールダウンする時間を提供します。
このセクションを完了すると、ブラスターが他のプレイヤーと衝突したときにスクリプトを学び、それぞれのブラスタータイプに対応する健康を減算します。
プレイヤーの入力を検出
ブラスターの動作を実装する最初のステップは、プレイヤーが爆発ボタンを押すときを聞くことです。プレイヤーが爆発ボタンを押すために使用する入力タイプは、エクスペリエンスにアクセスするデバイスによって異なります。たとえば、サンプルレーザータグエクスペリ
このクライアントスクリプトは、ContextActionService を使用して、MouseButton1 と ButtonR2 を爆発アクションにバインドします。これにより、プレイヤーが左マウスボタンを押すかゲームパッド
ユーザー入力ハンドラー
ContextActionService:BindAction("_", onBlasterActivated, false,Enum.UserInputType.MouseButton1,Enum.KeyCode.ButtonR2)
重要な注意の別のは、 Enum.UserInputState.Begin 定義の中で <code>UserInputState.Begin</code> を使用することです。多くのユーザーインターフェイスインタラクション、例えばこの例のブラスターの選択、は、マウスボタンが <code>
デモを示すには、Enum.UserInputState.Begin をEnum.UserInputState.End に変更し、ブラストの影響をゲームプレイにどのように反映するかをプレイテストしてください。たとえば、プレイヤーがボタンを押しながら爆発をトリガーしないで、エクスペリエンスのゲームプレイをどのように
ユーザー入力ハンドラー
local function onBlasterActivated(_actionName: string,
inputState: Enum.UserInputState, _inputObject: InputObject)
if inputState == Enum.UserInputState.End then -- 更新された行、戻戻るを確認してください
attemptBlastClient()
end
end
プレイヤーが爆破できるかどうかチェック
After UserInputHandler ボタンプレスまたは画面タップを検出した後、 ReplicatedStorage > <
canLocalPlayerBlast
local function canLocalPlayerBlast(): boolean
return localPlayer:GetAttribute(PlayerAttribute.blasterStateClient) == BlasterState.Ready
end
If you
このわずかな一時停止は、あなたがクリックできるのと同じくらい速く爆破できるようにするためにあります。たとえば、関数を常に true に変更すると、レーザータグゲームプレイにおける爆発を迅速にすることができます。
canLocalPlayerBlast
local function canLocalPlayerBlast(): boolean
return true -- 更新された行、戻戻るを確認してください
end
爆発データを生成する
プレイヤーのブラスターが Ready 状態であることを確認した後、attemptBlastClient は ReplicatedStorage > 1> attemptBlastClient1> > 4> blastClient</
次のステップは、爆発データを生成することです。 ReplicatedStorage > Blaster > BlastData を見ると、各爆発には 3つの情報のパーツが含まれていることがわかります:
- 爆発を起動するプレイヤー。
- 爆発の起源を表す DataType.CFrame。
- レーザービームの最終目的地とヒットプレイヤーを含む RayResult、他のプレイヤーにヒットする場合。
このデータを生成するには、blastClient は ReplicatedStorage を呼び出し、attemptBlastClient 、2>blastClient2> 、5>blastData5> をレビューします。これらは以下で見ることができます。
爆発データを生成する
local function generateBlastData(): BlastData.Type
local blasterConfig = getBlasterConfig()
local rayDirections = getDirectionsForBlast(
currentCamera.CFrame, blasterConfig)
local rayResults = castLaserRay(
localPlayer, currentCamera.CFrame.Position, rayDirections)
local blastData: BlastData.Type = {
player = localPlayer,
originCFrame = currentCamera.CFrame,
rayResults = rayResults,
}
return blastData
end
この関数は、getBlasterConfig を使用してプレイヤーのブラスタータイプを取得し始めます。サンプルは、幅広の横長スプレッドを持つ複数のビームを生成する 1つのビームを生成する を提供します。 ReplicatedStorage > インスタンス > 1>L
その後、機能は currentCamera.CFrame を爆発の起点として使用し、getDirectionsForBlast に移動します。この時点で、コードはブラスタ
サーバーに通知する
blastClient が爆発のデータを完了したとき、2つのイベントが発生します:
爆発クライアント
local laserBlastedBindableEvent = ReplicatedStorage.Instances.LaserBlastedBindableEventlocal laserBlastedEvent = ReplicatedStorage.Instances.LaserBlastedEventlaserBlastedBindableEvent:Fire(blastData)laserBlastedEvent:FireServer(blastData)
Class.BindableEvent は、他のクライアントスクリプトを爆発の知らせにします。たとえば、 ReplicatedStorage > FirstPersonBlasterVisuals は、ブラストアニメーションとクールダウンバーを表示
レーザーブラストハンドラー
local function onLaserBlastedEvent(playerBlasted: Player, blastData: BlastData.Type)
local validatedBlastData = getValidatedBlastData(playerBlasted, blastData)
if not validatedBlastData then
return
end
if not canPlayerBlast(playerBlasted) then
return
end
blastServer(playerBlasted)
processTaggedPlayers(playerBlasted, blastData)
for _, replicateToPlayer in Players:GetPlayers() do
if playerBlasted == replicateToPlayer then
continue
end
replicateBlastEvent:FireClient(replicateToPlayer, playerBlasted, blastData)
end
end
チェートを防止するために、サーバーは各クライアントが送信するすべてのデータを検証する必要があります。これには、次のチェックが含まれます:
- Is BlastData はテーブルですか? Class.CFrame という名前の別のテーブルが含まれていますか?
- プレイヤーはブラスターを装備していますか?
- プレイヤーは世界内にキャラクターと場所を持っていますか?
- 爆発データを送信した後、プレイヤーはレーザービームを爆破した場所から過剰な距離を移動しましたか?
この最後のチェックでは、ジャッジコールが含まれており、サーバーのラテンシーとプレイヤーの移動速度により、異なる値が自分のエクスペリエンスに不適切である可能性があります。このジャッジコールを実装するには、getValidatedBlastData にプリントステートメントを追加し、サーバーのラテンシーとプレ
getValidatedBlastData を取得
local distanceFromCharacterToOrigin = blastData.originCFrame.Position - rootPartCFrame.Positionprint(distanceFromCharacterToOrigin.Magnitude) -- 更新された行、必ず削除してくださいif distanceFromCharacterToOrigin.Magnitude > ToleranceValues.DISTANCE_SANITY_CHECK_TOLERANCE_STUDS thenwarn(`Player {player.Name} failed an origin sanity check while blasting`)returnend
移動し、爆発するときに、出力を注意してください。これは、次のように見えるかもしれません:
1.90196299552917483.15495586395263672.57428836822509774.80445861816406252.6434271335601807
ReplicatedStorage > PlayerStateHandler > トグルプレイヤー移動 > 1> togglePlayerMovement1> で、移動速度を上げると、ブラスト間の多くの失敗したチェックに遭遇する可能性があります。
プレイヤーの移動を切り替える
local ENABLED_WALK_SPEED = 60 -- updated line, be sure to change back
サーバーはフォロー中の操作を実行します:
- 有効な rayResults を検証します。
- プレイヤーが爆破できるかどうかをチェックします。
- ブラスター状態をリセットします。
- タグされたプレイヤーの体力を減少させます。
- 他のプレイヤーがサードパーソンビューを見ることができるように、爆発をすべての他のプレイヤーにレプリケートします。
これらのサーバーオペレーションに関する詳細は、「ヒットの検出」セクションのチュートリアルを参照してください。
ブラスターをリセット
サンプルレーザータグ体験では、ブラスターはヒートメカニックを使用します。設定された爆発数後に再読み込む必要はありませんが、各爆発間に「クールダウン」する必要があります。この冷却遅延は、クライアント ( blastClient とサーバー ( blastServer の両方で発
爆発サーバー
local blasterConfig = getBlasterConfig(player)
local secondsBetweenBlasts = blasterConfig:GetAttribute("secondsBetweenBlasts")
task.delay(secondsBetweenBlasts, function()
local currentState = player:GetAttribute(PlayerAttribute.blasterStateServer)
if currentState == BlasterState.Blasting then
player:SetAttribute(PlayerAttribute.blasterStateServer, BlasterState.Ready)
end
end)
secondsBetweenBlasts 属性は、 ReplicatedStorage > インスタンス > 1>LaserBlastersFolder1> のブラスター構成の一部です。4>secondsBetweenBlasts4> 遅延が完了すると、プレイヤーは再び爆破でき、プロセ
この時点で、プレイヤーはスポーンとリスポーン、照準と爆発、を生成できますが、エクスペリエンスはまだ各爆発の結果を決定する必要があります。 チュートリアルの次のセクションで、 スプレーの能力をプログラミングして、ブラスターが他のプレイヤーをヒットするときに適切なプレイヤーの体力を減少するように設定します。