Netcode 구성 요소 - cheona-thousand-man/Unity-myBasics-Wiki GitHub Wiki
서버와 클라이언트 간 동일한 동작이 필요한 오브젝트의 구성 요소
1. NetworkObject
- 역할: NetworkObject는 네트워크에서 오브젝트의 상태를 동기화하고, 생성과 소멸을 관리합니다.
- 주요 기능: 네트워크 인스턴스 관리: 네트워크에서 오브젝트를 생성하고 소멸시키는 데 필요합니다.
- 동기화: NetworkObject는 서버와 클라이언트 간의 상태 동기화를 관리합니다.
- Ownership: 오브젝트의 소유자를 서버와 클라이언트 간에 정의하고 관리합니다.
2. NetworkTransform
- 역할: NetworkTransform은 오브젝트의 위치, 회전, 크기를 네트워크를 통해 동기화합니다.
- 주요 기능: 위치와 회전 동기화: 오브젝트의 위치와 회전을 서버와 클라이언트 간에 동기화합니다.
- 동기화 간격 조정: 전송 주기를 조정하여 성능을 최적화할 수 있습니다.
3. NetworkAnimator
- 역할: NetworkAnimator는 애니메이터의 상태와 파라미터를 서버와 클라이언트 간에 동기화합니다.
- 주요 기능: 애니메이션 상태 동기화: 애니메이션의 상태와 파라미터를 네트워크를 통해 동기화합니다.
- RPC 호출: ClientRpc와 ServerRpc를 통해 애니메이션의 상태를 제어할 수 있습니다.
4. NetworkBehaviour
- 역할: NetworkBehaviour는 서버와 클라이언트 간의 통신과 동작 제어를 위한 기본 클래스입니다.
- 주요 기능: RPC 메소드: ServerRpc와 ClientRpc를 정의하여 서버와 클라이언트 간의 통신을 수행합니다. IsServer, IsClient 속성: 서버와 클라이언트의 상태를 확인할 수 있습니다.
서버-클라이언트 간 동일한 동작이 필요한 오브젝트
필요한 컴포넌트
서버와 클라이언트 간 동일한 동작을 보장하기 위해, 네트워크 오브젝트는 다음과 같은 컴포넌트를 갖추어야 합니다:
- NetworkObject: 네트워크에서 오브젝트의 생성과 소멸을 관리합니다.
- NetworkTransform: 오브젝트의 위치, 회전, 크기를 네트워크를 통해 동기화합니다.
- NetworkAnimator: 애니메이션의 상태와 파라미터를 네트워크를 통해 동기화합니다.
동작 호출과 동기화
서버에서 특정 동작이 필요할 때 ServerRpc를 사용하고, 클라이언트에서 동작이 필요할 때는 ClientRpc를 사용합니다. 다음은 서버와 클라이언트 간의 동작 호출과 동기화의 기본 흐름입니다
- 서버에서 동작 호출: 서버에서 ServerRpc 메소드를 호출하여 클라이언트에게 동작을 전송합니다.
[ServerRpc]
public void DoActionServerRpc()
{
// 서버에서 클라이언트에게 동작을 전송
DoActionClientRpc();
}
- 클라이언트에서 동작 실행: 클라이언트는 ClientRpc 메소드를 통해 서버의 동작을 수신하고 실행합니다.
[ClientRpc]
public void DoActionClientRpc()
{
// 클라이언트에서 동작 실행
}
- 예제 코드: 아래는 서버와 클라이언트에서 동일한 동작을 보장하는 기본 예제입니다
public class GameManager : NetworkBehaviour
{
public NetworkAnimator networkAnimator;
public override void OnNetworkSpawn()
{
networkAnimator = GetComponent<NetworkAnimator>();
}
// 서버에서 호출하여 클라이언트에게 애니메이션 트리거 전달
[ServerRpc]
public void TriggerAnimationServerRpc()
{
networkAnimator.SetTrigger("Attack");
}
// 클라이언트에서 호출하여 서버에게 애니메이션 트리거 전달
[ClientRpc]
public void TriggerAnimationClientRpc()
{
networkAnimator.SetTrigger("Attack");
}
public void Attack()
{
if (IsServer)
{
TriggerAnimationServerRpc();
}
else
{
TriggerAnimationClientRpc();
}
}
}
컴포넌트 관계도
다음은 서버와 클라이언트 간의 동기화를 위해 각 컴포넌트들이 어떻게 상호작용하는지를 나타내는 관계도입니다
+-----------------+
| NetworkObject | <--- 네트워크에서 오브젝트의 상태 관리 및 소유권 관리
+-----------------+
|
v
+-----------------+
| NetworkTransform| <--- 오브젝트의 위치, 회전, 크기 동기화
+-----------------+
|
v
+-----------------+
| NetworkAnimator | <--- 애니메이션 상태와 파라미터 동기화
+-----------------+
|
v
+-----------------+
| NetworkBehaviour| <--- ServerRpc와 ClientRpc 메소드 정의
+-----------------+
결론
서버와 클라이언트 간의 동기화를 관리하기 위해 NetworkObject, NetworkTransform, NetworkAnimator와 같은 Netcode for GameObjects의 컴포넌트를 사용합니다. 이러한 컴포넌트들은 서버와 클라이언트 간의 상태 동기화, 위치와 회전의 전송, 애니메이션의 동기화를 처리하며, NetworkBehaviour를 통해 RPC 호출과 서버/클라이언트 상태 확인을 수행합니다.
이 컴포넌트들과 메소드들을 적절히 조합하여 서버와 클라이언트 간의 동일한 동작을 보장하고 게임의 네트워크 상태를 효과적으로 관리할 수 있습니다.