디시인사이드 갤러리

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

갤러리 본문 영역

근데 진짜 GOF 읽고 안 읽어보고 코드 질이 달라지는 느낌이긴함

ㅆㅇㅆ(124.216) 2024.09.21 16:55:42
조회 116 추천 2 댓글 4

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
using UnityEngine;
using StatSystem;
using Core;
using CombatSystem;
 
namespace CombatSystem
{
    public static class DamageApplier
    {
        /// <summary>
        /// 주어진 공격자의 스탯 컨트롤러와 데미지 정보를 사용하여 대상에게 데미지를 적용
        /// </summary>
        /// <param name="attackerStatController">공격자의 스탯 컨트롤러</param>
        /// <param name="damageable">데미지를 받을 대상</param>
        /// <param name="rawDamage">원본 데미지 정보</param>
        public static void ApplyDamage(StatController attackerStatController, IDamageable damageable, IEnhancedDamage rawDamage)
        {
            // 데미지 타입에 따른 데미지 계산 전략을 선택
            var damageCalculationStrategy = SelectDamageStrategy(rawDamage.GetDamageType());
 
            // 최종 데미지를 계산
            int finalDamage = damageCalculationStrategy.CalculateDamage(attackerStatController, rawDamage);
            // 공격자의 크리티컬 확률을 가져옴
            float shooterCriticalChance = attackerStatController.GetStatValue("CriticalHitChance");
 
            // 공격 자체의 크리티컬 확률을 가져옴
            float totalCriticalChance = rawDamage.GetCriticalHitChance() + shooterCriticalChance;
 
            // 크리티컬 히트 여부를 결정 (무작위 값을 기반으로 크리티컬 확률이 넘으면 true)
            bool isCriticalHit = Random.Range(0f, 100f) < totalCriticalChance;
 
            if (isCriticalHit)
            {
                // 공격자의 크리티컬 배율을 가져옴
                float attackerCriticalMultiplier = attackerStatController.GetStatValue("CriticalHitMultiplier");
 
                // 최종 크리티컬 배율 계산 (공격자의 크리티컬 배율 + 공격 자체의 크리티컬 배율)
                float totalCriticalMultiplier = (rawDamage.GetCriticalDamageMultiplier() + attackerCriticalMultiplier) / 100f;
 
                // 최종 데미지에 크리티컬 배율 적용
                finalDamage = Mathf.RoundToInt(finalDamage * totalCriticalMultiplier);
            }
 
            // HealthModifier 객체를 생성하여 데미지 정보를 설정
            HealthModifier damageInfo = new HealthModifier();
            //FinalDamage 계산하는 부분은 Take 데미지와 반대여야함
            damageInfo.SetMagnitude(-finalDamage); 
            damageInfo.SetIsCriticalHit(rawDamage.GetIsCriticalHit());
            damageInfo.SetInstigator(attackerStatController.gameObject);
            damageInfo.SetSource(rawDamage.GetSource());
 
            // 대상에게 데미지를 적용
            damageable.TakeDamage(damageInfo);
        }
 
        /// <summary>
        /// 주어진 대상의 스탯 컨트롤러와 데미지 정보를 사용하여 데미지를 계산하고 적용
        /// </summary>
        /// <param name="targetStatController">데미지를 받을 대상의 스탯 컨트롤러</param>
        /// <param name="rawDamage">원본 데미지 정보</param>
        public static void TakeDamage(StatController targetStatController, IDamage rawDamage)
        {
            // 데미지 타입에 따른 방어 계산 전략을 선택
            var defenseStrategy = SelectDefenseStrategy(rawDamage.GetDamageType());
 
            // 최종 방어 후 데미지를 계산
            int finalDamage = defenseStrategy.CalculateDefense(targetStatController, rawDamage);
            //Debug.Log("최종 데미지"+finalDamage);
 
            // HealthModifier 객체를 생성하여 데미지 정보를 설정
            HealthModifier damageInfo = new HealthModifier();
            damageInfo.SetMagnitude(finalDamage); 
            damageInfo.SetIsCriticalHit(rawDamage.GetIsCriticalHit());
            damageInfo.SetInstigator(rawDamage.GetInstigator());
            damageInfo.SetSource(rawDamage.GetSource());
 
            Stat healthStat = targetStatController.GetStat("Health");
 
            // 대상의 체력에 데미지를 적용
            //(targetStatController.GetStat("Health") as Attribute).ApplyModifier(damageInfo);
            // Health가 Attribute 또는 CalculatedAttribute인지 확인하고 데미지 적용
            if (healthStat is Attribute healthAttribute)
            {
                //Debug.Log("스탯 컨트롤러에 적용");
                healthAttribute.ApplyModifier(damageInfo);
            }
            else if (healthStat is CalculatedAttribute calculatedAttribute)
            {
                calculatedAttribute.ApplyModifier(damageInfo);
            }
        }
        /// <summary>
        /// 주어진 데미지 타입에 따른 방어 계산 전략을 선택
        /// </summary>
        /// <param name="damageType">데미지 타입</param>
        /// <returns>방어 계산 전략</returns>
        public static IDefenseCalculationStrategy SelectDefenseStrategy(DamageType damageType)
        {
            switch (damageType)
            {
                case DamageType.PhysicalRanged:
                case DamageType.PhysicalMelee:
                    return new PhysicalDefenseStrategy();
                case DamageType.Magical:
                    return new MagicalDefenseStrategy();
                default:
                    Debug.LogError($"Unexpected damage type: {damageType}");
                    return null;
            }
        }
 
        /// <summary>
        /// 주어진 데미지 타입에 따른 데미지 계산 전략을 선택
        /// </summary>
        /// <param name="damageType">데미지 타입</param>
        /// <returns>데미지 계산 전략</returns>
        public static IDamageCalculationStrategy SelectDamageStrategy(DamageType damageType)
        {
            switch (damageType)
            {
                case DamageType.PhysicalRanged:
                    return new PhysicalRangedDamageStrategy();
                case DamageType.PhysicalMelee:
                    return new PhysicalMeleeDamageStrategy();
                case DamageType.Magical:
                    return new MagicalDamageStrategy();
                default:
                    Debug.LogError($"Unexpected damage type: {damageType}");
                    return null;
            }
        }
 
 
        /// <summary>
        /// 주어진 크리티컬 히트 확률을 기반으로 크리티컬 히트 여부를 결정
        /// </summary>
        /// <param name="statController">스탯 컨트롤러</param>
        /// <param name="attackCriticalHitChance">프로젝트 타격 확률</param>
        /// <returns>크리티컬 히트 여부</returns>
        private static bool GetIsCriticalHit(StatController statController, float attackCriticalHitChance)
        {
            // 공격자의 크리티컬 히트 확률을 가져옴
            int entityCriticalHitChance = statController.GetStatValue("CriticalHitChance");
 
            // 공격의 최종 크리티컬 히트 확률을 계산합니다. 
            float finalCriticalHitChance = attackCriticalHitChance + entityCriticalHitChance;
 
            // 무작위 값을 기반으로 크리티컬 히트 여부를 결정합니다.
            return Random.Range(0f, 100f) < finalCriticalHitChance;
        }
 
    }
}
 
cs

추천 비추천

2

고정닉 0

1

댓글 영역

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

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
이슈 [디시人터뷰] 라이징 스타로 인정받은 걸그룹, ‘리센느(RESCENE)’ 운영자 24/11/08 - -
설문 축의금 적게 내면 눈치 줄 것 같은 스타는? 운영자 24/11/11 - -
공지 프로그래밍 갤러리 이용 안내 [79] 운영자 20.09.28 39204 62
2772344 사수가 칭찬을 안해줘서 불만임 ㅇㅇ(211.210) 11:14 2 0
2772343 개발자는 자소서 잘 안보는거 맞냐 ㅇㅇ갤로그로 이동합니다. 11:14 1 0
2772341 중깸겔에서 쫐껴낫어 ㅠㅠ Snob갤로그로 이동합니다. 11:12 0 0
2772333 일본기업의 '스페셜리스트' 제도의 한계 프로외노자갤로그로 이동합니다. 10:06 16 0
2772332 컴공과 나왔는데 코딩 까먹었으면 뭐해야하냐 [7] ㅇㅇ갤로그로 이동합니다. 10:04 62 0
2772330 자신의 잘못을 고백하는 고해성사는 어려워요 [6] 멍청한유라ㅋ갤로그로 이동합니다. 10:01 26 0
2772329 애새끼 까면 깔수록 나랏돈 왜 쳐주냐 뒷통수한방(1.213) 10:00 12 0
2772326 윈도우전문가계시나요? 프갤러(110.47) 09:48 15 0
2772325 좇센인 국비로 보건쪽이나 일자리만들지 ㅋㅋ 뒷통수한방(1.213) 09:46 14 0
2772324 좇센은 왜 의사수입않하고 개발자들은 좇센인 다죽이냐??? 뒷통수한방(1.213) 09:44 10 0
2772322 내 수면시간 ㅁㅌㅊ?? ㅇㅇ(123.213) 09:42 13 0
2772320 우크라의 실패에서 배워야 할 것 [박노자의 한국, 안과 밖] 발명도둑잡기갤로그로 이동합니다. 09:35 9 0
2772318 국비학원 다니는데 ㅣㅣ(211.106) 09:29 21 0
2772317 하루 한 번 헤르미온느 찬양 헤르 미온느갤로그로 이동합니다. 09:29 13 0
2772313 여기 보안기사 필기 공부해본 사람있냐? ㅇㅇ(106.101) 09:05 11 0
2772311 일본기업의 '능력주의'가 역겨운 이유 프로외노자갤로그로 이동합니다. 09:01 38 0
2772309 [sesac 청년취업사관학교 은평캠퍼스] 산업 실무 프로젝트 기반 LLM 프갤러(121.130) 08:48 17 0
2772307 [sesac 청년취업사관학교 종로캠퍼스] 실무요건 기반 핀테크 데이터 분 프갤러(121.130) 08:44 18 0
2772306 あたらよ 노래 듣고 갑시다 프로외노자갤로그로 이동합니다. 08:41 15 0
2772303 끈기를 갖고싶다 프갤러(210.178) 08:23 18 0
2772302 데이터 속에 숨겨진 인문학적 흐름을 찾을 수 있을거야 딱국(118.235) 08:22 15 0
2772301 ☀나님 시작합니당☀ ♥Sub2냥덩♥갤로그로 이동합니다. 08:21 15 0
2772300 너네 진짜 직장인이구나 ㅋㅋㅋ [2] ㅇㅇ(123.213) 08:04 61 0
2772298 월요일 5시 20분에 디씨에 글쓰는 사람 어때 [1] 이시꾸갤로그로 이동합니다. 05:24 35 0
2772282 셀레니움 이새끼 왜 글 등록을 못하노 [5] Discite09갤로그로 이동합니다. 01:31 75 0
2772280 30대중반 고졸 국비 ㅇㅇㅇ(1.237) 01:25 56 1
2772275 오늘 세번 했습니다 ㅎ허허 [1] ㅇㅇ(39.7) 01:05 87 0
2772273 어떤 싸가지 없는 녀석이 감히 AI를 파이썬에 의존시켜서 [2] 노예갤로그로 이동합니다. 00:50 83 1
2772272 단비형님한테도 사과드리고 싶고 딱국(118.235) 00:47 30 0
2772271 요새는 그냥 넘기던 친구들도 그냥 넘길수가 없다 딱국(118.235) 00:46 37 0
2772268 어허 래빗엠큐따위 왜 쓰는교? [1] 프갤러(118.218) 00:29 60 0
2772267 산전수전 다 겪은 사람의 꿀팁 프갤러(222.105) 00:25 49 0
2772266 이룬 이룬 이런 이런 스위치 고치고 싶어요... 방법이 없나요... 도리스아(14.35) 00:24 17 0
2772265 아 fastapi 만든새끼 진짜 쳐죽여버리고 싶네 [15] 노예갤로그로 이동합니다. 00:13 132 0
2772264 작금의 대한민국, 정치, 사회의 현상에 대한 본인의 고찰 [1] 프갤러(218.237) 00:05 71 0
2772259 셀레나고메즈 씨도 후덕해졌더라 헬마스터갤로그로 이동합니다. 11.10 51 1
2772257 여기 quartus 질문하면 받아줌? [3] ㅇㅇ갤로그로 이동합니다. 11.10 32 0
2772256 웹사이트 오목게임에서 자기가 해커라고 주장하는애가 있거든 핵쓰고 [9] 프갤러(182.229) 11.10 92 0
2772255 진짜 세상엔 대단한 녀석들이 넘쳐낭 ㄷㅅㄷ ♥Sub2냥덩♥갤로그로 이동합니다. 11.10 47 0
2772252 Rx Recording System 리뉴얼 제품 목록! [2] 프갤러(121.172) 11.10 42 1
2772250 정처기 질문 있다 ㅇㅇ(218.39) 11.10 30 0
2772247 안드로이드 jetpack compose 문제 해결,,, ㅇㅇ(211.178) 11.10 31 0
2772245 지금 컴공이 연봉 제일 낮은데 [5] ㅇㅇ(223.33) 11.10 146 0
2772244 spyder IDE 쓰는 장점은 무엇인가요? 프갤러(122.32) 11.10 24 0
2772243 나 궁금한게 api호출 20만 30만 되면 [4] 프갤러(175.215) 11.10 68 0
2772239 IT 벤더를 찾아보니- 프갤러(121.172) 11.10 57 2
2772237 오랜만에 이런 노래들으면 머리가 정화되는 느낌 [1] 프갤러(106.241) 11.10 28 0
2772236 코딩 첨해보는데 진짜 졸라 대유잼이네 ㅋㅋ [4] ㅇㅇ(220.116) 11.10 99 0
2772235 신라면스프 + 오뚜기사리면 [1] 도리스아(112.170) 11.10 31 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2