ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스킬 스크립트... 매번 생성해야 하나...?
    게임 클라이언트 개발/MakeDNF 2024. 4. 10. 23:27

    이번 글에선 스킬을 추가할 때마다 반복적인 작업을 해야하는 번거로움을 없애기 위해, 조금이라도 빠르게 스킬을 추가하기 위해, 스크립트를 설정한 값에 따라 자동으로 추가해주는 툴을 구현한 내용을 작성할 것이다.

     

    스킬 추가할 때마다... 노가다...?

    캐릭터의 스킬을 추가할 때 마다, 패시브 스킬은 스크립트를 하나만 추가해도 되지만, 액티브 스킬을 구현할때면 ActiveSkill 클래스를 상속받는 스킬 스크립트 1개, SkillState 클래스를 상속받는 스킬 상태 스크립트를 여러 개 작성해야 한다. 예를 들어, Ground Monk의 기본 공격의 경우, 1타부터 5타까지 총 5개의 상태가 존재한다. 이를 구현하기 위해선, ActiveSkill 클래스를 상속받는 BaseAttack 클래스 스크립트 한 개가 필요하고, 1타부터 5타까지 SkillState 클래스를 상속받는 상태 클래스 스크립트 5개가 필요하다.

    필요한 스크립트 파일만 6개...

     

    또한 스킬 클래스를 구현하다보면, 이것 저것 추가해야하는 코드가 정말 많다. Skill 클래스의 추상 메소드들을 구현해야 하고, 스킬로 적을 공격할 수 있는 경우에는 IAttackable 인터페이스를 추가해야 한다. 물론 '빠른 작업 및 리펙토링' 기능으로 필요한 코드를 뚝딱 추가할 수 있지만, 코드가 뒤죽박죽 생성되어 #region으로 코드를 따로 정리해줘야 한다. 게다가 액티브 스킬의 경우 여러 상태 클래스를 추가해줘야하는데, 스크립트를 미리 생성하지 않으면 자동 완성이 안되고 빨간 줄이 가득한 스크립트를 마주할 수 있다.

    필요한 코드가 구현되지 않아 발생한 수많은 빨간줄

     

    또한 각 스크립트의 코드 정리 방식을 계속 까먹어서 기존에 구현했던 스크립트를 오른쪽에, 새로운 스크립트를 왼쪽에 켜놓고 코드를 복사 및 붙여넣기 작업을 진행했었다.

    언제 다 복사 붙여넣기 하지...

     

    노가다 작업. 이젠 그만!

    이러한 노가다 작업을 그만하고, 스킬 생성 작업의 효율성을 높히기 위해, 스킬 스크립트 생성 툴을 제작하기로 결정했다. 어떤 스킬을 생성할 건지 스킬의 이름이나 스킬 타입을 설정하면, 템플릿을 활용하여 지정된 폴더에 스킬 스크립트가 생성된다. 

     

    우선 템플릿 문서를 작성했다. 액티브 스킬, 패시브 스킬, 스킬 상태 템플릿 총 세 개의 문서를 작성했으며, 수정해야할 부분의 키워드는 전처리기 지시자나 다른 기호와 겹치지 않도록 $ 기호로 묶어 처리했다. 

    // SKillTemplate.txt
    using System.Collections.Generic;
    using UnityEngine;
    
    namespace $ClassName$Skill
    {
        public partial class $SkillName$ : $Inheritance$
        {
            private enum EState { $StateElement$ }
    
            #region Properties
    
            public override int SkillCode => typeof($SkillName$).GetHashCode();
    
            public override ESkillType SkillType => $SkillTypeList$;
    
            #endregion Properties
    
    $IAttackable Implementation Start$
            public DNFTransform AttackerDNFTransform { set; get; }
    
            public HitboxController AttackerHitboxController { set; get; }
    
            public List<IDamagable> AlreadyHitTargets { set; get; }
    
            public void CalculateOnHit(List<IDamagable> targets) { }
    $IAttackable Implementation End$
    
            #region Methods
    
            #region Override
    
            public override void Init(Character character, AttackBehaviour attackController, EKeyName keyName)
            {
                base.Init(character, attackController, keyName);
    
    $IAttackable Initialization Start$
                AttackerDNFTransform = character.DNFTransform;
                AttackerHitboxController = GetComponent<HitboxController>();
                AttackerHitboxController.Init(AttackerDNFTransform);
                AlreadyHitTargets = new List<IDamagable>();
    $IAttackable Initialization End$
    
    $State Initialization Start$
                stateList.Add(new $StateName$(character, this));
    $State Initialization End$
            }
    
            public override bool CheckCanUseSkill(ActiveSkill curSkill)
            {
                return true;
            }
    
            #endregion Override
           
            #endregion Methods
        }
    }

     

    데이터로는 스킬을 사용할 클래스 타입, 스킬의 이름, 스킬 타입을 기본적으로 설정할 수 있다. 스킬 타입으로 Active가 포함될 경우, 스킬이 적을 직접 공격하는지에 대한 여부 (Attackable), 스킬의 각 상태 리스트 (State List)를 추가로 설정할 수 있다.

    스크립트 생성 Tool

     

    스킬의 이름을 스킬 클래스 명으로 설정하기 때문에, 스킬의 이름에는 공백이 있으면 안된다. 또한 스킬 타입으로 Active 또는 Passive 중 한 가지는 반드시 선택되어야하고, BaseAttack, Common, ClassSpecific 중 한 가지는 반드시 선택되어야 한다. 이렇게 스킬 클래스를 생성하는데 문제가 발생하는 경우 알림창을 띄우도록 구현하여, 스크립트 파일 생성 시 에러가 발생하지 않도록 구현했다. 

    모든 데이터가 적절하지 않은 경우 에러 발생 이유를 출력하는 모습

     

    모든 데이터가 적절하게 기입된 경우, 하단의 Create 버튼을 클릭하여 직업과 스킬 타입에 맞는 폴더에 스킬 스크립트를 생성할 수 있다. 

    Tool을 활용하여 생성한 스크립트 목록
    Tool을 활용하여 생성된 스크립트

     

Designed by Tistory.