Player Controller
- CreatureController의 자식 클래스이다.
- Player에 추가되는 컴포넌트이다.
- Player의 움직임과 현 상태를 관리한다.
📄 PlayerController.cs
using Google.Protobuf.Protocol;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using static Define;
public class PlayerController : CreatureController
{
protected Coroutine _coSkill;
protected bool _rangedSkill = false;
protected override void Init()
{
base.Init();
}
protected override void UpdateAnimation()
{
if (_animator == null || _sprite == null)
return;
if (State == CreatureState.Idle)
{
switch (Dir)
{
case MoveDir.Up:
_animator.Play("IDLE_BACK");
_sprite.flipX = false;
break;
case MoveDir.Down:
_animator.Play("IDLE_FRONT");
_sprite.flipX = false;
break;
case MoveDir.Left:
_animator.Play("IDLE_RIGHT");
_sprite.flipX = true;
break;
case MoveDir.Right:
_animator.Play("IDLE_RIGHT");
_sprite.flipX = false;
break;
}
}
else if (State == CreatureState.Moving)
{
switch (Dir)
{
case MoveDir.Up:
_animator.Play("WALK_BACK");
_sprite.flipX = false;
break;
case MoveDir.Down:
_animator.Play("WALK_FRONT");
_sprite.flipX = false;
break;
case MoveDir.Left:
_animator.Play("WALK_RIGHT");
_sprite.flipX = true;
break;
case MoveDir.Right:
_animator.Play("WALK_RIGHT");
_sprite.flipX = false;
break;
}
}
else if (State == CreatureState.Skill)
{
switch (Dir)
{
case MoveDir.Up:
_animator.Play(_rangedSkill ? "ATTACK_WEAPON_BACK" : "ATTACK_BACK");
_sprite.flipX = false;
break;
case MoveDir.Down:
_animator.Play(_rangedSkill ? "ATTACK_WEAPON_FRONT" : "ATTACK_FRONT");
_sprite.flipX = false;
break;
case MoveDir.Left:
_animator.Play(_rangedSkill ? "ATTACK_WEAPON_RIGHT" : "ATTACK_RIGHT");
_sprite.flipX = true;
break;
case MoveDir.Right:
_animator.Play(_rangedSkill ? "ATTACK_WEAPON_RIGHT" : "ATTACK_RIGHT");
_sprite.flipX = false;
break;
}
}
else
{
}
}
protected override void UpdateController()
{
base.UpdateController();
}
public override void UseSkill(int skillId)
{
if (skillId == 1)
{
_coSkill = StartCoroutine("CoStartPunch");
}
else if (skillId == 2)
{
_coSkill = StartCoroutine("CoStartShootArrow");
}
}
protected virtual void CheckUpdatedFlag()
{
}
IEnumerator CoStartPunch()
{
_rangedSkill = false;
State = CreatureState.Skill;
yield return new WaitForSeconds(0.5f);
State = CreatureState.Idle;
_coSkill = null;
CheckUpdatedFlag();
}
IEnumerator CoStartShootArrow()
{
_rangedSkill = true;
State = CreatureState.Skill;
yield return new WaitForSeconds(0.3f);
State = CreatureState.Idle;
_coSkill = null;
CheckUpdatedFlag();
}
public override void OnDamaged()
{
Debug.Log("Player HIT !");
}
}
MyPlayer Controller
- PlayereController의 자식 클래스이다.
- 내 Player에 추가되는 컴포넌트이다.
- 키보드 입력을받아 이동 및 공격이 가능하다.
- 행동을 하면 서버와 데이터를 동기화한다.
📄 MyPlayerController.cs
using Google.Protobuf.Protocol;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using static Define;
public class MyPlayerController : PlayerController
{
bool _moveKeyPressed = false;
protected override void Init()
{
base.Init();
}
protected override void UpdateController()
{
switch (State)
{
case CreatureState.Idle:
GetDirInput();
break;
case CreatureState.Moving:
GetDirInput();
break;
}
base.UpdateController();
}
protected override void UpdateIdle()
{
if (_moveKeyPressed)
{
State = CreatureState.Moving;
return;
}
if (_coSkillCooltime == null && Input.GetKey(KeyCode.Space))
{
Debug.Log("Skill !");
C_Skill skill = new C_Skill() { Info = new SkillInfo() };
skill.Info.SkillId = 2;
Managers.Network.Send(skill);
_coSkillCooltime = StartCoroutine("CoInputCooltime", 0.2f);
}
}
Coroutine _coSkillCooltime;
IEnumerator CoInputCooltime(float time)
{
yield return new WaitForSeconds(time);
_coSkillCooltime = null;
}
void LateUpdate()
{
Camera.main.transform.position = new Vector3(transform.position.x, transform.position.y, -10);
}
void GetDirInput()
{
_moveKeyPressed = true;
if (Input.GetKey(KeyCode.W))
{
Dir = MoveDir.Up;
}
else if (Input.GetKey(KeyCode.S))
{
Dir = MoveDir.Down;
}
else if (Input.GetKey(KeyCode.A))
{
Dir = MoveDir.Left;
}
else if (Input.GetKey(KeyCode.D))
{
Dir = MoveDir.Right;
}
else
{
_moveKeyPressed = false;
}
}
protected override void MoveToNextPos()
{
if (_moveKeyPressed == false)
{
State = CreatureState.Idle;
CheckUpdatedFlag();
return;
}
Vector3Int destPos = CellPos;
switch (Dir)
{
case MoveDir.Up:
destPos += Vector3Int.up;
break;
case MoveDir.Down:
destPos += Vector3Int.down;
break;
case MoveDir.Left:
destPos += Vector3Int.left;
break;
case MoveDir.Right:
destPos += Vector3Int.right;
break;
}
if (Managers.Map.CanGo(destPos))
{
if (Managers.Object.FindCreature(destPos) == null)
{
CellPos = destPos;
}
}
CheckUpdatedFlag();
}
protected override void CheckUpdatedFlag()
{
if (_updated)
{
C_Move movePacket = new C_Move();
movePacket.PosInfo = PosInfo;
Managers.Network.Send(movePacket);
_updated = false;
}
}
}
Monster Controller
- CreatureController의 자식 클래스이다.
- Monster에 추가되는 컴포넌트이다.
- Monster의 움직임과 현 상태를 관리한다.
📄 MonsterController.cs
using Google.Protobuf.Protocol;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using static Define;
public class MonsterController : CreatureController
{
Coroutine _coSkill;
protected override void Init()
{
base.Init();
}
protected override void UpdateIdle()
{
base.UpdateIdle();
}
public override void OnDamaged()
{
}
public override void UseSkill(int skillId)
{
if (skillId == 1)
{
State = CreatureState.Skill;
}
}
}
Arrow Controller
- CreatureController의 자식 클래스이다.
- Arrow에 추가되는 컴포넌트이다.
- Arrow의 움직임과 현 상태를 관리한다.
- 첫 생성 시 방향에 맞춰 화살을 회전한다.
📄 ArrowController.cs
using Google.Protobuf.Protocol;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using static Define;
public class ArrowController : BaseController
{
protected override void Init()
{
switch (Dir)
{
case MoveDir.Up:
transform.rotation = Quaternion.Euler(0, 0, 0);
break;
case MoveDir.Down:
transform.rotation = Quaternion.Euler(0, 0, -180);
break;
case MoveDir.Left:
transform.rotation = Quaternion.Euler(0, 0, 90);
break;
case MoveDir.Right:
transform.rotation = Quaternion.Euler(0, 0, -90);
break;
}
State = CreatureState.Moving;
base.Init();
}
protected override void UpdateAnimation()
{
}
}