디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

내 코딩 스타일 점점 마음에 들어감

ㅆㅇㅆ(124.216) 2025.03.08 21:18:54
조회 44 추천 0 댓글 2

using UnityEngine;

using FSM;

using Core;

using StatSystem;

using JDWTaskSystem;


[RequireComponent(typeof(Destroyed))]

[DisallowMultipleComponent]

public abstract class FSMEntity : BaseStateMachineGraph, IEntity

{

    #region Serialized Fields

    [Tooltip("EntityInitializer (데이터, 모듈, 이벤트 등 주입)")]

    [SerializeField] protected EntityInitializer entityInitializer;


    [Tooltip("EntityDataProvider (데이터 제공)")]

    [SerializeField] protected EntityDataProvider dataProvider;


    [Tooltip("EntityModuleProvider (모듈 제공)")]

    [SerializeField] protected EntityModuleProvider moduleProvider;


    [Tooltip("EntityEventBus (이벤트 관리)")]

    [SerializeField] protected EntityEventBus eventBus;

    #endregion


    protected Destroyed destroyed;

    protected bool isDefeated = false;

    protected bool isInitialized = false; // 초기화 완료 여부

    private JDWTaskVoid? initializationTask; // nullable로 유지


    protected override void Awake()

    {

        base.Awake();

        destroyed = GetComponent<Destroyed>();

        SetFSMEnabled(false); // 초기에는 FSM 비활성화

        InitializeComponents(); // 컴포넌트 초기화 (동기)

    }


    /// <summary>

    /// 필요한 컴포넌트들을 초기화

    /// EntityInitializer, DataProvider, ModuleProvider, EventBus는 주입된 값이 없으면 자식 컴포넌트에서 찾음

    /// </summary>

    protected virtual void InitializeComponents()

    {

        destroyed = GetComponent<Destroyed>();

        entityInitializer = entityInitializer ?? GetComponentInChildren<EntityInitializer>();

        dataProvider = dataProvider ?? GetComponentInChildren<EntityDataProvider>();

        moduleProvider = moduleProvider ?? GetComponentInChildren<EntityModuleProvider>();

        eventBus = eventBus ?? GetComponentInChildren<EntityEventBus>();


        if (entityInitializer == null) Debug.LogError("EntityInitializer가 할당되지 않았습니다.");

        if (dataProvider == null) Debug.LogError("EntityDataProvider가 할당되지 않았습니다.");

        if (moduleProvider == null) Debug.LogError("EntityModuleProvider가 할당되지 않았습니다.");

        if (eventBus == null) Debug.LogError("EntityEventBus가 할당되지 않았습니다.");

    }


    /// <summary>

    /// 외부에서 호출하는 초기화 메서드 (엔티티별 구현 필요)

    /// </summary>

    public abstract void Initialize(EntityDetailsSO details, int spawnNumber, DungeonLevelSO dungeonLevel);


    /// <summary>

    /// 비동기 초기화 메서드

    /// </summary>

    protected virtual async JDWTaskVoid InitializeAsync(EntityDetailsSO details, int spawnNumber, DungeonLevelSO dungeonLevel)

    {

        await JDWTask.SwitchToMainThread();

        if (!isInitialized)

        {

            InitializeComponents(); // 중복 호출 방지했지만 안전을 위해 재확인

            initializationTask = entityInitializer.InitializeAsync(this, details);

            if (initializationTask.HasValue) // nullable 체크

            {

                await initializationTask.Value; // 실제 JDWTaskVoid를 await

            }

            isInitialized = true; // 초기화 완료 표시

            Enable(true); // 초기화 완료 후 FSM 활성화

            Debug.Log($"{this.GetType().Name}: 초기화 완료");

        }

    }


    protected virtual void OnEnable()

    {

        if (!isInitialized)

        {

            Debug.LogWarning($"{this.GetType().Name}: 초기화가 완료되지 않았습니다. OnEnable 지연.");

            return;

        }


        var combatEvent = eventBus?.GetEvent<EntityCombatEvent>();

        if (combatEvent != null)

        {

            combatEvent.OnDefeated += OnEntityDefeated; // EntityCombatEvent의 OnDefeated 구독

            Debug.Log($"{this.GetType().Name}: EntityCombatEvent 구독 완료");

        }

        else

        {

            Debug.LogWarning($"{this.GetType().Name}: EntityCombatEvent가 null입니다. EventBus 상태를 확인하세요.");

        }

    }


    protected virtual void OnDisable()

    {

        if (!isInitialized)

        {

            Debug.LogWarning($"{this.GetType().Name}: 초기화가 완료되지 않았습니다. OnDisable 지연.");

            return;

        }


        var combatEvent = eventBus?.GetEvent<EntityCombatEvent>();

        if (combatEvent != null)

        {

            combatEvent.OnDefeated -= OnEntityDefeated; // 구독 해제

            Debug.Log($"{this.GetType().Name}: EntityCombatEvent 구독 해제 완료");

        }

    }


    /// <summary>

    /// 엔티티가 패배했을 때 호출되는 이벤트 핸들러

    /// </summary>

    public virtual void OnEntityDefeated(EntityCombatEvent sender, CombatDefeatedEventArgs args)

    {

        if (!isInitialized || isDefeated)

        {

            Debug.LogWarning($"{this.GetType().Name}: 초기화 전이거나 이미 패배 상태입니다.");

            return;

        }


        isDefeated = true;

        var destroyedEvent = eventBus?.GetEvent<DestroyedEvent>();

        if (destroyedEvent != null)

        {

            destroyedEvent.CallDestroyedEvent(true);

            Debug.Log($"{this.GetType().Name}: DestroyedEvent 발행됨");

        }

        else

        {

            Debug.LogWarning($"{this.GetType().Name}: DestroyedEvent가 EntityEventBus에 할당되지 않았습니다.");

        }

    }


    /// <summary>

    /// 엔티티 활성화/비활성화를 처리

    /// </summary>

    protected void Enable(bool isEnabled)

    {

        SetFSMEnabled(isEnabled);

    }


    /// <summary>

    /// FSM의 활성화/비활성화를 수행

    /// </summary>

    protected void SetFSMEnabled(bool isEnabled)

    {

        enabled = isEnabled;

    }


    #region Getter/Setter

    public DestroyedEvent GetDestroyedEvent()

    {

        if (!isInitialized)

        {

            Debug.LogWarning($"{this.GetType().Name}: 초기화가 완료되지 않았습니다. DestroyedEvent 반환 불가.");

            return null;

        }

        return eventBus?.GetEvent<DestroyedEvent>();

    }


    public EntityModuleProvider GetEntityModuleProvider() => moduleProvider;

    public EntityDataProvider GetEntityDataProvider() => dataProvider;

    public Transform GetTransform() => transform;


    public JDWTaskVoid WhenInitialized => initializationTask.HasValue ? initializationTask.Value : JDWTaskVoid.CompletedTask;

    #endregion

}



가끔 내 코드보면


'누가 이런 아름다운 코드를 짰을까?'


그건 바로 나


라고 뿌듯함 듬ㅋㅋ



추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
등록순정렬 기준선택
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 매니저들에게 가장 잘할 것 같은 스타는? 운영자 25/03/10 - -
2827281 eventfd를 기반으로 하는 GUI 툴킷이 있는가? *루비*갤로그로 이동합니다. 03.09 22 0
2827279 입력 도구 서버의 메인루프로 Qt6 메인 루프 도입에 대한 검토 2 *루비*갤로그로 이동합니다. 03.09 42 0
2827278 입력 도구 서버의 메인루프로 Qt6 메인 루프 도입에 대한 검토 *루비*갤로그로 이동합니다. 03.09 40 0
2827277 꽃가게 몰카 ㅇㅅㅇ [7] 헤르 미온느갤로그로 이동합니다. 03.09 47 0
2827276 영등포구청에 있는 SK 뷰 구내식당이 [2] 강유현갤로그로 이동합니다. 03.09 36 0
2827275 Qt6 메인루프를 non-GUI 환경에서 사용 가능한가? [4] *루비*갤로그로 이동합니다. 03.09 45 0
2827273 데이팅 어플 그저깨 깔아서 보니까 전여친 & 전전여친 전부 올라가있노 Kyle(193.82) 03.09 31 0
2827272 딥시크보고 왜 나보다 못하냐고 갈궜는데 개웃김 [1] 프갤러(211.210) 03.09 41 0
2827271 2차 썰재업) 화교분탕들의 무한반복 날조선동 패턴 ㅇㅇ(175.223) 03.09 29 0
2827270 LLM같은 부인 있었으면 좋겠네요 [1] *루비*갤로그로 이동합니다. 03.09 30 0
2827269 몬헌 같은 겜 만들고 싶다 [2] ㅆㅇㅆ(124.216) 03.09 36 0
2827267 C++은 pure Virtual 함수 지원도하지만 애초에 ZoC추구해서 ㅆㅇㅆ(124.216) 03.09 40 0
2827266 C++ 다중 상속 실제로 많이씀 ㅇㅅㅇ? [14] 강유현갤로그로 이동합니다. 03.09 64 0
2827247 GPT가 코드 잘짰다고 하는건 기본적으로 비동기 프로그래밍할수록 평가 ㅆㅇㅆ(124.216) 03.09 31 0
2827240 드디어 GPT가 인정한 프로페셔널 코드 품질에 도달했다 [1] ㅆㅇㅆ(124.216) 03.09 50 0
2827228 별들에게 물어봐 같은 드라마 만들 돈으로 [1] 프갤러(211.210) 03.09 33 0
2827216 intp -> intj 로 바뀜 [3] 익명의따당이갤로그로 이동합니다. 03.09 68 0
2827210 아이유 타임지 기사 발명도둑잡기갤로그로 이동합니다. 03.09 31 0
2827207 웹 보안 실험해볼 사이트 [4] 프갤러(110.35) 03.09 54 0
2827204 종교와 계몽 발명도둑잡기갤로그로 이동합니다. 03.09 19 0
2827202 누구를 믿을지, 의심해야 할지…물고문 당하던 박형식 발명도둑잡기갤로그로 이동합니다. 03.09 26 0
2827201 교주님 나오셨으니까 휴거는 반드시 옵니다 발명도둑잡기갤로그로 이동합니다. 03.09 20 0
2827200 <컴플리트 언노운> 발명도둑잡기갤로그로 이동합니다. 03.09 22 0
2827198 <말할 수 없는 비밀> 발명도둑잡기갤로그로 이동합니다. 03.09 23 0
2827194 스파인 이미지로 저장하는법 아는사람? [3] 프갤러(182.230) 03.09 28 0
2827192 역사가 미키가 마카롱가게 사장으로…'미키 17' 원작과 차이는 발명도둑잡기갤로그로 이동합니다. 03.09 37 0
2827189 '일시 석방' 이명박 형집행정지 연장 신청 발명도둑잡기갤로그로 이동합니다. 03.09 27 0
2827186 고관세와 화폐개혁의 관계 발명도둑잡기갤로그로 이동합니다. 03.09 34 0
2827182 경도 8자리 숫자 중 한개를 틀리면 8km 오차 나는게 맞나요? 발명도둑잡기갤로그로 이동합니다. 03.09 39 0
2827179 가로수길, 이태원, 홍대와 윤석열 찬송가 발명도둑잡기갤로그로 이동합니다. 03.09 30 0
2827176 포천 오폭 사고…"전투기 2대가 동시 실수? 확인 절차 지켜졌나 살펴봐야 발명도둑잡기갤로그로 이동합니다. 03.09 38 0
2827175 이제 버그 패치 되려면 [3] 프갤러(49.165) 03.09 63 2
2827174 바둑기사 나오는 <승부>, <응답하라 1988> 발명도둑잡기갤로그로 이동합니다. 03.09 21 0
2827173 무신론자들의 명언 발명도둑잡기갤로그로 이동합니다. 03.09 35 0
2827172 리죄명 대표님 곧 살자하실듯.. ㅠ ㅅ ㅠ [2] ♥냥덩♥갤로그로 이동합니다. 03.09 75 1
2827171 우리가 싫어하는 생각을 위한 자유 -미국 수정헌법 1조의 역사- 발명도둑잡기갤로그로 이동합니다. 03.09 22 0
2827170 헌법의 보루, 김이수의 6년 발명도둑잡기갤로그로 이동합니다. 03.09 19 0
2827169 비전공 국비충 개발자 취업 성공 ㅋㅋㅋ [2] 프갤러(14.37) 03.09 121 0
2827168 스텔라장-뒷모습 발명도둑잡기갤로그로 이동합니다. 03.09 22 0
2827167 제니-루비 발명도둑잡기갤로그로 이동합니다. 03.09 46 0
2827166 자바 swing 공부 [3] mmmgg갤로그로 이동합니다. 03.09 56 0
2827165 2차 썰재업) 화교분탕들의 역겨운 이간질 가면질 ㅇㅇ(175.223) 03.09 51 0
2827164 <When Life Gives You Tangerines> 발명도둑잡기갤로그로 이동합니다. 03.09 20 0
2827163 나는 헌재가 국가보안법 폐지 반대, 통합진보당 해체 때문에 발명도둑잡기갤로그로 이동합니다. 03.09 39 0
2827162 너희들 죄다 원종이, 석열이 감빵 동기로 만들어야 되는데 발명도둑잡기갤로그로 이동합니다. 03.09 46 1
2827160 딱님 왜케 똑똑함? [10] 나트륨찡갤로그로 이동합니다. 03.09 80 0
2827159 ❤✨☀⭐나님 시작합니당⭐☀✨❤ [1] ♥냥덩♥갤로그로 이동합니다. 03.09 47 0
2827158 절륜한 프갤러들을 추려서 나의 무한성에 초대하고 싶구나 [3] 딱님갤로그로 이동합니다. 03.09 42 0
2827157 나님이 원종이 보고 하나 결심한게 있음 [5] ♥냥덩♥갤로그로 이동합니다. 03.09 64 0
2827156 코딩에 답은 있다 이기 슈퍼막코더(116.65) 03.09 46 0
뉴스 “동물의 왕국이다”라는 평가 나온 추성훈♥야노시호 청혼 비하인드 디시트렌드 03.09
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2