์šฐ์„  ์ด ์ฝ”๋“œ๋ฅผ ์งœ๊ฒŒ ๋œ ์Šคํ† ๋ฆฌ๋Š” ์ด๋ ‡์Šต๋‹ˆ๋‹ค.

์•ก์…˜๊ฒŒ์ž„์„ ๋งŒ๋“ค์–ด ๋ณด๊ณ  ์‹ถ์€๋ฐ ์ฒ˜์Œ์—๋Š” ๊ทธ๋ƒฅ if๋ฌธ์„ ๋ง‰ ์จ์„œ ์งœ๋‹ค๊ฐ€ ์˜ˆ์™ธ์ƒํ™ฉ์ด ๋„ˆ๋ฌด ๋งŽ์ด ๋ฐœ์ƒํ•˜๊ณ 

๊ตฌ์กฐ๊ฐ€ ์ด์ƒํ•ด์ง€๋Š”๊ฒŒ ๋А๊ปด์ ธ์„œ ๋ฐฉ๋ฒ•์„ ์•„์˜ˆ ๋ฐ”๊พธ๊ณ  ์ด๋Ÿฐ์ €๋Ÿฐ๊ฒƒ๋“ค์„ ์ฐธ๊ณ ํ•ด์„œ ์ง€๊ธˆ์˜ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.


์šฐ์„  ActorController ์Šคํฌ๋ฆฝํŠธ์˜ ๋ชฉ์ ์€ ๋ชจ๋“  ์ž…๋ ฅ์„ ๋ฐ›๊ณ  ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณณ์œผ๋กœ ์ง€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ž…๋ ฅ๊ฐ’๋“ค์„ Actor๋กœ ๋„˜๊ฒจ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ Actor ์Šคํฌ๋ฆฝํŠธ๋Š” ์˜ค์ง ActorController์—์„œ ์ž…๋ ฅ๊ฐ’์„ ๋ฐ›๋Š” ์—ญํ• ๋งŒ ํ•ฉ๋‹ˆ๋‹ค.


๊ทธ๋ฆฌ๊ณ  CharacterManager์—์„œ๋Š” Actor๋ฅผ ์ƒ์†๋ฐ›๊ณ  Actor์—์„œ ๋ฐ›์€ ๊ฐ’๋“ค์„ ๋‹ค์‹œ BaseAction์œผ๋กœ ๋„˜๊ฒจ์ฃผ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด BaseAction์—์„œ ๊ทธ ๊ฐ’๋“ค์„ ๋ฐ›๊ณ  ์‹ค์ œ ๋™์ž‘์„ ํ•  Idle ์Šคํฌ๋ฆฝํŠธ๋‚˜ Run ์Šคํฌ๋ฆฝํŠธ ์•„๋‹ˆ๋ฉด Attack ์Šคํฌ๋ฆฝํŠธ์— ์ตœ์ข…์ ์œผ๋กœ ๋„˜๊ฒจ์ค๋‹ˆ๋‹ค.


๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜๋Š” BaseAction ์ฝ”๋“œ์™€ CharacterManager ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.


public class CharacterManager : Actor

{

BaseAction _nowAction; (์ถ”์ƒํด๋ž˜์Šค๋ผ์„œ new๋กœ๋„ ์•ˆ๋˜๊ณ  null์„ ์ง‘์–ด๋„ฃ์–ด๋„ ์™œ ์ดˆ๋ก์ƒ‰์ด ์•ˆ์‚ฌ๋ผ์งˆ๊นŒ์š” ใ… )


public override void MovingCheck(Vector3 moveDir) =>

_nowAction.CheckMoveDir(moveDir);


public override void OnNormalAtk(ActorController.InputKey key, ActorController.InputState state) =>

_nowAction.CheckInputKeys(key, state);


public override void OnDodge(ActorController.InputKey key, ActorController.InputState state) =>

_nowAction.CheckInputKeys(key, state);


public void ChangeAction(string name) => _nowAction.ChangeAction(name);


void Update()

{

}

}


๋ฐ‘์—๋Š” BaseAction ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค

public abstract class BaseAction : MonoBehaviour

{

[Header("Managers")]

[SerializeField] protected CharacterManager _owner;

[SerializeField] protected Animator _animator;


public virtual void StartAction() { }


public abstract void UpdateAction();


public virtual void EndAction() { }


public abstract void ChangeAction(string name);


public virtual void CheckInputKeys(ActorController.InputKey key, ActorController.InputState state) { }


public virtual void CheckMoveDir(Vector3 dir) { }

void Start()

{


}


void Update()

{

}

}


๊ทธ๋ฆฌ๊ณ  ์ตœ์ข…์ ์œผ๋กœ ๊ฐ’์„ ๋ฐ›์•„์„œ ์‹คํ–‰๋˜๋Š” ์Šคํฌ๋ฆฝํŠธ ์ž…๋‹ˆ๋‹ค (์˜ˆ๋ฅผ๋“ค์–ด Idle)


public class Idle : BaseAction

{

public override void CheckInputKeys(ActorController.InputKey key, ActorController.InputState state)

{

if (key == ActorController.InputKey.NORMALATK && state == ActorController.InputState.PRESSED)

_owner.ChangeAction("Atk");


if (key == ActorController.InputKey.DODGE && state == ActorController.InputState.PRESSED)

_owner.ChangeAction("Dodge");

}


public override void CheckMoveDir(Vector3 dir)

{

if (dir != Vector3.zero)

_owner.ChangeAction("Moving");

}


public override void UpdateAction()

{


}


public override void ChangeAction(string name)

{

_animator.SetBool(name, true);

}



void Start()

{

}


void Update()

{

}

}


์ฝ”๋“œ๊ฐ€ ์ˆ˜์ •ํ•ด์•ผ ํ•  ๊ฒƒ์ด ์žˆ๊ฑฐ๋‚˜ ํ•˜๋ฉด ์ง€์ ์ข€ ํ•ด์ฃผ์„ธ์š”. ํ•˜๋‹ค๊ฐ€ ๋ณต์žกํ•ด์„œ ๋ฉ˜ํƒˆ์ด ๋งŽ์ด ๋‚˜๊ฐ€๊ธฐ๋„ ํ–ˆ๊ณ  ์ด์ƒํ•œ ์˜ค๋ฅ˜๋„ ๋งŽ์„๊ฒƒ ๊ฐ™์•„์š” ใ… ใ