디시인사이드 갤러리

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

갤러리 본문 영역

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

ㅆㅇㅆ(124.216) 2024.09.26 22:09:56
조회 46 추천 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/18 - -
2772324 좇센은 왜 의사수입않하고 개발자들은 좇센인 다죽이냐??? 뒷통수한방(1.213) 11.11 48 0
2772322 내 수면시간 ㅁㅌㅊ?? ㅇㅇ(123.213) 11.11 56 0
2772320 우크라의 실패에서 배워야 할 것 [박노자의 한국, 안과 밖] 발명도둑잡기갤로그로 이동합니다. 11.11 56 0
2772318 국비학원 다니는데 ㅣㅣ(211.106) 11.11 82 0
2772317 하루 한 번 헤르미온느 찬양 헤르 미온느갤로그로 이동합니다. 11.11 56 0
2772313 여기 보안기사 필기 공부해본 사람있냐? [3] ㅇㅇ(106.101) 11.11 40 0
2772311 일본기업의 '능력주의'가 역겨운 이유 프로외노자갤로그로 이동합니다. 11.11 110 0
2772309 [sesac 청년취업사관학교 은평캠퍼스] 산업 실무 프로젝트 기반 LLM 프갤러(121.130) 11.11 64 0
2772307 [sesac 청년취업사관학교 종로캠퍼스] 실무요건 기반 핀테크 데이터 분 프갤러(121.130) 11.11 64 0
2772306 あたらよ 노래 듣고 갑시다 프로외노자갤로그로 이동합니다. 11.11 53 0
2772303 끈기를 갖고싶다 프갤러(210.178) 11.11 33 0
2772302 데이터 속에 숨겨진 인문학적 흐름을 찾을 수 있을거야 [1] 딱국(118.235) 11.11 71 0
2772301 ☀나님 시작합니당☀ ♥Sub2냥덩♥갤로그로 이동합니다. 11.11 51 0
2772300 너네 진짜 직장인이구나 ㅋㅋㅋ [2] ㅇㅇ(123.213) 11.11 135 0
2772298 월요일 5시 20분에 디씨에 글쓰는 사람 어때 [2] 이시꾸갤로그로 이동합니다. 11.11 52 0
2772282 셀레니움 이새끼 왜 글 등록을 못하노 [5] Discite09갤로그로 이동합니다. 11.11 128 0
2772280 30대중반 고졸 국비 [1] ㅇㅇㅇ(1.237) 11.11 178 1
2772275 오늘 세번 했습니다 ㅎ허허 [1] ㅇㅇ(39.7) 11.11 128 0
2772273 어떤 싸가지 없는 녀석이 감히 AI를 파이썬에 의존시켜서 [2] 노예갤로그로 이동합니다. 11.11 117 1
2772272 단비형님한테도 사과드리고 싶고 딱국(118.235) 11.11 75 0
2772271 요새는 그냥 넘기던 친구들도 그냥 넘길수가 없다 [1] 딱국(118.235) 11.11 95 0
2772268 어허 래빗엠큐따위 왜 쓰는교? [1] 프갤러(118.218) 11.11 85 0
2772267 산전수전 다 겪은 사람의 꿀팁 프갤러(222.105) 11.11 93 0
2772266 이룬 이룬 이런 이런 스위치 고치고 싶어요... 방법이 없나요... 도리스아(14.35) 11.11 50 0
2772265 아 fastapi 만든새끼 진짜 쳐죽여버리고 싶네 [16] 노예갤로그로 이동합니다. 11.11 185 0
2772259 셀레나고메즈 씨도 후덕해졌더라 헬마스터갤로그로 이동합니다. 11.10 101 1
2772257 여기 quartus 질문하면 받아줌? [3] ㅇㅇ갤로그로 이동합니다. 11.10 68 0
2772256 웹사이트 오목게임에서 자기가 해커라고 주장하는애가 있거든 핵쓰고 [9] 프갤러(182.229) 11.10 151 0
2772255 진짜 세상엔 대단한 녀석들이 넘쳐낭 ㄷㅅㄷ ♥Sub2냥덩♥갤로그로 이동합니다. 11.10 77 0
2772252 Rx Recording System 리뉴얼 제품 목록! [2] 프갤러(121.172) 11.10 78 1
2772250 정처기 질문 있다 ㅇㅇ(218.39) 11.10 67 0
2772247 안드로이드 jetpack compose 문제 해결,,, ㅇㅇ(211.178) 11.10 67 0
2772245 지금 컴공이 연봉 제일 낮은데 [5] ㅇㅇ(223.33) 11.10 228 0
2772244 spyder IDE 쓰는 장점은 무엇인가요? 프갤러(122.32) 11.10 58 0
2772239 IT 벤더를 찾아보니- 프갤러(121.172) 11.10 92 2
2772237 오랜만에 이런 노래들으면 머리가 정화되는 느낌 [1] 프갤러(106.241) 11.10 59 0
2772236 코딩 첨해보는데 진짜 졸라 대유잼이네 ㅋㅋ [4] ㅇㅇ(220.116) 11.10 171 0
2772235 신라면스프 + 오뚜기사리면 [1] 도리스아(112.170) 11.10 57 0
2772233 내일 월요일이라 억울함 [3] 주아갤로그로 이동합니다. 11.10 45 0
2772231 백준 반년해서 플레달면 ㅁㅌㅊ임 [3] ㅇㅇ(118.235) 11.10 123 0
2772230 미국바 가격 아는사람? 술가격좀 아나?? ㅇㅇ(223.62) 11.10 67 0
2772229 음기 충전 발명도둑잡기갤로그로 이동합니다. 11.10 70 0
2772228 6분대 패이스로 5km 씩만 뛰어야징 ♥Sub2냥덩♥갤로그로 이동합니다. 11.10 58 0
2772227 뜨거운 여름날 아이스크림 하나를 손에들고 벤치에 앉아있는 여성을 본적있나 ㅇㅇ(223.62) 11.10 53 0
2772226 다들 일찍 주무십쇼. 저는 이제 양치하고 자러갑니다 ㅇㅇ(223.62) 11.10 57 1
2772224 그만좀 올려라 밑에 게시글 성관계 유도 도리스아(14.35) 11.10 55 0
2772220 전공자+정처기 정도면 초봉 얼마정도가 평균임? [5] ㅇㅇ갤로그로 이동합니다. 11.10 219 0
2772219 정신이 아픈 칭구들이 착각하는것..과거의 상처와 마주해라! [3] 40대프린이(118.235) 11.10 104 3
2772218 나님 술상 ㅁㅌㅊ냐?? 집안의 장남에게 어머니가 술상 차려오셨다. [1] ㅇㅇ(223.62) 11.10 46 0
2772217 나씻☀+ ♥Sub2냥덩♥갤로그로 이동합니다. 11.10 71 0
뉴스 1000억 '오징어게임2' 주의보…극장가 한국영화 눈치싸움 '치열' 디시트렌드 11.20
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2