enum MsgId {
...
S_CHANGE_HP = 8;
}
message S_ChangeHp {
int32 objectId = 1;
int32 hp = 2;
}
message StatInfo {
int32 level = 1;
int32 hp = 2;
int32 maxHp = 3;
int32 attack = 4;
float speed = 5;
int32 totalExp = 6;
}
public override void Update()
{
...
else
{
GameObject target = Room.Map.Find(destPos);
if (target != null)
{
target.OnDamaged(this, Data.damage + Owner.Stat.Attack);
}
public virtual void OnDamaged(GameObject attacker, int damage)
{
Stat.Hp = Math.Max(Stat.Hp - damage, 0);
S_ChangeHp changePacket = new S_ChangeHp();
changePacket.ObjectId = Id;
changePacket.Hp = Stat.Hp;
Room.Broadcast(changePacket);
if(Stat.Hp <= 0)
{
OnDead(attacker);
}
}
public static void S_ChangeHpHandler(PacketSession session, IMessage packet)
{
S_ChangeHp changePacket = packet as S_ChangeHp;
GameObject go = Managers.Object.FindById(changePacket.ObjectId);
if (go == null)
return;
CreatureController cc = go.GetComponent<CreatureController>();
if (cc != null)
{
cc.Stat.Hp = changePacket.Hp;
// TODO : UI 체력바 깎기
}
}
서버 Program에서 무한루프를 돌며 게임 룸의 Update() 함수를 호출해주는데, Arrow의 Update() 함수가 호출되면서 GameObject의 OnDamaged 함수가 호출된다. 화살을 맞은 영역의 게임 오브젝트의 Stat의 hp를 깎은 다음, HP가 바뀌었다는 S_ChangeHp 패킷을 룸에 존재하는 모든 플레이어들에게 뿌려준다.