내일배움캠프/프로젝트

팀 프로젝트 - 클라이언트 캐릭터 위치문제

서보훈 2024. 12. 10. 21:01

멀티플레이 구현중, 씬이 로드된 후 캐릭터를 스폰하는 방식을 사용중, 특정 위치를 지정하고 생성하였으나 이후 0, 0, 0 으로 위치가 변경되는 오류가 발생하였습니다.

 

Instantiate 로 오브젝트를 생성한 후, SpawnAsPlayerObject 로 네트워크 오브젝트를 스폰 시킨 후 Position 값은 모두 지정해준 위치였으나, 그 이후에 어떤 이유에서인지 0, 0, 0 으로 오브젝트의 위치가 변하였습니다.

 

해당 문제의 경우 CharacterController 를 사용하여 멀티플레이를 구현할 때 발생하는 오류인것으로 확인하였습니다.

CharacterController 를 사용할 때, 클라이언트가 소유권을 넘겨받으면서 위치정보에 대한 오류가 발생하여 0, 0, 0 으로 이동되는 문제가 있다고합니다.

 

해당 문제를 해결하는 2가지 방법이 있습니다.

첫번째로, Project Settings - Physics - Auto Sync Transforms 옵션을 켜주는것입니다.

Transform 의 변경사항이 생기면 물리 시스템에 그 변경사항을 자동으로 동기화 시켜주는 옵션으로 오브젝트의 Transform 정보에 맞춰서 Collider, Rigidbody 등을 동기화 시켜주는 옵션입니다.

 

단, 해당 옵션을 사용시 추가적인 연산이 발생하여 성능저하가 발생할 수 있으며, 해당 옵션은 원래 2017.2 이전 버전의 물리 호환성을 위해 만들어진 옵션입니다.

 

다른방법은 캐릭터의 CharacterController 컴포넌트를 비활성화 해둔 뒤, 캐릭터 오브젝트가 스폰이 된 후 소유권이 있는 오브젝트의 CharacterController 를 켜는 방법입니다.

public override void OnNetworkSpawn()
{
    playerInput = new PlayerInput();

    if (!IsOwner)
    {
        playerInput.Disable();
        return;
    }

    characterController = GetComponent<CharacterController>();
    characterController.enabled = true;
    playerInput.Enable();

    moveAction = playerInput.Player.Move;
    runAction = playerInput.Player.Run;
    lookAction = playerInput.Player.Look;
    lightAction = playerInput.Player.Light;
    inverntoryAction = playerInput.Player.Inventory;

    lightAction.performed += OnLightAction;
    inverntoryAction.performed += OnInventory;
    ToggleInventory();
}

 

 

 

이 경우에도 위치 오류가 발생하지 않는것을 확인할 수 있었습니다.