디시인사이드 갤러리

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

갤러리 본문 영역

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

ㅆㅇㅆ(124.216) 2024.09.26 22:09:56
조회 45 추천 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 - -
2773155 하아품- 다시 작업 시작해야지- 프갤러(121.172) 11.13 37 0
2773153 Rx 안심- 여자 이사 도웁니당- 프갤러(121.172) 11.13 30 0
2773152 api싸개가 되엇더니 내가 딸배가 된 느낌이다... 프갤러(211.234) 11.13 44 0
2773149 이사 도와줍니당- 프갤러(121.172) 11.13 52 1
2773147 이사도와줄 프붕이들? [13] 멍청한유라ㅋ갤로그로 이동합니다. 11.13 96 0
2773146 마감은 날을 새서라도 맞춰야 한다 VS 일정을 조정하는게 맞다. [2] 프갤러(60.196) 11.13 54 0
2773144 연봉 올리고 싶다..ㅠ [2] AIRE갤로그로 이동합니다. 11.13 68 0
2773142 ☀나님 시작합니당☀ ♥Sub2냥덩♥갤로그로 이동합니다. 11.13 38 0
2773141 "빽다방 뱅쇼" 드셔보신분을 찾습니다. [1] ㅇㅇ(123.213) 11.13 59 0
2773140 특이한 도미노 [1] 발명도둑잡기갤로그로 이동합니다. 11.13 35 0
2773137 천 공예 발명도둑잡기갤로그로 이동합니다. 11.13 32 0
2773136 리죄명 일반서민은 꿈도 못 꾸는 황제재판 논란 ♥Sub2냥덩♥갤로그로 이동합니다. 11.13 43 0
2773135 바퀴를 다시 발명하지 마라 [3] ㅇㅇ(218.39) 11.13 63 0
2773133 rctd 요즘엔 왜케 그맛이없노 [1] 뇨뮤헌갤로그로 이동합니다. 11.13 25 0
2773132 대방어와 슈톨렌의 계절이 오는구나... 낭만이다. [3] ㅇㅇ(123.213) 11.13 41 0
2773123 오늘의 커피입니다. [3] 40대프린이(118.235) 11.13 77 1
2773121 국비제도 국비강사 딸배 bj들있는것자체가 뒷통수한방(1.213) 11.13 66 0
2773119 지금 국비 취업률 확실하게 10퍼센트 아래임 [3] 프갤러(211.197) 11.13 188 0
2773118 돈이 묶여있는게 한이구나 [5] 공기역학갤로그로 이동합니다. 11.13 65 0
2773117 코더와 개발자의 차이 프로외노자갤로그로 이동합니다. 11.13 100 0
2773115 기득권새끼들이 좇센이 살기좋은나라라고하는데 뒷통수한방(1.213) 11.13 35 0
2773113 코딩애플의 애니프사이론 프갤러(222.117) 11.13 40 0
2773111 정처기 필수아니다 [3] 프갤러(210.182) 11.13 103 0
2773110 리죄명 유죄 선고 후 빨갱이 폭동 진압 ♥Sub2냥덩♥갤로그로 이동합니다. 11.13 41 0
2773109 됐당- Rx 이미지 끝- 프갤러(121.172) 11.13 45 1
2773108 거지새끼들이 재벌들 욕하는건 이해되는데 [1] 뒷통수한방(1.213) 11.13 41 0
2773107 이야~ 괜찮은 걸? 역시 이미지가 좋아야 하는 듯? 프갤러(121.172) 11.13 35 0
2773106 님들 캐글 동메달이면 취업가능한가요 [2] 프갤러(14.42) 11.13 62 0
2773104 리죄명 434억 먹튀방지법 ♥Sub2냥덩♥갤로그로 이동합니다. 11.13 30 0
2773102 오우... 쓰떼이블 띠쀼젼.... 프갤러(121.172) 11.13 49 1
2773100 저녁 메뉴 추천 받는다 딱지(118.221) 11.13 35 0
2773099 지금일어나는 굽삐개발자 [4] 멍청한유라ㅋ갤로그로 이동합니다. 11.13 74 0
2773098 si 보다 망한 플젝 sm이 더 잼씀 [3] 프갤러(1.243) 11.13 87 0
2773096 학부내내 그래픽스만 팠는데 갈데 겁나 없던데 ㅇㅇ(211.36) 11.13 66 0
2773094 일본에서는 오타쿠 커밍아웃 힘듭니다 [2] 프로외노자갤로그로 이동합니다. 11.13 65 0
2773093 야 스테이블 디퓨전 너무 좋아졌음. [4] 프갤러(121.172) 11.13 61 1
2773092 오전 일과 끗 [1] 아스카영원히사랑해갤로그로 이동합니다. 11.13 34 0
2773090 국비 팀플 진짜 개좆같다 [5] ㅇㅇ(223.38) 11.13 165 0
2773087 요즘 시장이 너무 춥다.. [2] AIRE갤로그로 이동합니다. 11.13 80 0
2773085 게임 만들려고 하는데 너무 늦은건가? [4] ㄹㄹㄹ(49.161) 11.13 86 0
2773084 컴공 꼭 인서울 해야하는서 맞음? [6] 프갤러(118.216) 11.13 112 0
2773082 쓰떼이블 띠쀼전 중간 결과 보고서- [1] 프갤러(121.172) 11.13 49 1
2773081 사설서버에 이미 있는 핵 본섭에 적용 가능한사람있음? 강남상어키우기갤로그로 이동합니다. 11.13 42 0
2773080 뱅쇼 맹글어보신분~ 재료 어떤거 구매할까요~ [3] ㅇㅇ(123.213) 11.13 58 0
2773078 좆비스타부터 관리자 권한실행이랑 사용자계정컨트롤생긴거 맞나요? 프갤러(110.47) 11.13 18 0
2773076 Intelligent Vehicle School 클래스메이트 3기 모집 프갤러(14.32) 11.13 52 0
2773073 이번 겨울에는 뱅쇼를 도전해볼까 합니다 ㅇㅅㅇ [2] ㅇㅇ(123.213) 11.13 48 0
2773072 하루 한 번 헤르미온느 찬양 헤르 미온느갤로그로 이동합니다. 11.13 39 0
2773070 기술적 특이점은 Rx 소프트웨어에서! 프갤러(121.172) 11.13 67 1
2773066 주옥됐다. 챗지피티 안된다. 프갤러(121.138) 11.13 60 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2