実行コントロール
概要
SimulationBehaviour
およびNetworkBehaviour
の派生コンポーネントは、コードの条件付き実行に使用できるプロパティを公開します。
またSimulationBehaviourAttribute
は、特定のシミュレーションループ(Stage)やピアタイプ(Mode)に対して、FixedUpdateNetwork()
コールバックを条件付きで完全に無効化するために使用されることもあります。
Network Runner Conditionals
シミュレーションループ参照
シミュレーションステージ
これらのプロパティは FixedUpdateNetwork()
コールバックの内部でのみ有効で、シミュレーションループ全体に関連してシミュレーションされている現在のティックに関する情報を取得するために使用できます。
Runner.IsResimulation
: 現在のティックは以前にシミュレーションされたもので、クライアント予測調整の一環として現在再度シミュレーション中。Runner.IsForward
: 現在のティックは初回のシミュレーション中。Runner.IsFirstTick
: 現在のティックは、ResimulationまたはForward Loopの最初のティック。Runner.IsLastTick
: 現在のティックは、ResimulationまたはForward Loopの最後のティック。
C#
public override void FixedUpdateNetwork()
{
if(Runner.IsResimulation)
{
// execute code only if this tick has already been simulated before
}
if(Runner.IsForward && Runner.IsFirstTick)
{
// execute code only if this is the first tick of the forward simulation loop
}
}
備考: IsFirstTick
と IsLastTick
はFusionのSimulation Loop中に2回trueになる可能性があります。 再シミュレーションが可能な場合(サーバーモードのクライアント)、これらのプロパティを Runner.IsForward
または Runner.IsResimulation
と共に使用して、どちらのループかを決定する必要があります。
備考: ループ内で処理されているティックが1つだけの場合、シミュレーションされたティックは IsFirstTick
と IsLastTick
の両方であることが可能です。これは通常、Forward Simulation Loopの場合です。
シミュレーションモード(ピアタイプ)
これらのプロパティは、Spawned()が呼び出された後のすべてのタイミングセグメントで有効です。
Runner.IsServer
: Runnerは、あらゆるタイプのサーバーピア(Dedicated、Host、またはShared Modeプラグイン)を表す。Runner.IsHost
: Runnerは、サーバーがローカルプレイヤーと対になることを表す。Runner.IsClient
: Runnerは、サーバーがクライアントピアと対になることを表す。Runner.IsPlayer
: RunnerはGameSessionのPlayerを表す。ホストとクライアントの場合はTrue、非ホストサーバーの場合はFalseとなる。Runner.IsSharedModeMasterClient
- (Sharedモードでのみ有効) Runnerがマスタークライアントとしてフラグされる。
C#
public override void FixedUpdateNetwork()
{
if(Runner.IsServer)
{
// Execute code only on the game server
}
}
SimulationBehaviourAttribute
コールバック内で上記のプロパティをテストする代わりに、SimulationBehaviour
クラス全体を [SimulationBehaviour]
属性を使って FixedUpdateNetwork()
の実行から条件付きで除外することも可能です。
[SimulationBehaviour(Stages= )]
:SimulationStages
enum フラグを指定し、FixedUpdateNetwork()
が Resimulation Loop と Forward Loop のどちらで呼び出されるかを指定します。デフォルトの0は、Stages = SimulationStages.Resimulation | SimulationStages.Forward
として扱われます。.SimulationBehaviour(Modes= )]
:SimulationModes
enum フラグを指定し、FixedUpdateNetwork()
が特定のピアタイプでのみ呼び出されるようにするかどうかを指定します。デフォルトの0はすべてのフラグが設定されているものとして扱われます。
C#
[SimulationBehaviour(
Stages = SimulationStages.Forward,
Modes = SimulationModes.Server | SimulationModes.Host
)]
public class TestNetworkBehaviour : NetworkBehaviour, IBeforeAllTicks
{
public override FixedUpdateNetwork()
{
// This will only execute if Runner.IsForward and if Runner.IsServer
}
}
備考: SimulationModes
は enum フラグであり、Server と Host は別物として扱われます。すべてのサーバタイプを含めるには、この2つを結合します (SimulationModes.Server | SimulationModes.Host
).
接続タイプ
これらのメンバーは ConnectionType
(Relayed, Direct, None) を返し、クライアントがサーバに直接接続しているか、あるいはメッセージがPhoton Cloudを介してリレーされているかを示します。
Runner.CurrentConnectionType
:Runner
がクライアントの場合、サーバとの接続のタイプを返す。Runner
がクライアントでない場合は、ConnectionType.None
を返す。Runner.GetPlayerConnectionType(PlayerRef player)
:Runner
がサーバーの場合、これはクライアント (PlayerRef で識別) がこのランナーに対して持っている接続のタイプを返す。Runner
がサーバーでない場合、ConnectionType.None
を返す。
C#
public override void Spawned()
{
if(Runner.CurrentConnectionType == ConnectionType.Relayed)
{
// Special handling for cases where messages to and from
// this peer are being relayed through the Photon server.
}
}
ゲームモード (トポロジー)
Runner.GameMode
値は、ゲームセッションのトポロジーに基づいて選択的にコードを実行するために使用することができます。ほとんどの場合、このページで説明する他の条件式の方がより適切であるため、これは必要ありません (Runner.IsServer
や Runner.IsClient
など)。しかし、Single Playerのような特定のゲームモードに対して特別な処理を行う場合もあります。
C#
if(Runner.GameMode == GameMode.Single)
{
// Execute code only if in running as single player
// Note that this value can be cached,
// as it cannot change once the Runner has been started.
}
if(Runner.GameMode == GameMode.Shared)
{
// Execute code only if running in shared mode.
// Typically this is only useful for testing,
// if you have code designed to work in both Server and Shared Modes.
}
ネットワークオブジェクト条件式
オブジェクト権限
HasStateAuthority
: 関連するObject.Runner
はこのNetworkObject
に対するステート権限がある。HasInputAuthority
: 関連するObject.Runner
はこのNetworkObject
に対する入力権限がある。IsProxy
:関連する NetworkRunner は、このNetworkObject
に対して入力権限もステート権限もない。(このオブジェクトの入力は、このピアでは利用できません)。
C#
if(HasStateAuthority)
{
// Execute only if the associated Runner has state authority over this object
}
備考: これらのプロパティは、関連する NetworkObject
が有効である場合にのみ有効です(NetworkObject
ごとの権限。オブジェクトが有効でない場合、これらのプロパティは例外やログ警告を発生させることなく、すべて false を返します。ネットワークオブジェクトが無効である可能性があり、それを考慮する必要がある場合は、Object.IsValid
を使用してください。
その他のオブジェクト条件式
Object.IsValid
: 関連するNetworkObject
はNULLではなく、アクティブなNetworkRunner
にアタッチされる。Object.IsInSimulation
: 関連するNetworkObject
は現在、その関連するSimulationに参加している。Object.IsSceneObject
: 関連するNetworkObject
が、NetworkRunner.Spawn()
操作で作成されたのではなく、シーンの一部としてネットワーク状態にアタッチされていた。