In-experience インスタンスストリーミング は、Roblox エンジンが世界の地域で 3D コンテンツと関連するインスタンスをダイナミックに読み込み、取り外すことができます。これにより、複数の方法でプレイヤーの体験を向上させることができます。たとえば:
- より速い参加時間 — プレイヤーは、世界のほとんどの部分でプレイを開始できますが、世界のほとんどの部分がバックグラウンドで読み込まれるときにプレイを開始できます。
- メモリ効率 — コンテンツがダイナミックにストリームされ入れ替わるため、デバイスのメモリが少なくなります。より没入感のあるおよび詳細な世界をより多くのデバイスで再生できます。
- パフォーマンスの向上 — サーバーが世界とプレイヤーの間で変更を同期するのにかかる時間とバンドウィドを減少させ、より高速でパフォーマンスを向上させます。クライアントは、プレイヤーに関連しないインスタンスを更新するのに少なく履行間を費やします。
- 詳細レベル — 遠くのモデルと地形は、クライアントにストリームされていない場合でも、見えるようになります。これにより、バックグラウンドビューを完全に犠牲にすることなく、エクスペリエンスを最適化できます。
配信を有効化中
インスタンスストリーミングは、ストリーミング有効 プロパティの Studio の ワークスペースオブジェクト を通じて有効になります。このプロパティはスクリプトで設定できません。ストリーミングは、新しい場所を Studio で作成した場合、デフォルトで有効になります。
有効にすると、次のプラクティスに従うことをお勧めします:
- クライアントは通常、 Workspace をローカルに完全に持っていることはないので、適切なツール/APIを使用してインスタンスが存在することを確認してください。たとえば、 LocalScript 、 instнциe streaming
- Class.Workspace 以外の 3D コンテンツの配置を最小限に抑えます。ReplicatedStorage や ReplicatedFirst などのコンテナ内のコンテンツは、ストリーミングに不適切であり、メモリ使用率を悪用する可能性があります。
- エクスペリエンスで ReplicationFocus を使用しない場合、プレイヤーの Player.Character のみを設定してください。これらの場合、フォーカスがプレイヤーがコンテンツをストリームする領域の近くのオブジェクト(オブジェクト)に設定されていることを確認してください
技術的な動作
ストリーミング中
デフォルトでは、インスタンスストリーミングを有効にしたエクスペリエンスにプレイヤーが参加すると、Workspace のインスタンスはクライアントにレプリケートされますが、フォロー中のことを除きます:
- 上記のインスタンスの子孫
- インスタンスを非増減で複製する
その後、ゲームプレイ中、サーバーは必要なインスタンスをクライアントにストリームするかもしれません、必要に応じて。
モデル動作
モデルは、Atomic ストリームなど、特別な動作を 特殊ルール で設定しないと、デフォルトモデルは モデルストリームコントロール で送信されます。しかし、1>モデルストリームコントロール1> が 4>デフォルト
Class.Model コンテナは、 デフォルト / レガシー に設定されているとき、1> Class.Script|Scripts1> などの非スペースディスコンテナがクライアントにレプリケートされます。その後、4>
ストリーミングアウト
ゲームプレイ中、クライアントは Workspace の領域と BaseParts を含む、基于 StreamOutBehavior の動作セットに基づいて流出します。プロセス
インスタンスがストリームアウトすると、nilに親接されるため、既存の Luau 状態がインスタンスストリームバックにより再接続されます。結果、Class.Instance.
ストリームアウトをさらに予測するために、これらのシナリオを調べてください:
シナリオ | 例 | ストリーミング動作 |
---|---|---|
パーツは、Class.LocalScript 内の Instance.new() を通じてローカルで作成されます。 | 「旗を取れ」ゲームで、青のチームのすべてのプレイヤーに青いヘルメットパーツを作成し、LocalScript を通じて青のチームのすべてのプレイヤーに付ける。 | パーツはサーバーにレプリケートされず、ストリーミングされない を除きます パーツがサーバーに存在する場合、例えばプレイヤーのキャラクターモデル内のパーツなど。 |
パーツは ローカルにクローンされる ReplicatedStorage を通じて Instance:Clone() を 1> Class.LocalScript1> でクローンします。 | ウィザードキャラクターは、Tool を有効にすると、Class.ReplicatedStorage 内の複数の ReplicatedStorage オブジェクトをクローンし、ウィザードの位置のワークスペースに親付けます。 | パーツはサーバーにレプリケートされず、サーバーでストリーミングされる必要はありません。 |
パーツは Class.ReplicatedStorage からワークスペースに ReplicatedStorage を通じて再親化されます。 | 「魔法使いの帽子」は ReplicatedStorage に保存されます。当プレイヤーが魔法使いのチームに参加すると、帽子は LocalScript を通じてそのキャラクターモデルに移動されます。 | パーツはサーバーからストリーミングされるため、ReplicatedStorage にストリーミングされます。このパターンを避けて、クローン パーツをストリーミングすることを避けてください。 |
モデル動作
ModelStreamingBehavior を Improved に設定すると、エンジンは、ストリーム出力を デフォルト に設定し、ストリームがストリームアウトされると、メモリを 1>非アトミック1>に設定したモデルをストリームアウトし、クライアントのメモリを減少させる可能性があります。
改善された モデルのストリーミング動作は、モデルが 空間 (非アトミック) モデルかどうかに基づいてストリーミングをストリーミングします。1>非空間1> (4> Class.BasePart4> の子�
- 空間モデルの最後の残りの BasePart のストリームが完了すると、モデルの空間部分のいくつかはプレイヤー/レプリケーションの焦点に近いため、完全にストリームアウトします。一部は遠くにあります。
- 非空間モデルは、祖先がストリームアウトするときにのみストリームアウトされ、レガシーストリームアウト動作と同等の動作を実装します。
アセンブリとメカニズム
Class.Assembly のオープンストリームには、 Class.Assembly のすべてのパーツがストリームされます。しかし、 Class.Assembly アンカー 部品のあるアセンブリは、単に アンカー 部品のないアセンブリと扱われます。
アセンブリ構成 | ストリーミング動作 |
---|---|
アンカー部品のみ | アセンブル全体は、アトム単位として送信されます。 |
ルートパーツ をアンカー | ストリームされたパーツをルートパーツにリンクするために必要なパーツ、アタッチメント、および制限のみがストリームされます。 |
遅延時間
サーバー上でパートが作成されるとクライアントにレプリケートされるまでに~10ミリ秒程度の遅延が発生する場合があります。これらのシナリオの各スケースでは、WaitForChild() などの技術を使用する必要があり、パートストリーミングが常に同じ時間に発生すると仮定するこ
シナリオ | 例 | ストリーミング動作 |
---|---|---|
A LocalScript は、サーバーを呼び出してパーツを作成する RemoteFunction を作成します。 | プレイヤーは、Tool をローカルに有効にして、すべてのプレイヤーが見ることができ、インタラクトできるサーバーの部分を生成します。 | リモート関数がクライアントに戻ると、部品はまだ存在しない場合がありますが、部品がクライアントの焦点とストリームエリアの近くにあります。 |
サーバー上のキャラクターモデルに Script を通じて、RemoteEvent をクライアントに発動させます。 | プレイヤーが警察チームに参加すると、ServerStorage に保存された「警察バッジ」部分がクローンされ、プレイヤーのキャラクターモデルに付けられます。RemoteEvent が発動し、ローカル UI エレメントを更新するために、クライアントによってClass.RemoteEvent が発射されます。 | クライアントがイベント信号を受信している場合でも、部品がすでにそのクライアントにストリームされている保証はありません。 |
パーツがサーバーの不可視な領域と衝突し、クライアントで RemoteEvent をトリガーします。 | プレイヤーがサッカーボールをゴールに入れると、「ゴール得点」イベントがトリガーされます。 | ゴールに近い他のプレイヤーは、ボールがストリームされる前に「ゴール得点」イベントを見ることがあります。 |
ストリーミングプロパティ
次のプロパティは、インスタンスストリーミングがエクスペリエンスにどのように適用されるかを制御します。これらのプロパティはすべて スクリプト不可能 であり、Studio の ワークスペースオブジェクト に設定する必要があります。
モデルストリーミング動作
プレイヤーが参加するときに デフォルト ( 非アトミック ) モデルがレプリケートされるかどうかを制御します。このプロパティを 強化 に設定すると、1> Class.Workspace1> のモデルは、必要に応じてのみクライアントに送信
ストリーミング統合モード
プレイヤーがストリームされていない地域に移動すると、エクスペリエンスが不意に悪用される可能性があります。ストリーミング完全性 機能は、これらの潜在的に問題的な状況を避ける方法を提供します。詳細は、Enum.StreamingIntegrityMode ドキュメントを参照してください。
ストリーミングミニラジウス
StreamingMinRadius プロパティは、プレイヤーのキャラクター (または ReplicationFocus ) の周りのストリームが最高優先度でストリームされるインスタンスを指します。デフォルトを増加すると、メモリとサーバーバンドウィドを費やしてしまうため、デフォルトを増加すること
ストリーミングターゲットラジウス
StreamingTargetRadius プロパティは、プレイヤーのキャラクター (または ReplicationFocus からストリームする場合の最大距離を制御します。エンジンは、目標範囲を超えた以前に読み込まれたインスタンスを保持することができます。注意、エンジンは、メモリー許可により、ターゲット範囲を超えた以前に
より小さい StreamingTargetRadius は、サーバーが設定された値を超えて追加のインスタンスをストリームすることはできないため、サーバーのワークロードが減少します。ただし、ターゲット範囲は、プレイヤーがエクスペリエンスの詳細を完全に見ることができる距離ですので、これらの間のバランスを最大限に捕捉する必要があ
ストリームアウトビーハブ
StreamOutBehavior プロパティは、次の値の 1 つに従って、配信を中止する 動作を設定します:
設定 | ストリーミング動作 |
---|---|
デフォルト | デフォルトの動作は、現在 LowMemory と同じです。 |
LowMemory | クライアントは、メモリの状況が悪いときのみパーツをストリームし、最小限の範囲が存在するまで 3D コンテンツを削除する可能性があります。 |
機会主義者 | StreamingTargetRadius 以外の領域のリージョンは、メモリプレッシャーがない状態でクライアントに削除されることができます。このモードでは、クライアントはターゲット範囲以外のインスタンスを削除しません。 |
モデルごとのストリーミングコントロール
グローバルにおいて、ModelStreamingBehavior プロパティは、モデルが参加するときにストリームされる方法を制御することができます。さらに、WaitForChild() のストリームを通じて、モデルとその子��
デフォルト/非アトミック
Class.Model が デフォルト または 非アトミック に設定されると、ストリーミング動作は 1>モデルストリーミング動作1> が 4>デフォルト4> ( 7>レガシー7> ) または 9>改善9> に設定されているかにより
モデルストリーミング動作 | 技術的な動作 |
---|---|
デフォルト ( レガシー ) | プレイヤーが参加すると、モデルがレプリケートされます。これにより、読み込み中により多くのインスタンスが送信され、メモリ内のインスタンスが保存され、「LocalScript」内のスクリプトにアクセスできるようになります。たとえ |
改善された | モデルは、必要なときにのみ送信され、潜在的に参加時間を加速させる可能性があります。 |
詳細は、技術的動作を参照してください。
アトミック
Class.Model が アトミック に変更された場合、BasePart が資格ありとなると、モデル自体でインスタ
アトミックモデルは、すべての後継部分がストリーミングに資格するときにのみストリームされます。その時点で、モデル全体がストリームされるようになります。如果アトミックモデルの一部のみがストリームされる場合、モデル全体とその後継部分はすべてクライアントに残ります。
ローカルスクリプト
-- Atomic モデルはロード時に存在しません; 子を待つを使用してくださいlocal model = workspace:WaitForChild("Model")-- 下位のパーツはモデルと一緒にストリームされ、すぐにアクセス可能ですlocal meshPart = model.MeshPartlocal part = model.Part
持続
持続 モデルは、通常のストリーミングには影響を受けません。彼らはプレイヤーが参加し、Workspace.PersistentLoaded イベントが発動
ローカルスクリプト
-- Persistent モデルはロード時に存在しません; 子を待つを使用してくださいlocal model = workspace:WaitForChild("Model")-- 下位のパーツはモデルと一緒にストリームされ、すぐにアクセス可能ですlocal meshPart = model.MeshPartlocal part = model.Part
持続的なパープレイヤー
モデルが PersistentPerPlayer に設定されているため、Persistent の動作は同じです。For other players, behavior is the same as Model:AddPersistentPlayer() 。You can revert a model from player persistence via 1> Class.Model:RemovePersistentPlayer()1> .
エリアストリーミングをリクエストする
プレイヤーのキャラクターの CFrame を現在読み込んでいない地域に設定すると、ストリーミングパウズ が発生します。Player:RequestStreamAroundAsync() を有効にすると、サーバーが特定のエリアに移動するようにリクエストできます。
次のスクリプトは、リモートイベントをクライアントからサーバーに発射して、プレース所内のプレイヤーをテレポートする方法を示しています。ストリーミングリクエストの前にキャラクターを新しい CFrame に移動すると、リモートイベント が発動します。
スクリプト - プレイヤーキャラクターをテレポート
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local teleportEvent = ReplicatedStorage:WaitForChild("TeleportEvent")
local function teleportPlayer(player, teleportTarget)
-- ターゲットの場所でストリーミングをリクエストする
player:RequestStreamAroundAsync(teleportTarget)
-- キャラクターをテレポート
local character = player.Character
if character and character.Parent then
local currentPivot = character:GetPivot()
character:PivotTo(currentPivot * CFrame.new(teleportTarget))
end
end
-- クライアントがリモートイベントを発射するときにテレポート機能を呼び出す
teleportEvent.OnServerEvent:Connect(teleportPlayer)
ローカルスクリプト - リモートイベントをファイア
local ReplicatedStorage = game:GetService("ReplicatedStorage")local teleportEvent = ReplicatedStorage:WaitForChild("TeleportEvent")local teleportTarget = Vector3.new(50, 2, 120)-- リモートイベントを発射するteleportEvent:FireServer(teleportTarget)
インスタンスストリーミングを検出中
オブジェクトがストリームされるかストリームされないかを検知し、そのイベントに反応する必要があります。ストリーム検知の便利なパターンは次のとおりです:
インスタンスのプロパティの タグ セクション、または Studio の タグエディタ を使用して、影響を受けるすべてのオブジェクトに論理的な CollectionService を割り当てます。
単一の LocalScript から、タグ付きのオブジェクトが Class.CollectionService:GetInstanceAddedSignal()|GetInstanceAddedSignal() および Class.CollectionService:GetInstanceRemovedSignal()|Class.CollectionService:GetInstanceRemovedSignal() を通じてストリームされると、その
ローカルスクリプト - コレクションサービスのストリーミング検出local CollectionService = game:GetService("CollectionService")local tagName = "FlickerLightSource"local random = Random.new()local flickerSources = {}-- 現在および新しいタグ付きのパーツのストリーミングを検出するますfor _, light in CollectionService:GetTagged(tagName) doflickerSources[light] = trueendCollectionService:GetInstanceAddedSignal(tagName):Connect(function(light)flickerSources[light] = trueend)CollectionService:GetInstanceRemovedSignal(tagName):Connect(function(light)flickerSources[light] = nilend)-- フリッカーループwhile true dofor light in flickerSources dolight.Brightness = 8 + random:NextNumber(-0.4, 0.4)endtask.wait(0.05)end
一時停止画面のカスタマイズ
プロパティ Player.GameplayPaused は、プレイヤーの現在の一時停止状態を示します。このプロパティは、GetPropertyChangedSignal() のカスタムGUIを表示または非表示にするための接続で使用できます。
ローカルスクリプト
local Players = game:GetService("Players")
local GuiService = game:GetService("GuiService")
local player = Players.LocalPlayer
-- デフォルトの一時停止モーダルを無効にする
GuiService:SetGameplayPausedNotificationEnabled(false)
local function onPauseStateChanged()
if player.GameplayPaused then
-- カスタムGUIを表示
else
-- カスタムGUIを非表示にする
end
end
player:GetPropertyChangedSignal("GameplayPaused"):Connect(onPauseStateChanged)
詳細レベルのモデル
ストリーミングが有効になっているとき、 Models 現在ストリーミングされているエリア外ではデフォルトで見えません。しかし、LevelOfDetail プロパティのあるモデルの場合、エンジンによって「imposter」メッシュの低解像度をレンダリングするように構成する
モデル設定 | ストリーミング動作 |
---|---|
ストリーミングメッシュ | クライアントがモデルを表示しない場合に、偽者のメッシュをアセンクロして表示するようになります。 |
無効化済み / 自動化済み | ストリーミング範囲の外になると、モデルは消えます。 |
偽者のメッシュを使用するときは、フォロー中のことに注意してください:
- 偽者のメッシュは、カメラから 1024 スタッドス またはさらに遠くに見えるように設計されています。如果StreamingTargetRadiusを 256 以下に減少した場合、偽者のメッシュは、モデルに置き換えるモデルのビジュアルに容量がありません。
- モデル その後のモデルはすべて StreamingMesh に設定されていますが、上位レベルの祖先モデルのみが オーバーライドマッシュ としてレンダリングされ、その後のモデルもすべて 1> オーバーライドマッシュ1> としてレンダリングされます。パフォーマンスの
- テクスチャはサポートされていません。偽者のメッシュは、滑らかなメッシュとしてレンダリングされます。
- Class.Model が完全にストリームされるのではなく、偽者のメッシュ がモデルの個々のパーツではなく、インポスターメッシュがレンダリングされます。すべての個々のパーツがストリームされると、偽者のメッシュ がレンダリングされ、1>偽者のメッシュ1> が無視されます。
- 偽者のメッシュには物理的意味がありませんが、レイキャスト、衝突検知、および物理シミュレーションに関しては存在しません。
- Studio のモデルを編集することで、子パーツを追加/削除/位置を変更するなど、モデルを自動的に更新することがあります。