[Unity] 게임에서의 의뢰와 계승, 구별과 사용[탑방어]

15335 단어 C#Unity초학자tech

개시하다


탑방어 제작은 이번이 네 번째다.
이번에는'위임'을 주제로 상속과 다른 활용법, 위임과 상속 두 가지를 결합해 적 플레이어를 만드는 AI에 대해 설명하고 싶다.
지금까지의 보도는 다음과 같다.
https://zenn.dev/supple/articles/2012a0ebfe13181286af
https://zenn.dev/supple/articles/64c9f9aaf2e7ca6f7151
https://zenn.dev/supple/articles/e4a5a7bb57922c

이른바 위탁


부탁이 뭔데?
프로그래밍을 배우면 대개 여기서부터 계승, 제어, 다중모드주의 등 어려운 단어들이 많이 나와 많은 사람이 혼란스러워하겠죠.
설령 "넘겨주다"라고 말해도 뜻은 여러 방면에 관련된다.
  • 교환위치(광의적인 의뢰)
  • 대상을 대상으로 하는 방법의 권한 수여
  • C#의 정계부호
  • 모든 의뢰는 잘못된 것이 아니다.
    부탁을 할 때는 어떤 부탁인지 먼저 알아야 하기 때문에 혼란도 당연하다.
    그럼 이 상품들을 순서대로 봅시다.

    위치 교환(넓은 의미의 의뢰)


    제어는 어떤 기능을 가진 클래스를 구성원 변수로 성명하고 이 변수를 사용하는 것을 말한다.
    재활용 가능한 기능을 분리해 등급화해 사용하거나 비대해진 카테고리를 기능별로 분해해 등급화해 활용한다.
    이미지 활용

    특정한 처리를 다른 곳에 맡긴다는 뜻은 넓은 의미의 위탁을 가리킨다.

    대상을 향한 수법으로 의뢰하다


    대상을 대상으로 하는 의뢰는 상술한 통제 위치 외에 다태성(다태성) 개념도 추가했다.
    다중모드주의란 양수인을 바꾸면 서로 다른 동작을 할 수 있다는 개념을 말한다.
    지난번 보도"반을 계승하는 특수 단원의 제작 방법"에서 우리는 단원과 다른 행동의 거점 단원을 만들었지만, 이 유닛과Fort 유닛에서 행동이 다른 부분은 다중모드주의였다.
    다음 그림은 위임된 이미지입니다.
    委譲の利用イメージ
    이번 보도는 이 의뢰를 주제로 한다.

    C#의 정계부호


    C#에는 delegate 기능이 있습니다.
    이것은 내용을 바꿀 수 있는 방법으로 양도하는 기능을 가지고 있다.
    이번 주제에서 벗어났기 때문에 자세히 설명하지 않는다.
    https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/delegates/

    이번에 할 일


    이번에 적 거점의 AI를 만들려면 내용이 상당히 복잡하다.
    마지막으로 어떤 그림이 나올지 모르니 이 그림을 다시 보세요.

    제어 장치 AI


    이번에는 거점 부문 AI를 위탁 시행하고 그 전에 유닛급 AI 기능을 분리한 뒤 조정한다.

    양수 범주 만들기


    의뢰인의 AI류를 먼저 제작한다.
    이름은 유닛AI입니다.

    필수 매개변수


    AI가 머리라면 유닛은 몸이다.
    이 AI는 어느 단위의 AI 매개 변수인지 알아야 한다.
    UnitAI.cs
    public class UnitAI
    {
        public Unit ownerUnit;      // この思考の持ち主
    }
    

    부분 제작


    기존에 유닛반에서 했던 사고 부분을 대체하는 방법을 추가한다.
    이 때 가상 키워드를 사용하여 다시 쓸 수 있습니다.
    이렇게 되면 후계자 반에서 다른 행동을 할 수 있다.
    UnitAI.cs
    public class UnitAI
    {
        // ユニットを更新するメソッド。
        // virtualにすることで派生クラスで違う思考をさせることを可能にする
        public virtual void UpdateUnit(float deltaTime)
        {
            //TODO: Unit.csのUpdateUnitメソッドのAI部分をここに移植する
    	//      長くなるので中身は割愛します。
        }
    }
    

    위탁 부분의 제작


    의뢰인이 생기면 유닛 등급을 유닛 AI 등급을 사용하는 상태로 고친다.

    필수 매개변수


    생성된 UnitAI 클래스를 매개변수로 추가합니다.
    Unit.cs
        protected UnitAI unitAi = null;     // ユニットのAI
    

    AI 만들기


    AI 콘텐츠를 만드는 방법을 만든다.이름은 크레이트AI다.
    Start 메서드를 통해 Create AI 메서드를 호출하여 객체를 생성하는 즉시 AI를 만듭니다.
    CreateAI 방법은 virtual 키워드를 사용하여 다시 쓸 수 있습니다.
    이렇게 하면 후계자 학급에서 AI를 다르게 설정할 수 있다.
    Unit.cs
        // AIを作成するメソッド
        // virtualにすることで派生クラスで違うAIを割り当てる事ができるようにする
        protected virtual void CreateAI()
        {
            // AIを生成し、思考の持ち主を自分に設定する
            unitAi = new UnitAI();
            unitAi.ownerUnit = this;
        }
        
        void Start()
        {
            // AIを作成する
            CreateAI();
        }
    

    AI 의뢰


    AI 섹션의 코드가 Unit AI 클래스로 전송되어 삭제되었습니다.
    대신 유니에이라는 방법으로 처리를 의뢰했다.
    Unit.cs
        // ユニットを更新するメソッド
        public virtual void UpdateUnit(float deltaTime)
        {
            // AIの更新をunitAIクラスに委譲する
            unitAi.UpdateUnit(deltaTime);
    	
    	// TODO:AIはUnitAIクラスに委譲されたので
            //      AI制御部分のコードはUnitAIクラスに移動させます。
    	//      長くなるので中身は割愛します。
        }
    

    적의 거점을 세우다


    그룹에서 AI를 분리할 수 있기 때문에 적의 거점 단원 제작에 들어간다.

    UnitAI를 계승하여 EnemyFortUnitAI 만들기


    먼저 유닛 AI를 계승할 거점용 AI류를 만들어야 한다.
    이름은 Enemy Fort Unit AI입니다.
    내용은 잠시 후에 기술하겠다.
    EnemyFortUnitAI.cs
    // 敵拠点のAIクラス
    public class EnemyFortUnitAI : UnitAI
    {
        // TODO:ここにAIの中身を書く
    }
    

    FortUnit을 계승하여 EnemyFortUnit을 만들다


    포켓유닛의 적 거점을 계승할 유닛류를 제작한다.
    이름은 Enemy Fort Unit입니다.
    EnemyFortUnit.cs
    // 敵の拠点ユニットクラス
    public class EnemyFortUnit : UnitAI
    {
        public Unit productionUnit = null; // 生産するユニット
        
        protected override void CreateAI()
        {
            // AIを生成し、思考の持ち主を自分に設定する
            unitAi = new EnemyFortUnitAI();
            unitAi.ownerUnit = this;
        }
    }
    
    Create AI 방법을 다시 쓰고 제작된 AI를 Enemy FortUnit AI에 삽입합니다.
    이렇게 되면 통상적인 단원은 유닛 AI를, 적의 거점 단원은 Enemy Fort Unit AI를 사용한다.
    또 이 거점에서 생산되는 단원의 매개 변수도 추가됐다.

    적의 거점을 세운 AI


    AI를 사용하는 틀이 만들어졌으니 이제 AI 콘텐츠를 만들어보자.

    UnitAI를 다시 쓰는 Update Unit


    업데이트 유닛을 다시 쓰는 방법으로 거점으로서의 행동을 추가할 수 있다.
    EnemyFortUnitAI.cs
        public override void UpdateUnit(float deltaTime)
        {
            // 基底クラスのメソッドを呼ぶ
            base.UpdateUnit(deltaTime);
    	
    	// TODO:ここに拠点としての行動を追記する
        }
    

    리소스 저장 후 출격하는 AI를 기술합니다.


    Update Unit 방법을 다시 쓴 뒤 그 안에서 거점으로서의 행동을 추기한다.
    어쨌든 생산할 수 있는 자원이 쌓이면 바로 생산되는 단순한 AI가 되겠죠.

    ownerUnit의 내용이 EnemyFortUnit인지 확인


    여기에 주의점이 하나 있다.
    에니미포터유닛 AI는 적 거점 단원용 AI이기 때문에 생각하는 보유자는 적 거점 단원이어야 한다.
    만약 Enemy Fort Unit 이외에 이런 사고가 있었다면 정상적으로 작동하지 않았을 테니 잘못한 것으로 치자.
    public override void UpdateUnit(float deltaTime){
            if (!(ownerUnit is EnemyFortUnit))
            {   // このAIはEnemyFortUnitクラスでしか動かない
                Debug.LogError("EnemyFortUnitAIの思考の持ち主はEnemyFortUnitである必要があります");
                return;
            }
    

    EnemyFortUnit 작업


    생각하는 사람이 Enemy Fort Unit임을 확인할 수 있다면 사고 순서를 기술하라.
    EnemyFortUnit 레벨에 접근하기 위해 생산에 필요한 자원이 준비되면 단원에 출격하라는 지령을 내렸다.
    public override void UpdateUnit(float deltaTime){
            // 思考の持ち主はEnemyFortUnitクラスなのでキャストする
            EnemyFortUnit unit = ownerUnit as EnemyFortUnit;
    
            if (unit.resourcePoint > unit.productionUnit.cost)
            {   // 生産に必要な資源が溜まっていたら
                // 出撃する
                unit.SortieUnit(unit.productionUnit);
            }
        }
    

    양도와 상속의 구분 사용


    이번에는 위탁과 상속 두 방면을 사용했다.
    이번에 새로 설립된 학급은 유닛 AI가 위탁하고 에니미포드 유닛 AI, 에니미포드 유닛이 사용해 계승한다.
    왜 그랬을까?

    상속은 학급의 성질이 변하지 않는 상황에서만 사용한다


    각 반의 성격을 살펴봅시다.
    유닛급의 성질은'망아지'다.
    FortUnit급의 성질은'망아지'입니다.
    EnemyFortUnit급의 성질은'망아지'입니다.
    유닛AI의 성격은'사고'다.
    EnemyFortUnit AI반의 자질은'사고'입니다.
    .
    EnemyFortUnit와 FortUnit의'망아지'는 성질이 같기 때문에 계승을 사용합니다
    유닛AI와'사고'라는 유닛은 성격이 달라 의뢰를 사용했다.

    최후


    이번 기사를 쓸 때 나도 스스로 복습을 해 보았지만 부정확한 기억법을 써서 공부가 될 줄은 몰랐다.
    솔직히 쉽게 알 수 있는 말은 좀 미묘하지만, 나는 먼저 그림을 넣고 가능한 한 쉽게 하려고 한다.
    이번 게임의 내용은 별 진전이 없지만 용서해 주세요.
    지금 만든 건 어떻게 움직이는 영상도 나오면 좋겠다고 생각했어요.

    좋은 웹페이지 즐겨찾기