Carrot
본문 바로가기
Unity/멋쟁이사자처럼 부트캠프

[천도컴퍼니] 플레이어가 사망했을 때 타 플레이어가 업어가는 로직 구현 (3)

by 독기품은토끼 2025. 11. 27.
✅ 오늘의 백로그
1. 애니메이션 적용
2. 버그 분석 및 해결

1. 애니메이션 적용

 

Player Controller 스크립트 내부에 시체 운반 관련된 파라미터 값들이 이미 세팅되어있으니

나는 이 값들을 토대로 애니메이터 변환 조건만 추가해주었다.

 

이제 이 파라미터 값을 스크립트에서 만져주기만 하면 된다.

 

[Rpc(RpcSources.InputAuthority, RpcTargets.StateAuthority)]
private void RPC_RequestStartCarry(NetworkObject corpseObject)
{
    // 생략...

    // 애니메이션 적용
    // 시체 업은 사람
    var playerController = GetComponent<PlayerController>();
    if (playerController != null)
    {
        // Debug.Log($"[Corpse] 시체 들기 true");
        playerController.CarriedPlayerId = corpseObject.Id;
    }

    // 시체
    var corpseController = corpseObject.GetComponent<PlayerController>();
    if (corpseController != null)
    {
        // Debug.Log("$[Corpse] 시체 애니메이션 적용");
        corpseController.IsBeingCarried = true;
    }
}

 

네트워크를 통해서 위치/애니메이션이 멀티 플레이어간 동일해야 하므로 RPC 내부에서 조작해주었다.

 

 

좀 어색한 감이 있지만 일단 시체 애니메이션이 적용되긴 했다.

 

 

carry Pos 값은 흠 일단 얼추 이렇게 설정했다.

 

2. 버그 분석

하지만 이렇게 간단하게 끝나면 정말 좋았을 텐데 역시나 문제가 많다.

  • 클라이언트는 시체 운반이 안되는 현상
  • 시체 드랍이 안되는 현상
  • 시체 운반 시 타 아이템이 들리는 현상

 

이건 그냥  시체 들었을 때 인벤토리 상호작용 안되도록 막아주면 될 것 같구

 

  • 관전자 시점 이상해지는 현상

 

이건 관전자 카메라 스크립트를 한번 확인해봐야할 것 같음...

내 생각엔 카메라 Pos 값이 플레이어 등 쪽 부근에 위치해 있는데

시체를 들어버리면서 생긴 문제로 추측된다.

 

  • 걷는 애니메이션 무시되는 현상 & 위치 동기화 이상한 현상

 

걷는 애니 무시 -> Carry 애니메이션을 블렌더 트리 안에 넣으면 될 것 같고

위치 동기화 이상 -> 이건 원인을 잘 모르겠다....

 

1. 클라이언트 상호작용

우선 클라이언트는 시체 운반이 안 되니까 이부분 부터 해결해주겠다.

 

어디서부터 동작이 안되는지 로그를 다 찍어봤는데

TryRequestCarry까지 잘 호출이되는데도 시체를 들지않는다...

 

[Rpc(RpcSources.InputAuthority, RpcTargets.StateAuthority)]
private void RPC_RequestStartCarry(NetworkObject corpseObject)
{
    // 생략
}

 

 

아무래도 RPC 쪽 문제인 것 같다.

지금보면 StateAuthority는 서버가 관리하고 있고 InputAuthority 도 실제로는 클라가 들었지만 서버에서 실행하고 있기 때문에 입력 주인이 서버측이 되어서 무시되는 것 같다.

 

[참고]

 

Fusion 2 - 원격 프로시저 호출 | Photon Engine

RPC(원격 프로시저 호출)는 특정 이벤트를 네트워크 클라이언트 간에 공유하기에 이상적입니다. 반면에, [Networked] 속성은 지속적으로 변하는 상태를 공유하는 데 적합한 기본 솔루션입니다. 예를

doc.photonengine.com

 

그래서 기존에 구현해둔 RPC를 모두 지우고

그냥 TryRequestCarry 메서드 안에서 Object.HasStateAuthority로 서버만 상태를 바꿀 수 있도록 한 다음

그대로 RPC에 구현한 걸 여기에 복붙해주었다

 

 

이제 클라이언트도 시체 운반을 잘 한다!!

그런데 지금 보는 것 처럼 시체 운반이 한 프레임?씩 느려서.. 이 문제도 한번 어디서 생긴 문제인지 찾아봐야겠다.

일단 이건 잠시 미뤄두고 기능 안되는거 먼저 고쳐야징