실행 제어
개요
SimulationBehaviour
(그리고 확장에 의한 NetworkBehaviour
) 상속 컴포넌트 코드의 조건부 실행에 사용될 수 있는 속성을 노출합니다.
또한 SimulationBehaviourAttribute
는 특정 시뮬레이션 루프(단계) 또는 피어 유형(모드)에 대해 FixedUpdateNetwork()
콜백을 조건부로 비활성화하는 데 사용될 수 있습니다.
NetworkRunner 실행 조건
시뮬레이션 루프 참조
시뮬레이션 단계
이러한 속성은 FixedUpdateNetwork()
콜백 내에서만 유효하며, 전체 시뮬레이션 루프와 관련하여 시뮬레이션 중인 현재 틱에 대한 정보를 가져오는 데 사용할 수 있습니다.
Runner.IsResimulation
- 현재 틱은 이전에 시뮬레이션되었으며 클라이언트 예측 조정의 일부로 지금 다시 시뮬레이션되고 있습니다.Runner.IsForward
- 현재 틱이 처음으로 시뮬레이션되고 있습니다.Runner.IsFirstTick
- 현재 틱은 재시뮬레이션 또는 포워드 루프의 첫 번째 틱입니다Runner.IsLastTick
- 현재 틱은 재시뮬레이션 또는 포워드 루프의 마지막 틱입니다.
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의 시뮬레이션 루프 동안에 한 번은 재시뮬레이션 루프 동안, 한 번은 포워드 루프 동안 두 번 true 일 수 있습니다. 재시뮬레이션이 가능한 경우(서버 모드 내의 클라이언트) 이러한 속성 정보를 Runner.IsForward
또는 Runner.IsResimulation
와 함께 사용해야 합니다
노트: 루프에서 처리 중인 틱이 하나만 있는 경우 시뮬레이션된 틱이 IsFirstTick
과 IsLastTick
모두 될 수 있습니다. 이는 일반적으로 포워드 시뮬레이션 루프의 경우입니다.
시뮬레이션 모드 (피어 타입)
이러한 속성들은 Spawned() 호출된 이후 모든 타이밍 세그먼트 내에서 유효합니다.
Runner.IsServer
- Runner는 모든 유형(전용, 호스트 또는 공유 모드 플러그인)의 서버 피어를 나타냅니다.Runner.IsHost
- Runner는 로컬 플레이어와 함께 서버 피어를 나타냅니다.Runner.IsClient
- Runner는 로컬 플레이어와 함께 클라이언트 피어를 나타냅니다.Runner.IsPlayer
- 러너는 게임 세션에서 플레이어를 나타냅니다. 호스트 및 클라이언트의 경우 True이고, 비호스트 서버의 경우 False입니다.Runner.IsSharedModeMasterClient
- (공유 모드에서만 유효) 러너는 마스터 클라이언트로 플래그가 지정됩니다.
C#
public override void FixedUpdateNetwork()
{
if(Runner.IsServer)
{
// Execute code only on the game server
}
}
SimulationBehaviourAttribute
콜백 내부에서 위의 속성을 테스트하는 대신, [SimulationBehaviour]
속성을 가진 FixedUpdateNetwork()
를 실행하는 데 있어 전체 SimulationBehaviour
클래스를 조건부로 제외할 수 있습니다.
[SimulationBehaviour(Stages= )]
-SimulationStages
열거 플래그를 제공하여 재시뮬레이션 루프 또는 전달 루프 중에FixedUpdateNetwork()
를 호출할지 여부를 지정합니다. 기본값 0은Stages = SimulationStages.Resimulation | SimulationStages.Forward
으로 취급됩니다.SimulationBehaviour(Modes= )]
-FixedUpdateNetwork()
가 특정 피어 유형에서만 호출되어야 하는지를 지정하려면SimulationModes
열거 플래그를 지정하십시오. 기본값 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
는 열거형 플래그이며 서버와 호스트는 별개로 취급됩니다. 모든 서버 유형을 포함하려면 두 서버 유형을 결합합니다(SimulationModes.Server | SimulationModes.Host
).
연결 유형
이 멤버는 ConnectionType
(Relayed, Direct, None)을 리턴하며 이것은 클라이언트가 서버에 직접 연결되어 있는지 또는 Photon Cloud를 통해 메시지가 전달되고 있는지 여부를 나타내는 유형입니다.
Runner.CurrentConnectionType
:Runner
가 클라이언트인 경우 서버에 대한 연결 유형을 리턴합니다.Runner
가 클라이언트가 아닌 경우ConnectionType.None
을 리턴합니다.Runner.GetPlayerConnectionType(PlayerRef player)
:Runner
가 Server인 경우 클라이언트(PlayerRef로 식별됨)가 이 Runner에 가지는 연결 유형을 리턴합니다.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
)이 훨씬 더 적절하기 때문에 이 작업이 필요하지 않습니다. 그러나 싱글 플레이어와 같은 특정 게임 모드에 대한 특수 처리를 원하는 경우도 있습니다.
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.
}
NetworkObject 조건
객체 권한
Object.HasStateAuthority
- 연결된Object.Runner
는 이NetworkObject
에 대한 상태 권한을 가지고 있습니다.Object.HasInputAuthority
- 연결된Object.Runner
는 이NetworkObject
에 대한 입력 권한을 가지고 있습니다.Object.IsProxy
- 연결된 NetworkRunner에는 이NetworkObject
에 대한 입력 권한도 상태 권한도 없습니다(이 개체에 대한 입력을 이 피어에서 사용할 수 없음).
C#
if(Object.HasStateAuthority)
{
// Execute only if the associated Runner has State Authority over this object
}
if(Object.HasInputAuthority)
{
// Execute only if the associated Runner has Input Authority over this object
}
if(Object.IsProxy)
{
// Execute only if the associated Runner has neither State Authority nor Input Authority over this object
}
노트: 이러한 속성은 권한이 NetworkObject
별로 있기 때문에 연결된 NetworkObject
가 유효한 경우에만 유효합니다. 객체가 유효하지 않은 경우 이러한 속성은 예외 또는 로그 경고 없이 모두 false를 리턴합니다. NetworkObject
가 유효하지 않을 수 있으며 이를 고려해야 하는 사용 사례에서는 Object.IsValid
를 사용하세요.
기타 객체 조건
Object.IsValid
- 연결된NetworkObject
가 null이 아니고 활성NetworkRunner
에 붙여지지 않음Object.IsInSimulation
- 연결된NetworkObject
가 현재 연결된 시뮬레이션 내에서 참여 중Object.IsSceneObject
- 연결된NetworkObject
가NetworkRunner.Spawn()
오퍼레이션으로 생성된 것이 아니라 씬의 일부로 네트워크 상태에 붙여짐.