1인 개발/PushAndSlash

푸쉬앤슬래시 개인 프로젝트 24일차

잼잼재미 2024. 6. 13. 15:26

트러블 슈팅


1. 캐릭터 동기화 시, 끊김 현상


 

기존의 PhotonTransformView로 캐릭터의 position, rotation을 동기화 했는데, 끊김 현상이 심하게 발생했고, 점프 시, position의 y 값을 제대로 동기화하지 못했다. 이유는 유니티 3D의 빠른 움직임을 동기화할 때는 PhotonTransformView 동기화는 무리가 있다는 것을 알게되었다.

 

 

public Vector3 _playerPosition;
public Quaternion _playerRotation;

private void Update()
{
    if(_photonView.IsMine) Move();
    else
    {
        transform.position = Vector3.Lerp(transform.position, PlayerPosition, 100 * Time.deltaTime);
        transform.rotation = Quaternion.Lerp(transform.rotation, PlayerRotation, 100 * Time.deltaTime);
    }
}

public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
{
    // 데이터 보내기 (isMine == true)
    if (stream.IsWriting)
    {
        stream.SendNext(transform.position);
        stream.SendNext(transform.rotation);
    }
    // 데이터 받기 (isMine == false)
    else
    {
        _playerPosition = (Vector3)stream.ReceiveNext();
        _playerRotation = (Quaternion)stream.ReceiveNext();
    }
}

 

OnPhotonSerializeView 함수를 통해 position, rotation 데이터를 실시간으로 전송하여,  전송 받은 데이터를 통해 각각 클라이언트에서 직접 이동, 회전을 구현하는 방법으로 수정했다. 

 

 

private void Awake()
{
    PhotonNetwork.SendRate = 60;
    PhotonNetwork.SerializationRate = 60;
}

 

그리고 위와 같이 OnPhotonSerializeView와 RPC의 호출 빈도를 수정해서 최대한 자연스러운 움직임을 동기화하도록 설정했다. 

 

 

 

정상적으로 Position의 y 값도 잘 동기화 됐고, 훨씬 더 자연스러운 움직임을 동기화 할 수 있었다. 해결 완료!

 

 

회고


오늘은 Player의 근거리, 원거리 데미지 적용을 구현했다. 하지만 여러가지 문제가 많아서 아직 구현하지 못했다. 첫번째 문제는 상대 Player의 Atk 적용이다. Player는 각각 DataManager에서 Atk 데이터를 가지고 있는데 내가 적을 공격할 때, 나의 Atk가 상대에게 적용되야 하지만, 적의 Atk가 적용이 되었다. 그리고 두번째는 원거리 공격을 구현할 때, 나의 PC에서는 내가 바라보는 방향으로 스킬이 발사되지만, 적의 PC에서 볼때는 적이 바라보는 방향으로 스킬이 발사되었다. 여러가지 시도를 해봤지만 오늘은 결국 구현을 하지 못했다. RPC 부분과 OnPhotonSerializeView를 조금더 공부하고, 활용해야할 것 같다.