Base Controller
- 모든 움직이는 GameObect에 추가되는 컴포넌트이다.
- 객체의 움직임과 현 상태를 관리한다.
- 다른 모든 Controller의 부모 클래스이다.
📄 BaseController.cs
using Google.Protobuf.Protocol;
using System.Collections;
using System.Collections.Generic;
using System.Configuration;
using UnityEngine;
using static Define;
public class BaseController : MonoBehaviour
{
public int Id { get; set; }
StatInfo _stat = new StatInfo();
public virtual StatInfo Stat
{
get { return _stat; }
set
{
if (_stat.Equals(value))
return;
_stat.Hp = value.Hp;
_stat.MaxHp = value.MaxHp;
_stat.Speed = value.Speed;
}
}
public float Speed
{
get { return Stat.Speed; }
set { Stat.Speed = value; }
}
public virtual int Hp
{
get { return Stat.Hp; }
set
{
Stat.Hp = value;
}
}
protected bool _updated = false;
PositionInfo _positionInfo = new PositionInfo();
public PositionInfo PosInfo
{
get { return _positionInfo; }
set
{
if (_positionInfo.Equals(value))
return;
CellPos = new Vector3Int(value.PosX, value.PosY, 0);
State = value.State;
Dir = value.MoveDir;
}
}
public void SyncPos()
{
Vector3 destPos = Managers.Map.CurrentGrid.CellToWorld(CellPos) + new Vector3(0.5f, 0.5f);
transform.position = destPos;
}
public Vector3Int CellPos
{
get
{
return new Vector3Int(PosInfo.PosX, PosInfo.PosY, 0);
}
set
{
if (PosInfo.PosX == value.x && PosInfo.PosY == value.y)
return;
PosInfo.PosX = value.x;
PosInfo.PosY = value.y;
_updated = true;
}
}
protected Animator _animator;
protected SpriteRenderer _sprite;
public virtual CreatureState State
{
get { return PosInfo.State; }
set
{
if (PosInfo.State == value)
return;
PosInfo.State = value;
UpdateAnimation();
_updated = true;
}
}
public MoveDir Dir
{
get { return PosInfo.MoveDir; }
set
{
if (PosInfo.MoveDir == value)
return;
PosInfo.MoveDir = value;
UpdateAnimation();
_updated = true;
}
}
public MoveDir GetDirFromVec(Vector3Int dir)
{
if (dir.x > 0)
return MoveDir.Right;
else if (dir.x < 0)
return MoveDir.Left;
else if (dir.y > 0)
return MoveDir.Up;
else
return MoveDir.Down;
}
public Vector3Int GetFrontCellPos()
{
Vector3Int cellPos = CellPos;
switch (Dir)
{
case MoveDir.Up:
cellPos += Vector3Int.up;
break;
case MoveDir.Down:
cellPos += Vector3Int.down;
break;
case MoveDir.Left:
cellPos += Vector3Int.left;
break;
case MoveDir.Right:
cellPos += Vector3Int.right;
break;
}
return cellPos;
}
protected virtual 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("ATTACK_BACK");
_sprite.flipX = false;
break;
case MoveDir.Down:
_animator.Play("ATTACK_FRONT");
_sprite.flipX = false;
break;
case MoveDir.Left:
_animator.Play("ATTACK_RIGHT");
_sprite.flipX = true;
break;
case MoveDir.Right:
_animator.Play("ATTACK_RIGHT");
_sprite.flipX = false;
break;
}
}
else
{
}
}
void Start()
{
Init();
}
void Update()
{
UpdateController();
}
protected virtual void Init()
{
_animator = GetComponent<Animator>();
_sprite = GetComponent<SpriteRenderer>();
Vector3 pos = Managers.Map.CurrentGrid.CellToWorld(CellPos) + new Vector3(0.5f, 0.5f);
transform.position = pos;
UpdateAnimation();
}
protected virtual void UpdateController()
{
switch (State)
{
case CreatureState.Idle:
UpdateIdle();
break;
case CreatureState.Moving:
UpdateMoving();
break;
case CreatureState.Skill:
UpdateSkill();
break;
case CreatureState.Dead:
UpdateDead();
break;
}
}
protected virtual void UpdateIdle()
{
}
protected virtual void UpdateMoving()
{
Vector3 destPos = Managers.Map.CurrentGrid.CellToWorld(CellPos) + new Vector3(0.5f, 0.5f);
Vector3 moveDir = destPos - transform.position;
float dist = moveDir.magnitude;
if (dist < Speed * Time.deltaTime)
{
transform.position = destPos;
MoveToNextPos();
}
else
{
transform.position += moveDir.normalized * Speed * Time.deltaTime;
State = CreatureState.Moving;
}
}
protected virtual void MoveToNextPos()
{
}
protected virtual void UpdateSkill()
{
}
protected virtual void UpdateDead()
{
}
}
Creature Controller
- BaseController의 자식 클래스이다.
- 모든 Creature에 추가되는 컴포넌트이다.
- 처음 생성 시 HpBar를 추가한다.
- Creature에 발생하는 이벤트, 스킬 사용 등을 처리한다.
📄 CreatureController.cs
using Google.Protobuf.Protocol;
using System.Collections;
using System.Collections.Generic;
using System.Configuration;
using UnityEngine;
using static Define;
public class CreatureController : BaseController
{
HpBar _hpBar;
public override StatInfo Stat
{
get { return base.Stat; }
set { base.Stat = value; UpdateHpBar(); }
}
public override int Hp
{
get { return Stat.Hp; }
set { base.Hp = value; UpdateHpBar(); }
}
protected void AddHpBar()
{
GameObject go = Managers.Resource.Instantiate("UI/HpBar", transform);
go.transform.localPosition = new Vector3(0, 0.5f, 0);
go.name = "HpBar";
_hpBar = go.GetComponent<HpBar>();
UpdateHpBar();
}
void UpdateHpBar()
{
if (_hpBar == null)
return;
float ratio = 0.0f;
if (Stat.MaxHp > 0)
ratio = ((float)Hp) / Stat.MaxHp;
_hpBar.SetHpBar(ratio);
}
protected override void Init()
{
base.Init();
AddHpBar();
}
public virtual void OnDamaged()
{
}
public virtual void OnDead()
{
State = CreatureState.Dead;
GameObject effect = Managers.Resource.Instantiate("Effect/DieEffect");
effect.transform.position = transform.position;
effect.GetComponent<Animator>().Play("START");
GameObject.Destroy(effect, 0.5f);
}
public virtual void UseSkill(int skillId)
{
}
}