디시인사이드 갤러리

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

갤러리 본문 영역

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

ㅆㅇㅆ(124.216) 2025.03.08 21:18:54
조회 53 추천 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 - -
공지 프로그래밍 갤러리 이용 안내 [87] 운영자 20.09.28 42276 64
2828269 프로덕트 제품을 GetX로 짜뒀더니 코드가 ㄹㅇ 어메이징함 ㅇㅅㅇ 강유현갤로그로 이동합니다. 08:15 6 0
2828268 이거완전 미친놈아닙니까?! [3] 멍청한유라ㅋ갤로그로 이동합니다. 08:11 15 0
2828266 이번 디시 에서 로또 일 등 나옴.jp g 프갤러(211.54) 08:04 8 0
2828265 로또 일 등 디시 에서 나옴 ㄷㄷ .jp g 프갤러(211.54) 08:01 5 0
2828264 술때문에 얼굴에 여드름 존나 난사람 ㅇㅇㅇㅇ(222.105) 07:59 6 0
2828263 념부탁) 로또 일 등 당첨됨 인증함. jp g 프갤러(211.54) 07:56 7 0
2828262 나는 언제쯤 소모품서 벗어날까 ㅆㅇㅆ찡갤로그로 이동합니다. 07:55 14 0
2828260 이번 디시 에서 로또 일 등 나옴.jp g 프갤러(211.54) 07:50 7 0
2828259 로또 일 등 디시 에서 나옴 ㄷㄷ .jp g 프갤러(211.54) 07:46 7 0
2828258 념부탁) 로또 일 등 당첨됨 인증함. jp g 프갤러(211.54) 07:42 9 0
2828256 이번 디시 에서 로또 일 등 나옴.jp g 프갤러(211.54) 07:35 10 0
2828255 술때문에 얼굴에 여드름 존나 난사람 ㅇㅇㅇㅇ(222.105) 07:33 9 0
2828254 로또 일 등 디시 에서 나옴 ㄷㄷ .jp g 프갤러(211.54) 07:32 8 0
2828253 오늘 노가다 십장 안와서 작업 지체되는중 ㅆㅇㅆ찡갤로그로 이동합니다. 07:28 18 0
2828251 결국 현대 기업들은 자본논리로 매국해서 중국을 키운것이 ㅆㅇㅆ찡갤로그로 이동합니다. 07:25 17 0
2828250 중국의 문제는 대내순환 기조를 바탕으로 한 타국 산업잠식인듯 [3] ㅆㅇㅆ찡갤로그로 이동합니다. 07:21 18 0
2828249 이번 디시 에서 로또 일 등 나옴.jp g 프갤러(211.54) 07:21 10 0
2828248 로또 일 등 디시 에서 나옴 ㄷㄷ .jp g 프갤러(211.54) 07:18 10 0
2828247 근 15년내로 중국이 패권국가가 될듯 ㅆㅇㅆ찡갤로그로 이동합니다. 07:15 24 0
2828246 미장 떨어지면 오히려 좋은데 [2] 아스카영원히사랑해갤로그로 이동합니다. 07:11 30 0
2828245 내가 느낀게 언론에서 나스닥하라고 부추겼을때부터 ㅆㅇㅆ찡갤로그로 이동합니다. 07:08 17 0
2828243 프로그래밍 갤러리 최근 우울한 고닉들 보니까 나스닥했구만 ㅆㅇㅆ찡갤로그로 이동합니다. 07:03 14 0
2828242 LLM은 딱 번역기 용도로만 사용하는게 좋을 듯 *루비*갤로그로 이동합니다. 06:48 13 0
2828241 LLM 믿으면 안 되는 이유 *루비*갤로그로 이동합니다. 06:46 17 0
2828230 3월은 뭔가 안좋네 ㅆㅇㅆ찡갤로그로 이동합니다. 06:14 16 0
2828224 인지과학조져라 손발이시립디다갤로그로 이동합니다. 05:52 17 0
2828195 팩트는 아직 오픈ai에서 블랙웰 도입전이라는거임 ㅋㅋ 프갤러(175.193) 02:10 33 0
2828192 GPT를 이용하면 코딩 문법을 잘 몰라도 ㅋㅋ(211.62) 01:59 33 0
2828183 이 병신같은 나란 새끼는 시발 왜 못돌아가게 만드냑ㆍㄷ ㅆㅇㅆ(124.216) 01:35 27 0
2828181 잘려다가 와이프 덮쳐서 했다 hrin(220.120) 01:11 44 0
2828180 그냥 이 씨 발 다 짜증나서 다 부숴버리고 싶다 [2] ㅆㅇㅆ(124.216) 01:09 55 0
2828179 테스터 현직자인데 앱개발로 전향 [2] 프갤러(223.39) 00:56 48 0
2828178 번역가로일해도되겟네 ㅅㅂ ㅇㅇ(211.235) 00:37 40 0
2828177 솔직히 리죄명 이 짤 씹간지임 ♥냥덩♥갤로그로 이동합니다. 00:21 34 0
2828176 진짜 간단한코드 왜 실행안되는거임?? [1] ㅇㅇ갤로그로 이동합니다. 00:15 55 0
2828175 나이 드니 그 시절 그토록 싫어 했던 똥발라드들이 그리워지넹.. ♥냥덩♥갤로그로 이동합니다. 00:15 22 0
2828174 대학생 나만 가난해서 편의점에서 먹고 사냐... ㅇㅇ(223.38) 00:01 27 0
2828173 웬만한 사람은 모르는 아이유의 비밀 ㅇㅇㅇㅇ(222.105) 03.10 33 0
2828171 잘 때 되니까 또 짜증나네 프갤러(110.8) 03.10 21 0
2828170 배고픈데 뭐좀 먹고 잘까 그냥 잘까 프갤러(61.79) 03.10 17 0
2828169 살인마 종북극좌 문재앙 ♥냥덩♥갤로그로 이동합니다. 03.10 20 1
2828168 카페인은 하루 150mg 정도가 적절한듯 [1] 프갤러(61.79) 03.10 34 0
2828167 기본 라이브러리를 어떻게 만들어야하지 [5] 만드루갤로그로 이동합니다. 03.10 60 0
2828166 나님 질문 받는다 [8] 딱님갤로그로 이동합니다. 03.10 46 0
2828165 이 시간 프갤은 한적하네 프갤러(61.79) 03.10 19 0
2828164 웬만한 사람은 모르는 아이유의 비밀 ㅇㅇㅇㅇ(222.105) 03.10 33 0
2828161 어차피 찐따인데 마음 편하게 갖고 대할려고 ㅇㅇ(61.79) 03.10 27 0
2828160 조졌다 [1] 포항의봄갤로그로 이동합니다. 03.10 37 0
2828158 나님 주무시기전 소통합니당❤+ 질문 받음 ♥냥덩♥갤로그로 이동합니다. 03.10 41 0
뉴스 안보현·이성민 주연 ‘신의 구슬’, 윤균상 합류...하반기 방영 예정 디시트렌드 03.10
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2