오늘은 개인과제에 타이틀씬을 추가하고 플레이어 캐릭터가 공을 발로 찰 수 있게 했다.
공을 차려면 필요한 것들을 추려봤다.
위 목록에서, Catch와 Shoot 부분은 실제 공의 정보가 바뀌는 순간이다.
모든 유저가 같이 동작해야하기 때문에, Pun RPC를 이용해서 호출 시점을 동기화하기로 했다.
포톤 Pun에서 제공하는 기능으로, 방에 있는 모든 유저 혹은 특정 유저들에게 메서드를 원격으로 호출해준다.
[PunRPC]
public void Shoot(Vector3 dir, float power)
{
if (photonView.IsMine)
_rigid.velocity = _basePower * power * dir;
}
[PunRPC]
public void Catch(Vector3 pos)
{
if (photonView.IsMine)
{
transform.position = pos + Vector3.up * transform.localScale.x / 2;
_rigid.velocity = Vector3.zero;
_rigid.angularVelocity = Vector3.zero;
}
}
원격으로 호출하고 싶은 메서드는 PunRPC 속성을 붙여서 선언해줘야한다.
public void Kick()
{
if (_ball == null)
return;
_ball.photonView.RPC("Shoot", RpcTarget.All, _kickDirection, _chagedPower);
_isCharge = false;
_player.Animator.SetFloat(_player.AnimatorHash_MoveVelocity, _moveVelocity.magnitude);
_player.Animator.SetBool(_player.AnimatorHash_IsCharge, false);
_ball = null;
_chagedPower = 0f;
_remainKickCooltime = _kickCooltime;
}
플레이어가 공을 차는 Kick() 메서드에서 공에게 Shoot() 메서드를 RPC로 호출하도록 해봤다.
두 번째 매개변수인 RpcTarget 열거형으로 모든 유저에게 호출해주거나, 특정 유저만 호출하게 할 수 있다. Photon.Realtime.Player형으로 오버로딩도 돼 있어서, 포톤 플레이어 객체를 그대로 넘겨줄 수도 있다.
호출되는 메서드의 매개변수의 경우, param object[]으로 넘겨줄 수 있다.
단, 직접 작성한 클래스와 같은 Custom type들은 클래스 내부에 직렬화, 역직렬화가 가능하게 메서드를 구현해주고, 직렬화를 할 수 있도록 등록해줘야한다고 한다...