오늘 학습 키워드

리팩토링, 책임

오늘 학습 한 내용을 나만의 언어로 정리하기

중복된 부분 새로 Class 만들어서 합치기

  • SkillSlotUI와 SkillIconUI 부분이 너무 비슷해보여서, 주말에 확인해 봤는데 실제로 똑같은 파트가 있었음
  • 이름도 너무 모호해서, DraggableSkillIcon을 상속하는 SkillBarSlot, SkillInventorySlot 으로 나누기로함

책임 위임?

  • 지금은 SkillManager가 스킬 하나하나에 대한 인스턴스를 리스트로 가지고 있음.

  • 그런데 가만보면 스킬 바 슬롯을 비운다던가 하는 내용이 SkillManager에 들어가있음.

  • 그러면 차라리 SkillBar한테 옮기는게 낫지 않나? 하는 의문.

  • >> 그러면 스킬바의 책임이 너무 커짐.

  • 다른 방향으로 고민. 지금 스킬 바 슬롯이 매니저를 직접 부르고있는데, 이게 맞나?

  • 그래서 스킬 바 슬롯 스킬 바 스킬 매니저 순으로 호출하도록 변경하고자 함.

그리하여 변경된 스킬 시스템 구조

---

config:

  theme: redux

  layout: elk

  look: neo

---

classDiagram

direction TB

    class SkillData {

        +name

        +value

        +cooldown

        +icon

        +SkillLogic logic

    }

    class ISkillLogic {

        +void Activate()

    }

    class SkillManager {

        +List skillDatas

        +Dict logicMap

        +UseSkill()

    }

    class SkillInstance {

        +SkillData Data

        +float currentCooldown

        -ISkillLogic logic

        +TickCooldown(float deltaTime)

        +CanUse()

        +TryUse()

    }

    class ExplosionSkillLogic_example {

    }

    class DraggableSkillIcon {

        +Image iconImage

        +SkillData skillData

        +GameObject dragIconPrefab

        -GameObject dragClone

        -Canvas canvas

        +GetIconSkillData()

        +OnBeginDrag()

        +OnDrag()

        +OnEndDrag()

    }

    class SkillInventorySlot {

        +SkillInventory skillInven

        +SetSlot()

        +OnPointerClick()

    }

    class SkillBarSlot {

        +TMP_Text keyText

        +SkillBar skillBar

        +SetSlot()

        +ClearSlot()

        +OnDrop()

        +OnPointerClick()

    }

    class SkillBar {

        +GameObject slotPrefab

        +Transform slotParent

        -SkillManager skillManager

        -List slots

        +AssignSkillToSlot()

        +ClearSkillSlot()

        +SwapSkillSlots()

    }

    class SkillInventory {

        +Transform content

        +GameObject skillIconPrefab

        +List haveSkills

        +SkillManager skillManager

        +TryEquipFirstEmptySlot()

    }

  

    <<ScriptableObject>> SkillData

    <<Interface>> ISkillLogic

    <<Class>> SkillManager

    <<Class>> SkillInstance

    <<Class>> ExplosionSkillLogic_example

    <<Class>> DraggableSkillIcon

    <<Class>> SkillInventorySlot

    <<Class>> SkillBarSlot

    <<Class>> SkillBar

    <<Class>> SkillInventory

  

    ISkillLogic -- ExplosionSkillLogic_example

    SkillInstance -- ISkillLogic

    SkillData -- ExplosionSkillLogic_example

    DraggableSkillIcon <|-- SkillInventorySlot

    DraggableSkillIcon <|-- SkillBarSlot

    SkillBar --> SkillBarSlot

    SkillInventory --> SkillInventorySlot

    SkillManager o-- SkillInstance : Using SkillLogicFactory

    SkillInventory --> SkillManager

    SkillBar --> SkillManager
  • 변경점
    1. 전반적으로 클래스 명을 명확하게 바꿈
    2. SkillInventorySlot과 SkillBarSlot의 공통 부모로 DraggableSkillIcon을 만듬
    3. 책임을 위임해서, 가능하면 최하단에 있는 SlotUI들이 Manager를 직접 부르지 않고, 상위에 있는 UI를 통해 변경하도록 함

보기도, 이해하기에도 편해짐!

팀프로젝트 TextRPG 만들기

  • 기존에 내가 만들었던 구조를 리팩토링 해서 사용하기로 결정
classDiagram

direction TB

    class PlayerData {

        +Name

        +Level

        +Job

        +ATK

        +DEF

        +HP

        +Gold

        +List EquipItems

        +List Items

        +List Skills

    }

  

    class GameScene {

        List nextScenes

        IGameScene prevScene

        sceneIndex

        +SetNextScene(IGameScene nextScene)

        +SetPrevScene(IGameScene prevScene)

        +StartScene()

        +PrintNextScenes()

        +EndScene()

    }

  

    class FirstScene {

    }

  

    class TownScene {

    }

  

    class ProfileScene {

    }

  

    class InventoryScene {

    }

  

    class InnScene {

    }

  

    class Item {

        +Name

        +Description

        +Stat

        +Price

        +IsEquip

        +ItemType

    }

  

    class Dungeon {

        +Name

        +Description

        +GoldReward

        +ExperienceReward

        +NeedDEF

        +List monsters

    }

  

    class Monster {

        +Name

        +ATK

        +DEF

        +HP

        +MaxHP

        +IsDead

    }

  

    class ShopScene {

        +List shopItems

    }

  

    class DungeonScene {

        +List dungeons

    }

  

    class GameManager {

        +GameManager instance

        +Dictionary itemTypeString

        +PlayerData playerData

        +string path

        +GameExit()

        +NewPlayerData(string playerName)

        +LoadPlayerData()

        +SavePlayerData()

    }

  

    class SceneManager {

        +enum SceneType

        +Dictionary scenes

        +SceneSetting()

    }

  

    class SkillInventoryScene {

        +List skillTreeSkills

        +UpdateCanILearn()

    }

  

    class Skill {

        +Name

        +Description

        +Cooldown

        +Power

        +isMultiply

        +ToSkillTreeString()

    }

  

    <<Class>> PlayerData

    <<Class>> GameScene

    <<Class>> FirstScene

    <<Class>> TownScene

    <<Class>> ProfileScene

    <<Class>> InventoryScene

    <<Class>> InnScene

    <<Class>> Item

    <<Class>> Dungeon

    <<Class>> Monster

    <<Class>> ShopScene

    <<Class>> DungeonScene

    <<Class>> GameManager

    <<Class>> SceneManager

    <<Class>> SkillInventoryScene

    <<Class>> Skill

  

    GameManager o-- PlayerData

    GameScene <|-- FirstScene

    GameScene <|-- TownScene

    GameScene <|-- ProfileScene

    GameScene <|-- InventoryScene

    GameScene <|-- SkillInventoryScene

    GameScene <|-- ShopScene

    GameScene <|-- InnScene

    GameScene <|-- DungeonScene

    PlayerData o-- Item

    PlayerData o-- Skill

    DungeonScene o-- Dungeon

    Dungeon o-- Monster

    SceneManager -- GameScene

    GameManager -- SceneManager

  • 변경점
    1. IGameScene 삭제
    2. GameScene을 관리하는 SceneManager 생성. GameManager의 과도한 책임을 SceneManager로 분리함
    3. Skill과 Item을 상속했던 하위 클래스 삭제.
    4. (차트에는 없지만) 텍스트 입출력 관련해서 클래스 생성 예정

내일 학습 할 것은 무엇인지

씬 만들기 + 텍스트 렌더러 만들기?