멀티플레이 구현중, 씬이 로드된 후 캐릭터를 스폰하는 방식을 사용중, 특정 위치를 지정하고 생성하였으나 이후 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();
}
이 경우에도 위치 오류가 발생하지 않는것을 확인할 수 있었습니다.
'내일배움캠프 > 프로젝트' 카테고리의 다른 글
팀 프로젝트 - 아이템 기반 (1) | 2024.12.13 |
---|---|
팀 프로젝트 - 맵 에디터 기반 제작 (0) | 2024.12.11 |
팀 프로젝트 - 오브젝트 스폰 시점 수정, 로딩 씬 추가 (0) | 2024.12.09 |
팀 프로젝트 - 리팩토링 대상 정리 (0) | 2024.12.05 |
팀 프로젝트 진행 - 멀티플레이 구현 (0) | 2024.12.04 |