디시인사이드 갤러리

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

갤러리 본문 영역

엔터티 코루틴 빌더 만들어봤는데

ㅆㅇㅆ(124.216) 2024.09.26 22:09:56
조회 43 추천 0 댓글 0



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;
 
public enum CoroutinePriority
{
    Low = 1,       // 유휴
    Medium = 2,    // 움직임
    High = 3,      // 기절
    Critical = 4   // 넉백
}
 
/// <summary>
/// 우선순위를 가진 코루틴을 관리하는 커스텀 코루틴 빌더.
/// </summary>
public class EntityCoroutineBuilder : MonoBehaviour, IEntityCoroutine
{
    /// <summary>
    /// 코루틴과 그 우선순위를 저장하는 클래스.
    /// </summary>
    private class CoroutineInfo
    {
        public CoroutinePriority Priority;
        public IEnumerator Routine;
        public bool IsActive;
 
        // For handling CustomWaitForSeconds
        public float WaitTimeRemaining;
 
        // For handling WaitForFixedUpdate
        public bool WaitForFixedUpdate;
 
        public CoroutineInfo(CoroutinePriority priority, IEnumerator routine)
        {
            Priority = priority;
            Routine = routine;
            IsActive = true;
            WaitTimeRemaining = 0f;
            WaitForFixedUpdate = false;
        }
    }
    public class CustomWaitForSeconds
    {
        public float seconds;
        public CustomWaitForSeconds(float seconds)
        {
            this.seconds = seconds;
        }
    }
 
    // 활성화된 코루틴 목록
    private List<CoroutineInfo> activeCoroutines = new List<CoroutineInfo>();
 
    /// <summary>
    /// 우선순위를 지정하여 코루틴을 시작
    /// </summary>
    /// <param name="priority">코루틴의 우선순위.</param>
    /// <param name="routine">실행할 코루틴.</param>
    public void StartCoroutineWithPriority(CoroutinePriority priority, IEnumerator routine)
    {
        if (!gameObject.activeInHierarchy)
        {
            Debug.LogWarning("코루틴을 시작할 수 없습니다. EntityCoroutineBuilder가 비활성화 상태");
            return;
        }
 
        // 더 높은 우선순위의 코루틴이 시작되면 낮은 우선순위의 코루틴을 중단
        List<CoroutinePriority> lowerPriorities = new List<CoroutinePriority>();
        foreach (var coroutine in activeCoroutines)
        {
            if (coroutine.Priority < priority && coroutine.IsActive)
            {
                lowerPriorities.Add(coroutine.Priority);
            }
        }
 
        foreach (var lowerPriority in lowerPriorities)
        {
            Debug.Log($"Stopping coroutines with priority {lowerPriority} due to new coroutine with priority {priority}.");
            StopCoroutinesByPriority(lowerPriority);
        }
 
        // 새로운 코루틴 추가
        activeCoroutines.Add(new CoroutineInfo(priority, routine));
        Debug.Log($"Starting coroutine with priority {priority}.");
    }
 
    /// <summary>
    /// 특정 우선순위의 모든 코루틴을 중지
    /// </summary>
    /// <param name="priority">중지할 코루틴의 우선순위.</param>
    public void StopCoroutinesByPriority(CoroutinePriority priority)
    {
        for (int i = activeCoroutines.Count - 1; i >= 0; i--)
        {
            var coroutine = activeCoroutines[i];
            if (coroutine.Priority == priority && coroutine.IsActive)
            {
                coroutine.IsActive = false;
                activeCoroutines.RemoveAt(i);
                Debug.Log($"Stopped coroutine with priority {priority}.");
            }
        }
    }
 
    /// <summary>
    /// 특정 우선순위의 코루틴이 실행 중인지 확인
    /// </summary>
    /// <param name="priority">확인할 우선순위.</param>
    /// <returns>해당 우선순위의 코루틴이 실행 중이면 true, 아니면 false.</returns>
    public bool IsCoroutineRunning(CoroutinePriority priority)
    {
        foreach (var coroutine in activeCoroutines)
        {
            if (coroutine.Priority == priority && coroutine.IsActive)
                return true;
        }
        return false;
    }
 
    private void Update()
    {
        // 코루틴 목록을 복사하여 수정 중 오류 방지
        var coroutinesToProcess = new List<CoroutineInfo>(activeCoroutines);
 
        foreach (var coroutine in coroutinesToProcess)
        {
            if (!coroutine.IsActive)
                continue;
 
            if (coroutine.WaitForFixedUpdate)
                continue// FixedUpdate에서 처리
 
            if (coroutine.WaitTimeRemaining > 0f)
            {
                coroutine.WaitTimeRemaining -= Time.deltaTime;
                if (coroutine.WaitTimeRemaining > 0f)
                    continue;
            }
 
            try
            {
                bool hasNext = coroutine.Routine.MoveNext();
                if (!hasNext)
                {
                    // 코루틴이 완료되었으면 목록에서 제거
                    activeCoroutines.Remove(coroutine);
                    Debug.Log($"Coroutine Priority {coroutine.Priority} completed.");
                }
                else
                {
                    HandleYieldInstruction(coroutine, coroutine.Routine.Current);
                }
            }
            catch (Exception ex)
            {
                Debug.LogError($"코루틴 실행 중 예외 발생 (우선순위 {coroutine.Priority}): {ex.Message}\n{ex.StackTrace}");
                activeCoroutines.Remove(coroutine);
            }
        }
    }
 
    private void FixedUpdate()
    {
        // 코루틴 목록을 복사하여 수정 중 오류 방지
        var coroutinesToProcess = new List<CoroutineInfo>(activeCoroutines);
 
        foreach (var coroutine in coroutinesToProcess)
        {
            if (!coroutine.IsActive)
                continue;
 
            if (!coroutine.WaitForFixedUpdate)
                continue;
 
            try
            {
                bool hasNext = coroutine.Routine.MoveNext();
                if (!hasNext)
                {
                    // 코루틴이 완료되었으면 목록에서 제거
                    activeCoroutines.Remove(coroutine);
                    Debug.Log($"Coroutine Priority {coroutine.Priority} completed.");
                }
                else
                {
                    HandleYieldInstruction(coroutine, coroutine.Routine.Current);
                }
            }
            catch (Exception ex)
            {
                Debug.LogError($"코루틴 실행 중 예외 발생 (우선순위 {coroutine.Priority}): {ex.Message}\n{ex.StackTrace}");
                activeCoroutines.Remove(coroutine);
            }
        }
    }
 
    /// <summary>
    /// YieldInstruction을 처리하는 메서드.
    /// </summary>
    /// <param name="coroutine">현재 코루틴 정보.</param>
    /// <param name="yieldObj">현재 YieldInstruction 객체.</param>
    private void HandleYieldInstruction(CoroutineInfo coroutine, object yieldObj)
    {
        if (yieldObj == null)
        {
            // 단순히 다음 프레임으로 넘어감
            return;
        }
 
        if (yieldObj is CustomWaitForSeconds customWait)
        {
            coroutine.WaitTimeRemaining = customWait.seconds;
            Debug.Log($"Coroutine Priority {coroutine.Priority}: Waiting for {customWait.seconds} seconds.");
        }
        else if (yieldObj is WaitForFixedUpdate)
        {
            coroutine.WaitForFixedUpdate = true;
            Debug.Log($"Coroutine Priority {coroutine.Priority}: Waiting for FixedUpdate.");
        }
        else
        {
            Debug.LogWarning($"지원하지 않는 YieldInstruction: {yieldObj.GetType().Name}");
        }
    }
}
 
cs


C# 내장 코루틴 이용해서 만들어볼려고 이렇게 했는데


여기서 Update랑 FixedUpate() 처리를 이벤트로해서, 기본적으로 이벤트 없을때 Upate랑 FixedUpdate() 없게 해야겠지?


기본적으로 내 아키텍쳐가 이벤트 기반이라서 코루틴 동시 다발적으로 발생할 수 있어서 스택으로 우선순위 조절해서 쓰고 있는데


Unity에서 코루틴 우선순위 관련해서 만들려고하니까 기본적으로 Update가 있어야한다네


추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
등록순정렬 기준선택
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 축의금 적게 내면 눈치 줄 것 같은 스타는? 운영자 24/11/11 - -
2773594 에혀... 엉덩이팡팡갤로그로 이동합니다. 11.14 21 0
2773591 요즘 중국 OTT 영화시장....근황 발명도둑잡기갤로그로 이동합니다. 11.14 40 0
2773589 남은건 탄핵뿐! [윤설열탄핵국회의원연대 발족식] 발명도둑잡기갤로그로 이동합니다. 11.14 19 0
2773588 김재연 상임대표 시국순회 1일차 [울산] 발명도둑잡기갤로그로 이동합니다. 11.14 12 0
2773586 진보당 당직자들에게 뭐든지 물어봤다 | 진보당 Q&A 발명도둑잡기갤로그로 이동합니다. 11.14 21 0
2773585 당신이 몰랐던 진보당에 대한 이야기 - 여섯 번째 발명도둑잡기갤로그로 이동합니다. 11.14 16 0
2773582 테일러 스위프트는 어떻게 '제국의 설계자'가 됐나 발명도둑잡기갤로그로 이동합니다. 11.14 26 0
2773581 수능 국어 문제지에 공개된 도메인을 대통령 퇴진 촉구용으로 사용한다면?! 손발이시립디다갤로그로 이동합니다. 11.14 33 0
2773578 남극서 9000만년 전 ‘호박’ 사상 첫 발견 발명도둑잡기갤로그로 이동합니다. 11.14 26 0
2773576 내일 휴가라고 메시지를 3번 남겼는데 [4] 아스카영원히사랑해갤로그로 이동합니다. 11.14 73 0
2773574 한국에서 가장 성스러운 대명절 발명도둑잡기갤로그로 이동합니다. 11.14 24 0
2773573 괌 원정출산 산모, 리조트서 숨진 채 발견 발명도둑잡기갤로그로 이동합니다. 11.14 19 0
2773572 부캠 그냥 런할까.. [4] ㅇㅇ(211.234) 11.14 82 0
2773571 vue js 하면 커리어 좆망하냐 프갤러(183.99) 11.14 30 0
2773569 내 폰 HDR 되는폰... 우후!~ 내방 근황 [1] 도리스아(14.35) 11.14 38 0
2773566 금속 녹일 때 정액이 직방 도리스아(14.35) 11.14 28 0
2773565 대기업 si vs 금융권 it 뭐가 더 좋나요? [2] 프갤러(175.124) 11.14 62 0
2773563 웃을 일이 없다 [1] 발명도둑잡기갤로그로 이동합니다. 11.14 36 0
2773561 윈도우는 이걸 언제 고칠련지 [4] 바퀴벌레갤로그로 이동합니다. 11.14 64 0
2773560 The Goonies 'NES' Not Enough(グーニーズREMIX) 발명도둑잡기갤로그로 이동합니다. 11.14 21 0
2773554 ☀나님 시작합니당☀ ♥Sub2냥덩♥갤로그로 이동합니다. 11.14 24 0
2773553 PL얼굴에 똥싸고싶어요 [2] 멍청한유라ㅋ갤로그로 이동합니다. 11.14 49 0
2773552 웹진짜 개 좆같다… ㅇㅇ(118.235) 11.14 50 0
2773551 웃자 멍청한유라ㅋ갤로그로 이동합니다. 11.14 27 0
2773548 오늘 수능날이래요 ㅋㅋ 오늘 해방되는 사람들이 많겠어요 [1] ㅇㅇ(223.62) 11.14 25 0
2773547 PL목졸라죽이고싶네 [4] 멍청한유라ㅋ갤로그로 이동합니다. 11.14 57 0
2773546 씨발 서버 오픈을 시켜야 설치해줄 거 아냐 [3] 아스카영원히사랑해갤로그로 이동합니다. 11.14 53 0
2773544 조직스토킹 하는애들 다 암걸려 즉사해버렸으면 좋겠다 프갤러(118.235) 11.14 26 0
2773542 야 손가락, 손 아픈 거는- [1] 프갤러(121.172) 11.14 38 0
2773541 과거 감성넘치던 윈도우 프로그램들이 그립다 [3] 헬마스터갤로그로 이동합니다. 11.14 62 0
2773540 N 게임 개발 회사 희망퇴직.jpg 프갤러(218.234) 11.14 63 1
2773538 나님 리뷰 하나도 없는 윈트북 하나 장만하려궁.. ♥Sub2냥덩♥갤로그로 이동합니다. 11.14 20 0
2773537 법륜씨가 한마디 하니깐 이재명씨 바로 독사표정 하시더라 헬마스터갤로그로 이동합니다. 11.14 33 0
2773535 혜경궁 김씨 유죄 !! 벌금 150만원~~~~ ㅋㅋㅋㅋㅋㅋ ♥Sub2냥덩♥갤로그로 이동합니다. 11.14 34 0
2773534 이준석 명태균 천하람 칠불사 홍매화 심어 발명도둑잡기갤로그로 이동합니다. 11.14 20 0
2773532 it중소 초봉 평균이 얼마임? [3] 프갤러(42.82) 11.14 91 0
2773530 김병만 전처 사망보험금 24개 들어,, 수익자 명의는 대부 전처 발명도둑잡기갤로그로 이동합니다. 11.14 27 0
2773529 업무시간 중 리눅스마스터 시험보고 옴 ㅇㅅㅇ [3] 아스카영원히사랑해갤로그로 이동합니다. 11.14 66 0
2773525 사는동안 여자랑 카톡 못해봤으면 문제있는거냐? [5] 만두맨(39.7) 11.14 60 0
2773523 마음아픈 뉴스들만잔뜩 멍청한유라ㅋ갤로그로 이동합니다. 11.14 24 0
2773522 리진핑 도대채 얼마나 빼돌린것임?? ♥Sub2냥덩♥갤로그로 이동합니다. 11.14 19 0
2773521 리진핑 감옥 가즈아~ ♥Sub2냥덩♥갤로그로 이동합니다. 11.14 21 0
2773520 최현욱, 장난감 자랑하다 전라노출…사진 빛삭 [1] 발명도둑잡기갤로그로 이동합니다. 11.14 50 0
2773518 좇센징이 최초 최고 개발 이런거보면 [1] 뒷통수한방(1.213) 11.14 36 0
2773517 좇센징이 지능높고 정이많다?? 뒷통수한방(1.213) 11.14 25 0
2773516 21살 직원과 바람난 남편…빈털터리로 20년만에 나타나 한 말이 발명도둑잡기갤로그로 이동합니다. 11.14 33 0
2773514 교회 헌금 빼돌려 파생상품 투자한 담임 목사 실형 발명도둑잡기갤로그로 이동합니다. 11.14 35 0
2773513 Rx Punch Loading을 적용시켜보았다- 프갤러(121.172) 11.14 32 0
2773509 맥 한영전환은 ㄹㅇ 고질병이네 [1] 프갤러(61.84) 11.14 49 0
2773505 OpenAI API 크레딧 뿌립니다!! 프갤러(14.36) 11.14 82 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2