public static void S_SkillHandler(PacketSession session, IMessage packet)
{
S_Skill skillPacket = packet as S_Skill;
GameObject go = Managers.Object.FindById(skillPacket.PlayerId);
if (go == null)
return;
PlayerController pc = go.GetComponent<PlayerController>();
if(pc != null)
{
pc.UseSkill(skillPacket.Info.SkillId);
}
}
public void UseSkill(int skillId)
{
if(skillId == 1)
{
_coSkill = StartCoroutine("CoStartPunch");
}
}
protected virtual void CheckUpdatedFlag()
{
}
IEnumerator CoStartPunch()
{
// 대기 시간
_rangedSkill = false;
State = CreatureState.Skill; // 쿨타임 체크는 서버/클라 양쪽에서 다 해줘야 한다.
yield return new WaitForSeconds(0.5f); // 0.5초 쿨타임. 스킬 유지시간. 0.5초 이내에 스킬 패킷을 3개 받았을 경우 처음 온 패킷이 0.5초가 지나 Idle로 세팅해버리면, 나머지 패킷 2개는 영향력 사라짐
State = CreatureState.Idle; //
_coSkill = null;
}
protected override void UpdateIdle()
{
...
// 0.2초마다 스킬 쓸 수 있다.
if (_coSkillCooltime == null && Input.GetKey(KeyCode.Space))
{
C_Skill skill = new C_Skill() { Info = new SkillInfo() };
skill.Info.SkillId = 1;
Managers.Network.Send(skill);
_coSkillCooltime = StartCoroutine("CoInputCooltime", 0.2f);
}
}
Coroutine _coSkillCooltime;
IEnumerator CoInputCooltime(float time)
{
yield return new WaitForSeconds(time);
_coSkillCooltime = null;
}
먼저 클라이언트에서 스페이스 바를 누르면 스킬 패킷을 생성하고 서버로 전송한 후 코루틴 함수를 호출하여 0.2초마다 스킬 패킷을 보내도록 로직을 짜주었다.
서버에서 스킬 패킷을 받고 검증 후 해당 룸에 존재하는 모든 클라이언트 들에게 다시 브로드캐스팅해서 스킬 패킷을 보내는데, 이때 어떤 플레이어가 스킬을 사용했는지 정보(PlayerId)도 함께 포함해서 보내게 된다.
이렇게 스킬 패킷을 다시 받은 클라이언트는 PacketHandler에서 UseSkill 함수를 호출하게 되고, CoStartPunch 코루틴 함수를 호출하게 된다. 이렇게 호출하면 State는 Skill로 바뀌면서 스킬을 사용하는 애니메이션을 재생하게 된다.