# Photon Fusion 103
Photon Fusion 103은 Photon 홈페이지의 기술문서에 있는 Fusion 튜토리얼 중 한 단계를 말합니다.
# FixedUpdateNetwork
로컬 물리 시뮬레이션에서 MonoBehaviour의 FixedUpdate() 역할을 하는 것이
네트워크 물리 시뮬레이션에서 NetworkBehaviour의 FixedUpdateNetwork()입니다.
각 틱의 시간 간격은 NetworkProjectConfig의 Simulation > Tick Rate에 의해 정의되며, 1/60초의 델타와 같습니다.
NetworkRunner.DeltaTime 으로 접근할 수 있습니다.
따라서 Time.deltaTime이 아니라 Runner.DeltaTime으로 사용합니다.
using Fusion;
public class Ball : NetworkBehaviour
{
public override void FixedUpdateNetwork()
{
transform.position += 5 * transform.forward * Runner.DeltaTime;
}
}
# FixedUpdateNetwork
현재의 볼은 발사된 후 무한대로 이동하기 때문에 일정시간 사라지게 해야합니다.
알아서 틱 단위로 계산해주는 타이머가 TickTimer 입니다.
다음은 TickTimer를 추가하는 기본적인 방법입니다.
[Networked] private TickTimer life { get; set; }
1. TickTimer 클래스 객체를 선언합니다.
2. 비어있는 Getter와 Setter를 추가합니다.
3. [Networked] 속성을 표시합니다.
플레이어가 볼을 발사하면 그 때 볼 객체를 생성하고 Init() 함수를 호출하여 타이머를 작동시킬 계획입니다.
using Fusion;
public class Ball : NetworkBehaviour
{
[Networked] private TickTimer life { get; set; }
public void Init()
{
life = TickTimer.CreateFromSeconds(Runner, 5.0f);
}
public override void FixedUpdateNetwork()
{
if(life.Expired(Runner))
Runner.Despawn(Object);
else
transform.position += 5 * transform.forward * Runner.DeltaTime;
}
}
간단하게 초 단위 타이머, 틱 단위 타이머를 사용할 수 있는데, 볼이 생성된 후 5초간 날아가다가 사라지게 할 것이므로,
CreateFromSeconds를 사용합니다.
타이머가 Expired(만료되면) 하면
SimulationBehaviour의 NetworkRunner로 Despawn하여 없앱니다.
SimulationBehaviour는 MonoBehaviour와 NetworkBehaviour 사이에 있는 클래스 중 하나입니다.
# Spawn Prefab
볼을 생성합니다.
using Fusion;
using UnityEngine;
public class Player : NetworkBehaviour
{
[SerializeField] private Ball _prefabBall;
[Networked] private TickTimer delay { get; set; }
private NetworkCharacterController _cc;
private Vector3 _forward;
private void Awake()
{
_cc = GetComponent<NetworkCharacterController>();
_forward = transform.forward;
}
public override void FixedUpdateNetwork()
{
if (GetInput(out NetworkInputData data))
{
data.direction.Normalize();
_cc.Move(5*data.direction*Runner.DeltaTime);
if (data.direction.sqrMagnitude > 0)
_forward = data.direction;
// 볼의 발사간격을 5초로 제한합니다.
if (delay.ExpiredOrNotRunning(Runner))
{
if ((data.buttons & NetworkInputData.MOUSEBUTTON1) != 0)
{
delay = TickTimer.CreateFromSeconds(Runner, 0.5f);
Runner.Spawn(_prefabBall,
transform.position+_forward, Quaternion.LookRotation(_forward),
// 입력권한이 있는 플레이어의 참조를 리턴합니다.
Object.InputAuthority,
(runner, obj) =>
{
// Spawn이 완료되면 콜백으로 네트워크에 동기화가 될 것인데,
// 그 전에 아래 코드가 실행됩니다.
obj.GetComponent<Ball>().Init();
});
}
}
}
}
}
Spawn() 함수는 프리팹, 위치, 방향은 Instantiate()와 동일한 역할입니다.
'게임 개발 > 유니티' 카테고리의 다른 글
[유니티] Input.GetKey() 한글로 입력해도 동작하게 하고 싶다면 (0) | 2023.01.16 |
---|---|
[유니티/셰이더] 순차적 체커보드 패턴 Procedural checkerboard pattern (1) | 2022.12.24 |
[유니티/셰이더] 커스텀 셰이더 기초 (1) | 2022.12.23 |
[유니티] Photon Fusion 102 간단 요약 (1) | 2022.12.20 |
[유니티] 게임 패널에 GUI 띄우기 (0) | 2022.12.15 |