오늘은 팀 프로젝트를 계속 진행했다.
오늘 내가 진행한 것은
다른 팀원분이 작성하신 MonsterManager를 기반으로 내가 인터페이스를 상속시켜서 진행을 하고 있었다. 그러던 와중, 내가 구현했던 기능들을 다른 팀원이 더 좋게 구현하셔서 병합을 하게 되었는데, 둘다 같은 스크립트 파일을 수정했다보니 코드를 병합할 필요가 있었다. 다행이도 작업량이 많지 않아 금방 해결했지만, 규모가 큰 프로젝트였으면 진땀 뺄 뻔했다. 다음부터는 자신의 진행 상황을 자주 교류하도록 해야겠다.
처음 작성할 때는 코드의 기본 구조를 이해하는 것 조차 너무 힘들었다. 처음 이틀은 별로 진행된 것이 없어 굉장히 초조했다. 그러나 오늘 기본 구조를 작성하신 팀원과 얘기를 하고 질문을 한 결과, 결국 공격을 구현하는 데 성공했다! 너무 오래 걸린 것 같아 팀원들에게 정말 죄송하다... 그래도 오늘 지난 이틀동안 손도 못 쓴 코드를 하루만에 해치우니 뿌듯하다... 🥰
오늘 처음으로 인터페이스를 사용했다. 인터페이스를 통해 공격을 하거나, 받을 때의 공격력과 체력의 변화에 대한 처리를 인터페이스를 통해서 할 수 있었다. 맨 처음에는 프로퍼티의 setter가 private이였기 때문에 어떻게 값을 처리해야 할까 고민이 많았지만, 인터페이스를 상속시켜 멤버 메서드로 처리하여 값을 변경할 수 있었다!
// Utilities.cs
public interface IAttack
{
int Attack();
}
public interface ITakeDamage
{
void TakeDamage(int damage);
}
// MonsterManager.cs
public class Monster : IListener, IAttack, ITakeDamage
{
public string Name { get; private set; } //몬스터 이름
public int Lv { get; private set; } // 레벨
public int Hp { get; private set; } // 체력
public int Atk { get; private set; } //몬스터 공격력
public bool isDead; //죽었으면 true
// 인터페이스 IAttack을 상속 받아 공격력을 반환하기
public int Attack()
{
int damage = 0;
double getDamage;
getDamage = this.Atk / 100.0 * 10;
damage = new Random().Next(this.Atk - (int)Math.Ceiling(getDamage), this.Atk + (int)Math.Ceiling(getDamage) + 1);
Console.WriteLine($"Lv.{this.Lv} {this.Name} 의 공격!");
return damage;
}
// 인터페이스 ITakeDamage를 상속 받아 체력 차감하기
public void TakeDamage(int damage)
{
this.Hp -= damage;
if (this.Hp <= 0) this.isDead = true;
}
...
}
우리 팀의 에이스이신 팀원이 작성하신 코드이다.
Event를 호출하거나 받으려는 Class들은 IListener를 상속받아서 OnEvent() 메서드를 사용할 수 있다.
다른 스크립트에서 EventManager를 호출하기 위해 싱글톤화 시켜준다.
OnEvent()를 통해 이벤트를 호출받으려는 Class들을 AddListener를 통해 ILister 리스트에 넣어준다.
다른 Class로 이벤트를 호출하는 메서드. 이를 통해 다른 Class로 데이터를 넘겨줄 수 있는데, 데이터의 종류가 배열, 리스트, 클래스 등 모든 변수를 넘겨줄 수 있다.
해당 코드는 전투 씬으로 넘어가기 위한 ShowBattle() 메서드이다.
몬스터를 생성하기 위해 Event를 쏘아주는 것을 확인할 수 있다.
이 후, 몬스터를 생성하기 위해 MonsterManager로 넘어오고, 해당 이벤트를 호출받기 위해 IListener를 상속받고 있는 것을 확인할 수 있다.
또한 생성자에서 AddListener를 통해 이벤트를 호출받을 수 있는 Class로 등록해준다.
그 후, 해당 MonsterManager 클래스 내에 선언해둔 OnEvent() 메서드를 통해 이벤트를 호출받고, MakeMonsters() 메서드를 실행한다.
우리 팀의 에이스이신 분이 정말 수준이 뛰어나시다. 이 분의 코드를 읽는 것만으로도 공부가 된다. 이해하는 데 매우 어렵긴 하지만, 굉장히 친절하셔서 질문에도 모두 답해주시고 피드백을 주신다. 이 정도의 레벨만 되어도 좋을 것 같다. 내 롤모델이다! 🥰
아무튼 오늘은 팀원들의 도움 덕분에 내가 맡은 바를 끝낼 수 있었다. 굉장히 뿌듯하고 신난다. 코딩이 재미 있는 것 같기도?? 하고???
다음부터는 팀 프로젝트를 할 때, 팀원들과 내 진행 상황을 자주 공유해야 겠다. 그래야 몸이 덜 고생한다! 🫠