오늘은 개인과제에 타이틀씬을 추가하고 플레이어 캐릭터가 공을 발로 찰 수 있게 했다.
공을 차려면 필요한 것들을 추려봤다.
위 목록에서, 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들은 클래스 내부에 직렬화, 역직렬화가 가능하게 메서드를 구현해주고, 직렬화를 할 수 있도록 등록해줘야한다고 한다...