내일배움캠프 Unity 43일차 TIL - 심화 주차 개인과제 - Photon

Wooooo·2023년 12월 27일
0

내일배움캠프Unity

목록 보기
45/94

[오늘의 키워드]

오늘은 개인과제에 타이틀씬을 추가하고 플레이어 캐릭터가 공을 발로 찰 수 있게 했다.


[공 차기]

공을 차려면 필요한 것들을 추려봤다.

  • 근처의 공을 탐색
  • 발밑으로 공을 가져옴 (Catch)
  • 공 차기 쿨타임
  • 공 차기 세기 조절
  • 공 차기 방향 조절
  • 공에게 Velocity 적용 (Shoot)

위 목록에서, Catch와 Shoot 부분은 실제 공의 정보가 바뀌는 순간이다.
모든 유저가 같이 동작해야하기 때문에, Pun RPC를 이용해서 호출 시점을 동기화하기로 했다.


[Pun RPC]

원격 프로시저 호출 (RPC, Remote Procedure Call)

포톤 Pun에서 제공하는 기능으로, 방에 있는 모든 유저 혹은 특정 유저들에게 메서드를 원격으로 호출해준다.

[PunRPC 속성]

    [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 속성을 붙여서 선언해줘야한다.

[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들은 클래스 내부에 직렬화, 역직렬화가 가능하게 메서드를 구현해주고, 직렬화를 할 수 있도록 등록해줘야한다고 한다...

포톤의 직렬화

profile
game developer

0개의 댓글