디시인사이드 갤러리

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

갤러리 본문 영역

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

ㅆㅇㅆ(124.216) 2025.01.15 20:10:17
조회 125 추천 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/01/27 - -
2812036 근근유머)피가츄 배만질때 나는 소리는? ㅇㅇ(223.39) 01.29 29 1
2812032 나님은 세계최고 1위 인공지능 개발자얌 ㅇㅅㅇ [6] 나트륨찡갤로그로 이동합니다. 01.29 59 1
2812030 이명박근혜때 빚내서 집 산 사람 [7] ㅇㅇ(49.165) 01.29 57 2
2812029 캔버스를 이용한 벽돌깨기 게임 진행상황- 프갤러(121.172) 01.29 42 1
2812028 노예 노인들은 기본생각이 그런가보다 임 뒷통수한방(1.213) 01.29 26 0
2812026 c++이 스택 변수 자동 초기화가 되어 편하긴 하네 *루비*갤로그로 이동합니다. 01.29 28 0
2812023 탄탄한 갓소기업에서 정년없이 무한근무가 베스트긴함 [6] ㅇㅇ(211.234) 01.29 57 0
2812022 요즘 국비 지원자 많이 줄었더라 프갤러(210.182) 01.29 58 1
2812017 나라에서 나라빚을 돌려막기 하고 있는데 [2] *루비*갤로그로 이동합니다. 01.29 61 0
2812014 주택담보 대출 받았는데 집값이 떨어진다? *루비*갤로그로 이동합니다. 01.29 44 0
2812013 나를 차단하는갤은 이유가 무엇일까 뒷통수한방(1.213) 01.29 25 0
2812010 며칠 후면 연휴 끝나는거 실화입니까 *루비*갤로그로 이동합니다. 01.29 30 0
2812008 복덕방 끼면 전세금 받을 수 있다는 착각 *루비*갤로그로 이동합니다. 01.29 31 0
2812003 헬마 행님 정성태 아저씨 홈페이지 감성 좋아해서 글 다시보는데 [3] ㅆㅇㅆ(124.216) 01.29 51 0
2812001 중소기업 특징이 자유롭게 해고할수있음 [10] ㅇㅇ(211.234) 01.29 114 0
2812000 전세는 사실상 너가 투자자가 되는거다 헬마스터갤로그로 이동합니다. 01.29 29 0
2811998 전세가 집값하락 리스크가 없는것도 아님 헬마스터갤로그로 이동합니다. 01.29 25 0
2811996 wayland 도를 아십니까? 발명도둑잡기갤로그로 이동합니다. 01.29 27 0
2811994 [자유 대한민국]에서는 수천조원의 피해보상액을 받아서 남자들에게 돌려- 프갤러(121.172) 01.29 41 1
2811992 목살 구워서 먹는중인데, 옛날엔 대체 어떻게 코딩 했을까 [6] ㅆㅇㅆ(124.216) 01.29 50 0
2811990 전세돈 있는데 집 안사는세 미련하지않냐? [4] 헬마스터갤로그로 이동합니다. 01.29 75 1
2811988 디시 왜 갑자기 다시 차단기능 동작을 안하냐 [3] ㅆㅇㅆ(124.216) 01.29 31 0
2811987 그런가보다하면 안되는이유가 뒷통수한방(1.213) 01.29 36 0
2811985 사실 관리자 넘어가는이유가 평생공부하기 싫어서임 [2] ㅇㅇ(211.234) 01.29 49 0
2811984 좇센 2025년 공휴일이 별로없네 [3] 뒷통수한방(1.213) 01.29 51 0
2811982 앞으로 전세없어지면 월세가 팍팍 오르지않을까? [1] ㅇㅇ(211.219) 01.29 27 0
2811979 웨이랜드 한글 입력기진짜 괴롭구나 [1] ㅇㅇ(211.219) 01.29 40 0
2811978 월세 vs 자기집 무엇이 좋을까요? [9] *루비*갤로그로 이동합니다. 01.29 70 0
2811977 평생공부를해야하는 이유는 it업계변화속도때문임 [1] ㅇㅇ(211.234) 01.29 61 0
2811975 평생 월세집 어캐살음? 부산가면 싼집많은데 피치피(211.219) 01.29 45 0
2811974 일기장 5. 구현 - 기본 UI 구성 [2] *루비*갤로그로 이동합니다. 01.29 42 1
2811973 솔직히 월세집에서 평생 사는게 뭐가 문제냐??? [2] 야옹테크닷갤로그로 이동합니다. 01.29 67 0
2811972 KLDP 도 안변함 프갤러(211.219) 01.29 25 0
2811970 오랜만에 PHP스쿨 들어가보니 발명도둑잡기갤로그로 이동합니다. 01.29 43 0
2811968 신기술 ? 뭐가 프갤러(211.219) 01.29 32 0
2811967 티비에서 김태원 가족사가 나오는구나 발명도둑잡기갤로그로 이동합니다. 01.29 23 0
2811966 이런 00년대 느낌 사이트가 정감가지않냐? [8] 헬마스터갤로그로 이동합니다. 01.29 60 0
2811963 PPSSPP로 Linux on PSP를 열어보니 [2] 발명도둑잡기갤로그로 이동합니다. 01.29 30 0
2811962 개발자 << 계속해서 나오는 신기술을 평생공부해야함 [1] ㅇㅇ(211.234) 01.29 54 0
2811959 현실이된이야기는 내말들은 전부 현실화됨 [3] 뒷통수한방(1.213) 01.29 38 0
2811958 현실이된 이야기 프갤러(118.235) 01.29 23 0
2811957 엠넷 배출그룹들 중 유일하게 상표권 출원조차 안한 그룹 ㅇㅇ(39.7) 01.29 32 0
2811955 좇센에선 꿀빠는직업도 노예되는게 공식이지 뒷통수한방(1.213) 01.29 21 0
2811954 이거 왜 틀렸는지 좀 알려주세요 ㅠㅠ 프갤러(175.202) 01.29 28 0
2811953 이번 대통령 불법 체포, 감금, 수사 관련된 사항을 - 프갤러(121.172) 01.29 39 0
2811952 직업을고를때는 돈보다 흥미 재미 적성 이런걸골라야함 [1] ㅇㅇ(211.234) 01.29 50 0
2811950 이정도면 괜찮게 취업한거임?? [1] 프갤러(59.26) 01.29 106 0
2811948 CiCd 구축 해야 되나? ㅇㅇ(112.161) 01.29 24 0
2811947 떡국 발명도둑잡기갤로그로 이동합니다. 01.29 31 0
2811943 [자유 대한민국] 메시지 남기기 - 프갤러(121.172) 01.29 42 1
뉴스 베이비몬스터, ‘빌리어네어’ MV 7일 공개 디시트렌드 01.31
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2