TIL - TextRPG 공격 구현하기

Amberjack·2024년 1월 10일
0

TIL

목록 보기
15/83
post-thumbnail

📖 24.01.10 TextRPG 공격 구현하기

오늘은 팀 프로젝트를 계속 진행했다.
오늘 내가 진행한 것은

1. 다른 팀원과의 MonsterManager 병합

2. DungeonManager에서 공격 구현하기

😣 다른 팀원과의 MonsterManager 병합

다른 팀원분이 작성하신 MonsterManager를 기반으로 내가 인터페이스를 상속시켜서 진행을 하고 있었다. 그러던 와중, 내가 구현했던 기능들을 다른 팀원이 더 좋게 구현하셔서 병합을 하게 되었는데, 둘다 같은 스크립트 파일을 수정했다보니 코드를 병합할 필요가 있었다. 다행이도 작업량이 많지 않아 금방 해결했지만, 규모가 큰 프로젝트였으면 진땀 뺄 뻔했다. 다음부터는 자신의 진행 상황을 자주 교류하도록 해야겠다.

😎 DungeonManager에서 공격 구현하기

처음 작성할 때는 코드의 기본 구조를 이해하는 것 조차 너무 힘들었다. 처음 이틀은 별로 진행된 것이 없어 굉장히 초조했다. 그러나 오늘 기본 구조를 작성하신 팀원과 얘기를 하고 질문을 한 결과, 결국 공격을 구현하는 데 성공했다! 너무 오래 걸린 것 같아 팀원들에게 정말 죄송하다... 그래도 오늘 지난 이틀동안 손도 못 쓴 코드를 하루만에 해치우니 뿌듯하다... 🥰

📌 유의해야 할 문법!

🖥️ 인터페이스

오늘 처음으로 인터페이스를 사용했다. 인터페이스를 통해 공격을 하거나, 받을 때의 공격력과 체력의 변화에 대한 처리를 인터페이스를 통해서 할 수 있었다. 맨 처음에는 프로퍼티의 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;
    }
    ...
}

✨ EventManager.cs

우리 팀의 에이스이신 팀원이 작성하신 코드이다.

1. 이벤트 종류를 처리하기 위해 EventType을 enum형으로 선언

2. 이벤트를 받을 IListener


Event를 호출하거나 받으려는 Class들은 IListener를 상속받아서 OnEvent() 메서드를 사용할 수 있다.

3. EventManager 싱글톤


다른 스크립트에서 EventManager를 호출하기 위해 싱글톤화 시켜준다.

4. 이벤트를 받을 Class들의 리스트


OnEvent()를 통해 이벤트를 호출받으려는 Class들을 AddListener를 통해 ILister 리스트에 넣어준다.

5. 이벤트를 호출하는 PostEvent


다른 Class로 이벤트를 호출하는 메서드. 이를 통해 다른 Class로 데이터를 넘겨줄 수 있는데, 데이터의 종류가 배열, 리스트, 클래스 등 모든 변수를 넘겨줄 수 있다.

6. IListener 리스트에서 제거하기

✨ EventManager를 실제로 사용하기


해당 코드는 전투 씬으로 넘어가기 위한 ShowBattle() 메서드이다.

몬스터를 생성하기 위해 Event를 쏘아주는 것을 확인할 수 있다.


이 후, 몬스터를 생성하기 위해 MonsterManager로 넘어오고, 해당 이벤트를 호출받기 위해 IListener를 상속받고 있는 것을 확인할 수 있다.

또한 생성자에서 AddListener를 통해 이벤트를 호출받을 수 있는 Class로 등록해준다.


그 후, 해당 MonsterManager 클래스 내에 선언해둔 OnEvent() 메서드를 통해 이벤트를 호출받고, MakeMonsters() 메서드를 실행한다.

🥰 오늘의 회고

우리 팀의 에이스이신 분이 정말 수준이 뛰어나시다. 이 분의 코드를 읽는 것만으로도 공부가 된다. 이해하는 데 매우 어렵긴 하지만, 굉장히 친절하셔서 질문에도 모두 답해주시고 피드백을 주신다. 이 정도의 레벨만 되어도 좋을 것 같다. 내 롤모델이다! 🥰

아무튼 오늘은 팀원들의 도움 덕분에 내가 맡은 바를 끝낼 수 있었다. 굉장히 뿌듯하고 신난다. 코딩이 재미 있는 것 같기도?? 하고???

다음부터는 팀 프로젝트를 할 때, 팀원들과 내 진행 상황을 자주 공유해야 겠다. 그래야 몸이 덜 고생한다! 🫠

0개의 댓글