디시인사이드 갤러리

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

갤러리 본문 영역

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

ㅆㅇㅆ(124.216) 2025.01.15 20:10:17
조회 146 추천 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 - -
2862991 드림핵풀다 새벽3시 됐네 ㅇㅇ갤로그로 이동합니다. 06.08 33 0
2862990 사이코패스 테스트 발명도둑잡기갤로그로 이동합니다. 06.08 28 0
2862989 여자들만 가득한 전설의 섬, <전설의 고향> 이어도 발명도둑잡기갤로그로 이동합니다. 06.08 37 0
2862988 가장 많은 돈을 번 작가들 순자산 TOP5 발명도둑잡기갤로그로 이동합니다. 06.08 30 0
2862987 새치기로 시작된 난투극…아수라장 된 디즈니랜드 발명도둑잡기갤로그로 이동합니다. 06.08 26 0
2862986 논란의 '조력사망기기' 단체 대표…조력자살로 생 마감 발명도둑잡기갤로그로 이동합니다. 06.08 34 0
2862984 동료보는데 남성동료 속옷 내려 추행한 여성 발명도둑잡기갤로그로 이동합니다. 06.08 30 0
2862983 돈을 주면 러스트도 하고 씨플플도 하고 자바도 하고 하는거지 ㅆㅇㅆ(124.216) 06.08 48 0
2862982 나랑 맥주머글사람 ㅇㅅㅇ?? 구함구함 ~~ ㅇㅇ(223.39) 06.08 33 0
2862980 진짜 초등학교 저학년용 스크래치 코딩 게임 만들어달래서 만드는데 [2] ㅆㅇㅆ(124.216) 06.08 64 0
2862979 여성 만나는법좀 갈켜주셈 ㅇㅅㅇ 나 한번은 만나봐야겠음 [1] ㅇㅇ(223.39) 06.08 31 0
2862977 WWDC D - 2 ㅇㅅㅇ ㅇㅅㅇ(211.36) 06.08 21 0
2862976 넥슨 블랙치퍼 이것저것보는데 [4] 류도그담당(114.202) 06.08 55 0
2862975 llm ai가 발전한뒤에 단점이 요즘 드러나는듯 프갤러(61.79) 06.08 52 0
2862974 일하고 싶어요... 넥도리아(175.196) 06.08 32 0
2862973 코틀린은 옥에티가있어 피치(183.101) 06.08 33 0
2862972 자판기 외주 왔다 13만원 [2] ㅆㅇㅆ(124.216) 06.08 57 0
2862971 <P의 거짓> 중간 보스 '내일의 인형' 발명도둑잡기갤로그로 이동합니다. 06.08 23 0
2862969 AI가 자연어를 쓰지 않을 수가 있나? [2] ㅇㅇ(106.241) 06.08 66 0
2862968 조선인민공화국 사진 발명도둑잡기갤로그로 이동합니다. 06.08 31 0
2862967 저도 자다 깨다가 정부 자료 5G NR 봤았어용~ 같이 봐요. 넥도리아(175.196) 06.08 35 0
2862965 나홀로 집에 관한 흥미로운 사실들 발명도둑잡기갤로그로 이동합니다. 06.08 28 0
2862963 매주 900ML 우유를 먹네요. 1주일에 900ML 2개 넥도리아(175.196) 06.08 25 0
2862962 메이플을 하면서 생산적인 삶을 살기란 굉장히 어려움 ㅇㅇ(223.39) 06.08 30 0
2862961 내 생각에 나는 깊게 알진 못하지만 얕고 넓게는 아는듯 [1] ㅆㅇㅆ(124.216) 06.08 41 0
2862960 김건희만 믿고 '안하무인'...대통령실 퇴사 브이로그 올린 여직원의 정체 발명도둑잡기갤로그로 이동합니다. 06.08 51 0
2862959 오늘 만원을 썼는데 대형마트에서, 저 왜그런걸까요... 넥도리아(175.196) 06.08 25 0
2862958 야틀린 언어 존나 잘 만든듯 ㅇㅅㅇ [3] 강유현갤로그로 이동합니다. 06.08 79 0
2862957 2002년 이 엊그제 같다. 그지(그제무지) 친구야? 무러봐도 대답안할사 넥도리아(175.196) 06.08 20 0
2862956 100년 대계 준비한 중국, 미국에 ‘디지털 위안화’로 승부 발명도둑잡기갤로그로 이동합니다. 06.08 26 0
2862955 레이디제인, 기저귀 가방은 핑계..300만원대 명품백 구입 발명도둑잡기갤로그로 이동합니다. 06.08 27 0
2862954 정신 차리고 보니 2025년이네 2014년이 엊그제 같은데, 넥도리아(175.196) 06.08 31 0
2862953 “겨우 3억 썼다”…11살 딸 생일에 롤렉스·자동차 선물한 엄마 발명도둑잡기갤로그로 이동합니다. 06.08 41 0
2862952 전지현 남편 사모펀드, 위메이드에 350억 투자했는데... 주가 45% 발명도둑잡기갤로그로 이동합니다. 06.08 46 0
2862951 외주에서는 팔리는 경량 스택을. 창업을 위한 대형 스택을. ㅆㅇㅆ(124.216) 06.08 34 0
2862949 다만 나는 창업할거라서 사용법을 알고 있어야겠지 ㅆㅇㅆ(124.216) 06.08 30 0
2862948 더이상 메이플이 즐겁지 않음... 왜이런걸까?? ㅇㅇ(223.39) 06.08 41 0
2862947 도커 MSA, 카프카, 쿠버네티스 Redis 읽어봤자 쓰기가 힘듬 [6] ㅆㅇㅆ(124.216) 06.08 84 0
2862946 도커니 MSA니 이렇게하지만 사실상 기업 아니면 쓸일도 없으니까 [2] ㅆㅇㅆ(124.216) 06.08 55 0
2862944 야틀린식 변수 선언법을 머라고하지 ㅇㅅㅇ [2] 강유현갤로그로 이동합니다. 06.08 45 0
2862943 데스크 셋업 깔끔하게 완료 [5] hiya갤로그로 이동합니다. 06.08 64 0
2862942 오히려 지피티 시대에 들어서 프로그래밍 외주가 늘어남 ㅆㅇㅆ(124.216) 06.08 56 0
2862941 옛날에 윈폼 외주 알바 월 300따리 있었는데 할 걸 ㅇㅅㅇ [4] 강유현갤로그로 이동합니다. 06.08 76 0
2862940 근데 확실히 노가다 일수 줄어서 완전 외주로 가니까 [6] ㅆㅇㅆ(124.216) 06.08 78 0
2862939 안드로이드 커스텀os 카메라 지원 어려운 이유 [7] 발명도둑잡기갤로그로 이동합니다. 06.08 111 1
2862938 야틀린 공부해야되는데 바람의나라 하는 인생 ㅁㅌㅊ ㅇㅅㅇ [2] 강유현갤로그로 이동합니다. 06.07 49 0
2862937 창업 얼른 하고 싶다. 외주 이렇게해서 식당 대출 갚고 [3] ㅆㅇㅆ(124.216) 06.07 59 0
2862936 중국이나 미국 둘중하나 망했으면... [1] 프갤러(183.101) 06.07 34 0
2862935 여기 애들 많이 믿지 마라 [2] 프갤러(118.235) 06.07 66 1
2862934 사학은 학문이 아니라 종교임 ㅇㅇ(106.241) 06.07 26 0
뉴스 [조선의 사랑꾼] '54세' 최성국, 24세 연하 아내와 둘째 '함박이' 임신 발표! 황보라 "둘째 생각 없었는데, 질투 나..." 디시트렌드 06.10
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2