디시인사이드 갤러리

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

갤러리 본문 영역

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

ㅆㅇㅆ(124.216) 2025.03.08 21:18:54
조회 52 추천 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 - -
2827068 돈을 버는 너네들이 섹스하고 애 낳아야 연금 지탱하지... [5] ㅆㅇㅆ(124.216) 03.08 42 0
2827065 섹스해라. 사랑해라. 아이를 낳아라. ㅆㅇㅆ(124.216) 03.08 31 0
2827062 이런 사진 템플릿을 만들어야 하면 프갤러들이라면 어덕함 ㅇㅅㅇ? [13] 강유현갤로그로 이동합니다. 03.08 75 0
2827061 아스카영원히 사랑해에게 고함. [2] ㅆㅇㅆ(124.216) 03.08 44 0
내 코딩 스타일 점점 마음에 들어감 [2] ㅆㅇㅆ(124.216) 03.08 52 0
2827058 맞짱깔놈 구한다 [6] 피에로가르뎅갤로그로 이동합니다. 03.08 54 0
2827056 내가 공유하는데 거리낌이 없는 이유 ㅆㅇㅆ(124.216) 03.08 32 0
2827055 한남자지폭발응기응기차차차 [1] 아스카영원히사랑해갤로그로 이동합니다. 03.08 46 0
2827054 정의는 승리한당☀+ ♥냥덩♥갤로그로 이동합니다. 03.08 26 1
2827052 회사에 임원중에 책낸새끼가 [8] 멍청한유라ㅋ갤로그로 이동합니다. 03.08 80 0
2827051 왓챠 1년권 만료되어서 라프텔로 이사갈라하는데 [3] 아스카영원히사랑해갤로그로 이동합니다. 03.08 33 0
2827050 아스카 리마2급 아슬아슬해서 울었어 [13] 아스카영원히사랑해갤로그로 이동합니다. 03.08 110 0
2827049 요즘 퍼블은 잘 안 구하지 ㅇㅅㅇ? [6] 강유현갤로그로 이동합니다. 03.08 46 0
2827048 올해 6월이면 퍼블일도 딸깍 [1] 프갤러(39.7) 03.08 27 0
2827046 맞짱깔새끼 구함 ㅇㅇ [12] 멍청한유라ㅋ갤로그로 이동합니다. 03.08 58 0
2827045 프로그래밍 처음시작하는데 뭐부터 해야됨? [3] 프갤러(211.58) 03.08 63 0
2827044 오늘 집회 발명도둑잡기갤로그로 이동합니다. 03.08 26 0
2827042 유~~독 그런날 있지않아? [1] 멍청한유라ㅋ갤로그로 이동합니다. 03.08 30 0
2827040 러 외무부 대변인 “한미연합훈련, 위험한 대결의 악순환 부추길 뿐” 발명도둑잡기갤로그로 이동합니다. 03.08 37 0
2827038 리죄명 5월 쯤에 살자할듯? [4] ♥냥덩♥갤로그로 이동합니다. 03.08 44 1
2827037 독일 "민중선동죄"가 뭔지 궁금하다 발명도둑잡기갤로그로 이동합니다. 03.08 24 0
2827036 백준 마스터 찍고 매일마다 다이아 10문제씩 푸는 아스퍼거 어떰 [1] ㅇㅇ(106.241) 03.08 45 0
2827034 "다음주 헌재서 울려 퍼질 주문, '윤석열을 파면한다'" 발명도둑잡기갤로그로 이동합니다. 03.08 43 0
2827032 [공지][자유 대한민국] 영웅의 귀환 - 윤석열 대통령 석방 프갤러(121.172) 03.08 48 0
2827031 오늘 코딩 하나도 안 해서 자괴감 드는데 ㅁㅌㅊ ㅇㅅㅇ [8] 강유현갤로그로 이동합니다. 03.08 55 0
2827030 나님 질문 받아보신다 딱님갤로그로 이동합니다. 03.08 20 0
2827029 인지과학조져라 손발이시립디다갤로그로 이동합니다. 03.08 24 0
2827028 우분투 이런식으로 설치하면 큰일나나요? 경희최초합갤로그로 이동합니다. 03.08 32 0
2827024 근데 이게 언어마다 쓰이는 용어가 다른게 짜증나긴함. 내가 아는 언어는 ㅆㅇㅆ(124.216) 03.08 46 0
2827023 아 코딩 왤케 어렵냐 진짜 씨발 [3] ㅆㅇㅆ(124.216) 03.08 58 0
2827022 화려한 줄 알았는데 막장... 영앤리치와 그 친구들의 추락 발명도둑잡기갤로그로 이동합니다. 03.08 31 0
2827021 제 여친 옷입은거 어떰? [2] 메쿠이로갤로그로 이동합니다. 03.08 65 0
2827019 봄이 온당❤+ ♥냥덩♥갤로그로 이동합니다. 03.08 33 1
2827013 정부가 투자한 대기업 사례 포스코, TSMC, 인천공항공사, 강원랜드 발명도둑잡기갤로그로 이동합니다. 03.08 30 0
2827011 이재명의 ‘K-엔비디아’, 정말 불가능할까 발명도둑잡기갤로그로 이동합니다. 03.08 35 0
2827008 코루틴 개념 헷갈려서 GPT한테 물어봤는데 저게 코루틴인가 ㅇㅅㅇ; [16] 강유현갤로그로 이동합니다. 03.08 108 0
2827006 포천 ‘전투기 오폭’ 피해 더 컸다... “피해 민가 58가구→99가구로 발명도둑잡기갤로그로 이동합니다. 03.08 35 0
2827005 교회협, 독일 공영방송 왜곡 다큐 독일교회와 공동 대응 나선다 발명도둑잡기갤로그로 이동합니다. 03.08 25 0
2827003 윤석열 대통령 석방 취소. 중국, 북한 체제전쟁 이제부터 시작이다. 프갤러(123.212) 03.08 50 0
2827002 애니메이숀 <플로우>가 상 받았대서 생각나는 예전 글 발명도둑잡기갤로그로 이동합니다. 03.08 30 0
2827001 나님 기분 ㄱㅆㅅㅌㅊ !! 윤석열 대통령 불법구금해체 !! ♥냥덩♥갤로그로 이동합니다. 03.08 30 0
2826999 Nimf 를 C++로 포팅하기로 했습니다 [5] *루비*갤로그로 이동합니다. 03.08 54 0
2826997 49.165 내란선동 [5] 발명도둑잡기갤로그로 이동합니다. 03.08 58 1
2826995 부대 차렷 [2] 프갤러(49.165) 03.08 53 1
2826994 친일파 반격으로 해체된 반민특위 발명도둑잡기갤로그로 이동합니다. 03.08 30 0
2826993 앞으로의 계획 근시일내에 와이어 도구로 몰리브덴 사서 스크린 분해 예정 넥도리아(112.170) 03.08 24 0
2826992 검사, 판사, 국회의원 모두 국가보안법에 복무하고 있는 기계들일 뿐이다 발명도둑잡기갤로그로 이동합니다. 03.08 29 0
2826991 ai발전되면 러스트가 이득임 ㅇㅇ(61.72) 03.08 33 0
2826989 “석방이 웬말” 시민들 ‘윤석열 구속 취소’에 다시 거리로 [2] 발명도둑잡기갤로그로 이동합니다. 03.08 43 0
2826987 분노한 시민들 광장으로‥"내란 세력에 힘 실어줘선 안 돼" 발명도둑잡기갤로그로 이동합니다. 03.08 31 0
뉴스 ‘춘화연애담’ 한승연 “투바투 수빈이 콘서트 놀러와… 친구들한테 자랑” [인터뷰 ③] 디시트렌드 03.10
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2