본문 바로가기

게임 개발/유니티

[유니티] Photon Fusion 103 간단 요약

728x90

# Photon Fusion 103

Photon Fusion 103은 Photon 홈페이지의 기술문서에 있는 Fusion 튜토리얼 중 한 단계를 말합니다.

 

 

# FixedUpdateNetwork

로컬 물리 시뮬레이션에서 MonoBehaviour의 FixedUpdate() 역할을 하는 것이

네트워크 물리 시뮬레이션에서 NetworkBehaviour의 FixedUpdateNetwork()입니다.

 

 

각 틱의 시간 간격은 NetworkProjectConfigSimulation > 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()와 동일한 역할입니다.

 

 

 

 

728x90