아이템을 착용해봤으니 이제 가지고 있는 스탯 포인트를 이용해 스탯을 찍고 공격력을 높이는 작업을 해보자.
흐름
- StatUI 에서 원하는 스탯의 상승 버튼을 누르면 상승 요청 패킷을 보낸다.
- 서버에서 각종 검증(실제로 올릴 수 있는 스킬 포인트가 있는지 등)한 후 스탯을 올리고 스탯의 종합적인 정보를 클라에게 전달해준다. 이는 브로드캐스트가 아닌 본인 한명에게만 보낸다.
- 받은 클라이언트는 결과 값을 자신의 실제 Stat에 적용한다.
스탯 상승 요청
GetButton((int)Buttons.StrUpButton).gameObject.BindEvent((e) => { MakeChagneStatPacket("Str"); });
GetButton((int)Buttons.DexUpButton).gameObject.BindEvent((e) => { MakeChagneStatPacket("Dex"); });
GetButton((int)Buttons.LukUpButton).gameObject.BindEvent((e) => { MakeChagneStatPacket("Luk"); });
GetButton((int)Buttons.IntUpButton).gameObject.BindEvent((e) => { MakeChagneStatPacket("Int"); });
void MakeChagneStatPacket(string statString)
{
if (myPlayer.Stat.StatPoint <= 0) return;
C_ChangeStat changeStatPacket = new C_ChangeStat();
changeStatPacket.ChangeStat = statString;
Managers.Network.Send(changeStatPacket);
}
자신이 올리고자한 Stat의 이름을 패킷에게 넣어 보내준다. 여기서 1차적으로 StatPoint가 남아 있는지를 확인한다.
허나 클라이언트의 변조의 위험 때문에 서버쪽에서도 반드시 체크해주어야한다.
서버 스탯 상승
public void StatChange(Player player, C_ChangeStat changeStatPacket)
{
if (player == null) return;
string statName = changeStatPacket.ChangeStat;
if (player.Stat.StatPoint <= 0) return;
switch (statName)
{
case "Str" :
player.Stat.StatPoint--;
player.Stat.Str++;
break;
case "Dex":
player.Stat.StatPoint--;
player.Stat.Dex++;
break;
case "Luk":
player.Stat.StatPoint--;
player.Stat.Luk++;
break;
case "Int":
player.Stat.StatPoint--;
player.Stat.Int++;
break;
default:
return;
}
player.CalAttackValue();
StatInfo playerStat = player.Stat;
S_ChangeStat statPacket = new S_ChangeStat();
statPacket.StatInfo = playerStat;
player.Session.Send(statPacket);
}
여기서 CalAttackValue를 통해 공격력을 계산을 다시 해주어야만한다.
클라 스탯 반영
public static void S_ChangeStatHandler(PacketSession session, IMessage packet)
{
S_ChangeStat changeStatPacket = (S_ChangeStat)packet;
MyPlayerController myPlayer = Managers.Object.MyPlayer;
if (myPlayer == null) return;
myPlayer.SetStat(changeStatPacket.StatInfo);
UI_GameScene gameSceneUI = Managers.UI.SceneUI as UI_GameScene;
gameSceneUI.StatUI.RefreshUI();
}
이렇게 클라이언트에서 플레이어의 스탯을 재 조정하고 UI를 새로고침 해준다.
이번 포스팅은 되게 간단한 내용이기 때문에 따로 영상은 첨부하지 않는다.
'Unity > 온라인 RPG' 카테고리의 다른 글
[Unity 3D] 아이템 인벤창에서 옮기기 (0) | 2024.06.21 |
---|---|
[Unity 3D] UI 이미지 드래그 그리고 퀵슬롯 등록하기 (0) | 2024.06.21 |
[Unity 3D] 획득한 아이템 착용하기 (1) | 2024.06.11 |
[Unity 3D] 아이템 드랍 및 획득 (0) | 2024.05.29 |
[Unity 3D] 각종 UI 제작! Stat창, Inven창, Equip창 (0) | 2024.05.28 |