디시인사이드 갤러리

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

갤러리 본문 영역

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

ㅆㅇㅆ(124.216) 2024.09.21 16:55:42
조회 119 추천 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 - -
2772252 Rx Recording System 리뉴얼 제품 목록! [2] 프갤러(121.172) 11.10 44 1
2772250 정처기 질문 있다 ㅇㅇ(218.39) 11.10 32 0
2772247 안드로이드 jetpack compose 문제 해결,,, ㅇㅇ(211.178) 11.10 33 0
2772245 지금 컴공이 연봉 제일 낮은데 [5] ㅇㅇ(223.33) 11.10 152 0
2772244 spyder IDE 쓰는 장점은 무엇인가요? 프갤러(122.32) 11.10 25 0
2772243 나 궁금한게 api호출 20만 30만 되면 [4] 프갤러(175.215) 11.10 75 0
2772239 IT 벤더를 찾아보니- 프갤러(121.172) 11.10 59 2
2772237 오랜만에 이런 노래들으면 머리가 정화되는 느낌 [1] 프갤러(106.241) 11.10 29 0
2772236 코딩 첨해보는데 진짜 졸라 대유잼이네 ㅋㅋ [4] ㅇㅇ(220.116) 11.10 102 0
2772235 신라면스프 + 오뚜기사리면 [1] 도리스아(112.170) 11.10 33 0
2772233 내일 월요일이라 억울함 [1] 주아갤로그로 이동합니다. 11.10 23 0
2772231 백준 반년해서 플레달면 ㅁㅌㅊ임 [3] ㅇㅇ(118.235) 11.10 69 0
2772230 미국바 가격 아는사람? 술가격좀 아나?? ㅇㅇ(223.62) 11.10 42 0
2772229 음기 충전 발명도둑잡기갤로그로 이동합니다. 11.10 36 0
2772228 6분대 패이스로 5km 씩만 뛰어야징 ♥Sub2냥덩♥갤로그로 이동합니다. 11.10 46 0
2772227 뜨거운 여름날 아이스크림 하나를 손에들고 벤치에 앉아있는 여성을 본적있나 ㅇㅇ(223.62) 11.10 24 0
2772226 다들 일찍 주무십쇼. 저는 이제 양치하고 자러갑니다 ㅇㅇ(223.62) 11.10 32 1
2772224 그만좀 올려라 밑에 게시글 성관계 유도 도리스아(14.35) 11.10 26 0
2772220 전공자+정처기 정도면 초봉 얼마정도가 평균임? [5] ㅇㅇ갤로그로 이동합니다. 11.10 133 0
2772219 정신이 아픈 칭구들이 착각하는것..과거의 상처와 마주해라! [3] 40대프린이(118.235) 11.10 71 3
2772218 나님 술상 ㅁㅌㅊ냐?? 집안의 장남에게 어머니가 술상 차려오셨다. [1] ㅇㅇ(223.62) 11.10 37 0
2772217 나씻☀+ ♥Sub2냥덩♥갤로그로 이동합니다. 11.10 42 0
2772216 내 수면시간 ㅁㅌㅊ?? ㅇㅇ(123.213) 11.10 38 0
2772214 내가 전생에 무슨 죄를 지었다고 [3] 도리스아 skt(112.170) 11.10 57 0
2772213 메이플할때 가장 중요한점 하나 알려준다. ㅇㅇ(123.213) 11.10 20 0
2772212 미래의 어느 역사학자들의 대화라는데 (에필로그) 아갤러(121.129) 11.10 32 0
2772211 클라우드는 도대체 뭘 공부 하는거임? 프갤러(61.101) 11.10 28 0
2772210 미래의 어느 역사학자들의 대화라는데 (요약편) 아갤러(121.129) 11.10 34 0
2772209 내 수면시간 ㅁㅌㅊ?? ㅇㅇ(123.213) 11.10 32 0
2772208 미래의 어느 역사학자들의 대화라는데 아갤러(121.129) 11.10 31 0
2772206 포폴은 서류전형에서 보기시작하냐 아니면 면접때보냐 [3] ㅇㅇ갤로그로 이동합니다. 11.10 78 0
2772205 구글서버 요즘 불안불안하네 [1] 뉴진파갤로그로 이동합니다. 11.10 37 0
2772204 [긴급소식] Rx Recording System 리뉴얼 페이지 유출!!! 프갤러(121.172) 11.10 35 1
2772203 애인구함 ㄴㄴㄴ 별루별루 안구함. 솔직히 외로운 지라치 뽑았음 일본어로 도리스아(14.35) 11.10 16 0
2772201 개년 [6] ♥Sub2냥덩♥갤로그로 이동합니다. 11.10 53 1
2772198 나님 술상 ㅁㅌㅊ냐?? 집안의 장남에게 어머니가 술상 차려오셨다. ㅇㅇ(223.62) 11.10 30 2
2772195 못생겼으니까 취업 안되는거임 ㅇㅅㅇ [2] 류류(59.5) 11.10 56 0
2772194 나님 국적 최초공개 ♥Sub2냥덩♥갤로그로 이동합니다. 11.10 21 0
2772191 웹개발의 본질은 백엔드에 있는게 맞는듯 [2] 프갤러(14.34) 11.10 69 0
2772190 내 수면시간 ㅁㅌㅊ?? [1] ㅇㅇ(123.213) 11.10 34 0
2772189 골골대며 지팡이 짚고가는 할배보니 감회가 새롭구나 [1] 헬마스터갤로그로 이동합니다. 11.10 21 0
2772188 코딩은 글 잘쓰는 애들이 유리함 [2] ㅇㅇ(221.146) 11.10 119 0
2772185 우리에게 시간이 없는게 아니라 가진것조차 활용못하는거 아닐까?? ㅇㅇ(123.213) 11.10 24 0
2772182 지방러 유명 부트 캠프(우테코, 싸피 etc) 가능함? [4] 프갤러(14.55) 11.10 48 0
2772179 대방어와 슈톨렌의 계절이 오는구나... 낭만이다. ㅇㅇ(223.62) 11.10 17 0
2772176 메이플은 해도 재획은 안함 ㅇㅅㅇ;; ㅇㅇ(223.62) 11.10 31 0
2772173 SI 아닌이상 신규구축은없지않음..? [1] 프갤러(39.118) 11.10 61 0
2772169 한글 초성으로 검색하는 기능 어케함? 프갤러(58.237) 11.10 47 0
2772167 요즘 개발자들 수습때 잘짜르는편임?? [6] 프갤러(59.18) 11.10 122 1
2772166 아스카 한국에 오다 [5] 아스카영원히사랑해갤로그로 이동합니다. 11.10 80 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2