디시인사이드 갤러리

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

갤러리 본문 영역

나는 내 코드 자체는 공유해도 상관없음 흔한 코드라서

ㅆㅇㅆ(124.216) 2025.01.15 20:10:17
조회 147 추천 0 댓글 3
														
#if UNITY_EDITOR
using UnityEditor;
#endif
 
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using Core;
using TestingTools;
 
namespace ResistanceSystem
{
    /// <summary>
    /// 상태 효과 데이터베이스 관리 클래스.
    /// </summary>
    [CreateAssetMenu(fileName = "StatusEffectDatabase", menuName = "ResistanceSystem/StatusEffectDatabase", order = 2)]
    public class StatusEffectDataBaseSO : DataBaseTemplate<StatusEffectSO>
    {
        #region Fields
 
        private const string StatusEffectGroup = "StatusEffect"// 기본 그룹 이름
 
        #endregion
 
        #region Public Methods
 
        /// <summary>
        /// 상태 효과 타입에 해당하는 StatusEffectSO 반환.
        /// </summary>
        /// <param name="effectType">상태 효과 타입</param>
        /// <returns>StatusEffectSO 객체 (없을 경우 null)</returns>
        public StatusEffectSO GetStatusEffect(StatusEffectType effectType)
        {
            foreach (StatusEffectSO effect in GetGroupData(StatusEffectGroup))
            {
                if (effect.effectType == effectType)
                {
                    return effect;
                }
            }
            Debug.LogWarning($"[StatusEffectDatabase] {effectType}에 해당하는 상태 효과 데이터가 없습니다.");
            return null;
        }
 
        #endregion
 
        #region Editor Val-idation
 
#if UNITY_EDITOR
        /// <summary>
        /// 에디터에서 변경 사항 발생 시 호출.
        /// </summary>
        protected override void OnVal-idate()
        {
            // 에셋 임포트 중이거나 플레이 모드인 경우 실행하지 않음
            if (Application.isPlaying || EditorApplication.isUpdating || AssetDatabase.IsAssetImportWorkerProcess())
            {
                return;
            }
 
            // 중복 호출 방지
            if (isDirty)
            {
                return;
            }
 
            try
            {
                isDirty = true;
 
                // 기본 유효성 검사 실행
                base.OnVal-idate();
 
                // Enum과 동기화
                SyncWithEnum();
            }
            catch (Exception e)
            {
                Debug.LogError($"[{name}] OnVal-idate 중 오류 발생: {e.Message}");
                Debug.LogError(e.StackTrace);
            }
            finally
            {
                isDirty = false;
            }
        }
 
        /// <summary>
        /// StatusEffectType Enum과 데이터 리스트 동기화.
        /// </summary>
        private void SyncWithEnum()
        {
            AssetDatabase.StartAssetEditing();
            try
            {
                Debug.Log($"[SyncWithEnum] 시작: {DateTime.Now}");
 
                List<StatusEffectType> enumValues = Enum.GetValues(typeof(StatusEffectType)).Cast<StatusEffectType>().ToList();
                Dictionary<StatusEffectType, StatusEffectSO> existingEffects = new Dictionary<StatusEffectType, StatusEffectSO>();
 
                // 기존 리스트를 딕셔너리로 변환 (null 체크 강화)
                IReadOnlyList<StatusEffectSO> groupData = GetGroupData(StatusEffectGroup);
                if (groupData != null)
                {
                    foreach (StatusEffectSO effect in groupData)
                    {
                        if (effect != null)
                        {
                            existingEffects[effect.effectType] = effect;
                        }
                    }
                }
 
                Debug.Log($"[SyncWithEnum] 기존 리스트 변환 완료: {existingEffects.Count}개 항목");
 
                // Enum 값에 따라 리스트 업데이트
                DataGroup<StatusEffectSO> group = dataGroups.Find(g => g.GetGroupName() == StatusEffectGroup);
                if (group == null)
                {
                    group = new DataGroup<StatusEffectSO>();
                    group.SetGroupName(StatusEffectGroup);
                    dataGroups.Add(group);
                }
 
                // 리스트 초기화 (새로운 리스트 생성)
                List<StatusEffectSO> list = new List<StatusEffectSO>();
 
                foreach (StatusEffectType type in enumValues)
                {
                    if (type == StatusEffectType.None) continue;
 
                    if (existingEffects.TryGetValue(type, out StatusEffectSO effect))
                    {
                        list.Add(effect);
                    }
                    else
                    {
                        // 새로운 StatusEffectSO 생성 및 하위 에셋으로 저장
                        StatusEffectSO newEffect = CreateInstance<StatusEffectSO>();
                        newEffect.effectType = type;
                        newEffect.name = $"{type}Effect";
 
                        // 메인 에셋이 저장되었는지 확인
                        string assetPath = AssetDatabase.GetAssetPath(this);
                        if (string.IsNullOrEmpty(assetPath))
                        {
                            Debug.LogWarning($"[{name}] 메인 에셋이 저장되지 않았습니다. 임시로 저장합니다.");
                            assetPath = "Assets/StatusEffectDatabase.asset";
 
                            // 이미 존재하는지 확인
                            if (AssetDatabase.LoadAssetAtPath<StatusEffectDataBaseSO>(assetPath) != null)
                            {
                                Debug.LogWarning($"[{name}] 이미 동일한 경로에 에셋이 존재합니다. 새로운 경로를 생성합니다.");
                                assetPath = AssetDatabase.GenerateUniqueAssetPath(assetPath);
                            }
 
                            AssetDatabase.CreateAsset(this, assetPath);
                            AssetDatabase.SaveAssets(); // 변경 사항 저장
                        }
 
                        // 하위 에셋으로 추가 (중복 추가 방지)
                        if (!AssetDatabase.IsSubAsset(newEffect))
                        {
                            AssetDatabase.AddObjectToAsset(newEffect, this);
                            Debug.Log($"[{name}] 하위 에셋 추가: {newEffect.name}");
                        }
 
                        list.Add(newEffect);
                        isDirty = true;
                    }
                }
 
                Debug.Log($"[SyncWithEnum] 새로운 데이터 생성 완료: {list.Count}개 항목");
 
                // 변경된 리스트를 다시 그룹에 저장
                if (isDirty)
                {
                    group.SetDataL-ist(list);
                    SaveChanges();
                    isDirty = false;
                }
 
                Debug.Log($"[SyncWithEnum] 변경 사항 저장 완료: {DateTime.Now}");
            }
            catch (Exception e)
            {
                Debug.LogError($"[{name}] SyncWithEnum 중 오류 발생: {e.Message}");
                Debug.LogError(e.StackTrace);
            }
            finally
            {
                AssetDatabase.StopAssetEditing();
            }
        }
#endif
 
        #endregion
    }
}
 
cs



38ba8268f5dc3f8650bbd58b36837d6f8eaf



나는 코드 자체는 딱히 잘 짜는 편이 아니라서 딱히 공유해도 상관은 없긴함


제네릭 이런거야 기본적으로 다들 쓰는거고


제네릭 데이터 처리하고, 코드 중복 제거하는거야 기본이니까


딱히 남들만큼 혁신적인 코드는 없는듯


뭐가 됐건 기초가 중요한거니까


추천 비추천

0

고정닉 0

0

원본 첨부파일 1

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 가족에게 아낌없이 돈 쓸 것 같은 스타는? 운영자 25/06/09 - -
2863418 더이상 게임이 즐겁지 않다. 선악과를 먹은 아담과 같다. [1] ㅇㅇ(223.39) 06.09 38 0
2863417 방통대 컴과 vs 국비 붙캠 [7] ㅇㅇ갤로그로 이동합니다. 06.09 83 0
2863416 ❤✨☀⭐나님 시작합니당⭐☀✨❤ [1] ♥냥덩이♥갤로그로 이동합니다. 06.09 35 0
2863415 LA 시위 취재 기자, 비살상탄에 잇따라 피격 발명도둑잡기갤로그로 이동합니다. 06.09 34 0
2863414 李대통령 '시가 4만원' 손목시계 착용…"'대통령 시계' 필요한가요?" 발명도둑잡기갤로그로 이동합니다. 06.09 59 0
2863413 사실상 '내전 상태'라는 LA 시위 [G리포트] 발명도둑잡기갤로그로 이동합니다. 06.09 45 0
2863412 ㅈㄴ천재왔다 물어보고 싶은거 물어봐 [5] 프갤러(39.7) 06.09 71 0
2863411 이클립스의 모든 메뉴를 아시나요? [2] 입문자(211.227) 06.09 44 0
2863410 RN 외길인생 글 봤는데 RN외길 이라 이직 안되는거같음 ㅇㅅㅇ 프갤러(211.235) 06.09 44 0
2863409 컴퓨터구조랑 컴퓨터과학개론 공부하는데 [4] 아스카영원히사랑해갤로그로 이동합니다. 06.09 90 0
2863408 그냥 알바노 모드로 일해라 [3] 아스카영원히사랑해갤로그로 이동합니다. 06.09 73 0
2863407 난 더이상 게임을 할 수 없어. 무언가 달라졌어. 게임이 즐겁지 않아. ㅇㅇ(223.39) 06.09 31 0
2863406 앞으론 mes가 대세가될듯 ㅇㅅㅇ [4] 프갤러(211.235) 06.09 82 0
2863404 진짜 미치겠다 하.... 도대체 뭐가 문제지?? 뭘 해야하지 ㅇㅇ(223.39) 06.09 63 0
2863403 유현게이 너무오래 안보이는데 [4] 프갤러(211.235) 06.09 67 0
2863402 프로그래밍에 감투 문화를 빼야함 [1] ㅇㅇ(121.174) 06.09 118 0
2863401 다들 커뮤 갈아탈 생각 있음? [8] 프갤러(39.119) 06.09 106 1
2863400 통화호소인 리재명 국제망신 ♥냥덩이♥갤로그로 이동합니다. 06.09 28 0
2863399 ㅋㅅㅋ ♥냥덩이♥갤로그로 이동합니다. 06.09 25 0
2863398 헬데가 바라보는 개발자 특) 가을이야기갤로그로 이동합니다. 06.09 52 0
2863397 도스 게임 개조 위키 발명도둑잡기갤로그로 이동합니다. 06.09 31 0
2863394 게임 제작 하려고 하는데 질문 [1] 프갤러(211.118) 06.09 51 0
2863393 한남들 아득바득 기어나오려고 개멍청한유라갤로그로 이동합니다. 06.09 48 0
2863392 방구맨 냥덩이 발명도둑잡기갤로그로 이동합니다. 06.09 32 0
2863390 내 게임 하는 환경임 ㅇㅇ(14.39) 06.09 57 0
2863389 근데 프갤 옛날글들 보면 대부분 초짜던데... ㄹㅇ [2] ㅆㅇㅆ(124.216) 06.09 86 0
2863388 게이밍 보드 광고 나사 분해 컷 넥도리아(175.196) 06.09 30 0
2863387 님들 양곡관리법 이것만 아시면 됨... 넥도리아(175.196) 06.09 41 0
2863386 님들 이거 아시는분. 이게 왜있지? 넥도리아(175.196) 06.09 35 0
2863384 ㅋㅅㅋ [2] ♥냥덩이♥갤로그로 이동합니다. 06.09 42 0
2863382 갤망했나요 [4] ㅇㅇ(223.38) 06.09 70 0
2863379 왜이리덥냐 [7] 개멍청한유라갤로그로 이동합니다. 06.09 85 0
2863378 저능아 상대 안하련다 [2] 류도그담당(211.235) 06.09 82 0
2863377 나는 디시말고 딴곳가기가 그런게 [1] ㅆㅇㅆ(124.216) 06.09 61 0
2863376 하... 시발 진짜 미쳐버리겠네. 머리론 이해되는데 왤캐 좆같냐 [2] ㅇㅇ(223.39) 06.09 59 0
2863375 나는 디버깅 오래 걸리는 작업하면 항상 프갤함 [3] ㅆㅇㅆ(124.216) 06.09 69 0
2863374 리액트 외길로 난사가 안되면 [5] 류도그담당(211.235) 06.09 99 0
2863372 이재명시기에 한국 경제 몰락할거긴한데 그게 온전히 이재명탓은 아님 [1] ㅆㅇㅆ(124.216) 06.09 68 0
2863371 내가 느끼는건 산업이 성숙화될수록 철학이 자리잡을 곳이 없어짐. [2] ㅆㅇㅆ(124.216) 06.09 69 0
2863370 데이터 복구 인데, 선생님들... 좀 찾아와 주셔서 방송에 진짜 맘잡고 [1] 넥도리아(175.196) 06.09 47 0
2863369 이재명은 한국경제를 유지할 수있을까 ㅇㅇ(183.101) 06.09 43 0
2863368 애초에 트럼프가 병신인게 기축통화국이라는 지위로 ㅆㅇㅆ(124.216) 06.09 39 0
2863367 그냐 미국 위주 질서가 몰락하고 있는거임 [3] 프갤러(175.208) 06.09 59 0
2863366 한국 IT 시장은 좁아질 수밖에 없는게, 그냥 한국 경제 사정이 안좋아. [6] ㅆㅇㅆ(124.216) 06.09 134 0
2863365 내가 느끼는게 코드를 잘 짜는 사람은 [1] ㅆㅇㅆ(124.216) 06.09 80 0
2863364 프갤에 이런 유형 자주보임 [1] 류도그담당(211.235) 06.09 92 0
2863363 리처드 가브리엘,피터 나우르, 에드거 다익스트라,윌 아바스트 등등 ㅆㅇㅆ(124.216) 06.09 30 0
2863362 여기에 제가 만든 사이트 소개 해도 될까요? [2] 프갤러(39.119) 06.09 49 0
2863361 진지하게 취업문 ㅈㄴ 좁아진거 같음 [26] ㅇㅇ(175.196) 06.09 332 1
2863360 그런 의미에서 프로그래밍 갤러리는 사이버 노가다 쉼터임 ㅆㅇㅆ(124.216) 06.09 38 0
뉴스 '아이쇼핑' 염정아-원진아-최영준-김진영 출연! 올해 여름 강타할 고품격 스릴러가 온다! 대본 리딩 현장 공개 디시트렌드 06.12
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2