[내배캠 최종 프로젝트]
멀티 플레이어 게임에서의 상태 관리: MyPlayer와 Player 클래스
호지98
2024. 8. 1. 21:45
상태 관리 개요
MyPlayer와 Player 클래스는 멀티 플레이어 게임에서 각 플레이어의 상태를 관리하고, 이를 기반으로 애니메이션을 업데이트하는 역할을 합니다. 특히 Player 클래스는 모든 플레이어의 상태를 다루고, MyPlayer 클래스는 본인 플레이어에게만 적용되는 추가적인 설정을 처리합니다.
MyPlayer 클래스
MyPlayer 클래스는 본인 플레이어에 대한 상태를 관리하고 초기 설정을 수행합니다. 주요 기능은 다음과 같습니다:
- 초기 설정: 마을과 던전에서 다른 설정을 적용하여 카메라와 컨트롤을 본인 플레이어에 맞춥니다.
- 충돌 설정: 리지드바디와 캡슐 콜라이더를 초기화하여 충돌 처리를 설정합니다.
- 상태 변경: SetState() 메서드를 통해 플레이어의 상태를 변경합니다.
public class MyPlayer : MonoBehaviour
{
private Player player;
private void Awake()
{
switch (GameManager.Instance.CurrentScene)
{
case GameManager.CurrentMap.Town:
InitTownSetting();
break;
case GameManager.CurrentMap.Dungeon:
InitDungeonSetting();
break;
}
player = GetComponent<Player>();
InitPlayerCollider();
}
private void InitTownSetting()
{
// 마을 설정
}
private void InitDungeonSetting()
{
// 던전 설정
}
private void InitPlayerCollider()
{
// 충돌 설정
}
public void SetState(Player.PlayerState state)
{
player.SetState(state);
}
}
Player 클래스
Player 클래스는 모든 플레이어의 상태를 관리하며, 상태 변화에 따른 애니메이션을 업데이트합니다. 주요 기능은 다음과 같습니다:
- 플레이어 상태 정의: PlayerState 열거형을 사용하여 다양한 플레이어 상태를 정의합니다.
- 상태 설정: SetState() 메서드를 통해 플레이어 상태를 변경하고, 해당 상태에 맞는 애니메이션을 트리거합니다.
- 애니메이션 업데이트: SetAnim() 메서드를 통해 애니메이션 코드를 설정하고, 애니메이터에서 트리거를 설정합니다.
- 상태 기반 이동 및 회전: 다른 플레이어의 위치와 회전을 업데이트하여 일관성을 유지합니다.
public class Player : MonoBehaviour
{
public enum PlayerState { Idle = -1, Die = 1, SwordAttack = 3, MagicAttack = 0, SpearAttack = 4, ArrowAttack = 5, HammerAttack = 6 };
public PlayerState currentState = PlayerState.Idle;
private Animator animator;
private Vector3 goalPos;
private Quaternion goalRot;
private bool isInit = false;
private int[] animCodeList = {
Constants.PlayerMagicAttack,
Constants.PlayerBattleDie,
Constants.PlayerBattleHit,
Constants.PlayerSwordAttack,
Constants.PlayerSpearAttack,
Constants.PlayerArrowAttack,
Constants.PlayerHammerAttack,
};
void Start()
{
animator = GetComponent<Animator>();
}
public void SetState(PlayerState state)
{
currentState = state;
SetAnim((int)state);
}
private void SetAnim(int idx)
{
if (idx < 0 || idx >= animCodeList.Length)
return;
int animCode = animCodeList[idx];
animator.SetTrigger(animCode);
}
private void Update()
{
if (!isInit)
return;
if (Vector3.Distance(transform.position, goalPos) > 0.5f)
transform.position = goalPos;
else
transform.position = Vector3.Lerp(transform.position, goalPos, Time.deltaTime * 10);
if (goalRot != Quaternion.identity)
{
float t = Mathf.Clamp(Time.deltaTime * 10, 0, 0.99f);
transform.rotation = Quaternion.Lerp(transform.rotation, goalRot, t);
}
}
}
주요 기능 설명
- 상태 정의 및 변경:
- Player 클래스의 PlayerState 열거형을 통해 다양한 상태를 정의합니다.
- SetState() 메서드를 사용하여 현재 상태를 변경하고, 해당 상태에 맞는 애니메이션을 설정합니다.
- 애니메이션 설정:
- SetAnim() 메서드는 상태 인덱스를 받아 애니메이션 트리거를 설정합니다.
- 각 상태에 대응하는 애니메이션 코드는 animCodeList 배열에 저장되어 있습니다.
- 위치와 회전 업데이트:
- Update() 메서드는 목표 위치와 회전을 기반으로 플레이어의 현재 위치와 회전을 업데이트합니다.
- 다른 플레이어의 움직임을 부드럽게 보정하여 일관성을 유지합니다.
이 구조를 통해 각 플레이어의 상태와 애니메이션이 적절히 관리되고, 멀티 플레이 환경에서 일관된 동작을 유지할 수 있습니다. MyPlayer 클래스는 본인 플레이어에 대한 추가 설정을 처리하고, Player 클래스는 모든 플레이어의 상태와 애니메이션을 관리합니다.