디시인사이드 갤러리

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

갤러리 본문 영역

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

ㅆㅇㅆ(124.216) 2024.09.21 16:55:42
조회 120 추천 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 - -
2772194 나님 국적 최초공개 ♥Sub2냥덩♥갤로그로 이동합니다. 11.10 23 0
2772191 웹개발의 본질은 백엔드에 있는게 맞는듯 [2] 프갤러(14.34) 11.10 72 0
2772190 내 수면시간 ㅁㅌㅊ?? [1] ㅇㅇ(123.213) 11.10 36 0
2772189 골골대며 지팡이 짚고가는 할배보니 감회가 새롭구나 [1] 헬마스터갤로그로 이동합니다. 11.10 22 0
2772188 코딩은 글 잘쓰는 애들이 유리함 [2] ㅇㅇ(221.146) 11.10 124 0
2772185 우리에게 시간이 없는게 아니라 가진것조차 활용못하는거 아닐까?? ㅇㅇ(123.213) 11.10 25 0
2772182 지방러 유명 부트 캠프(우테코, 싸피 etc) 가능함? [4] 프갤러(14.55) 11.10 52 0
2772179 대방어와 슈톨렌의 계절이 오는구나... 낭만이다. ㅇㅇ(223.62) 11.10 19 0
2772176 메이플은 해도 재획은 안함 ㅇㅅㅇ;; ㅇㅇ(223.62) 11.10 33 0
2772173 SI 아닌이상 신규구축은없지않음..? [1] 프갤러(39.118) 11.10 65 0
2772169 한글 초성으로 검색하는 기능 어케함? 프갤러(58.237) 11.10 55 0
2772167 요즘 개발자들 수습때 잘짜르는편임?? [6] 프갤러(59.18) 11.10 126 1
2772166 아스카 한국에 오다 [5] 아스카영원히사랑해갤로그로 이동합니다. 11.10 85 0
2772164 주말에 연락 받지마 [1] 프갤러(118.218) 11.10 49 0
2772163 시도 때도 없이 지랄인 이세상 [1] 주아갤로그로 이동합니다. 11.10 32 0
2772162 진짜 다 죽여버리고 싶다 [3] 주아갤로그로 이동합니다. 11.10 49 0
2772157 다 죽이고싶다 주아갤로그로 이동합니다. 11.10 30 0
2772156 알바를 할까말까... 고민이 많아요~ ㅇㅇ(123.213) 11.10 21 0
2772154 일본에서 한국남자보다 중국남자가 더 낫습니다 [1] 프로외노자갤로그로 이동합니다. 11.10 43 0
2772153 러우전쟁 우크라이나 절대 지지. 도리스아(14.35) 11.10 17 0
2772152 ☀나님 시작합니당☀ ♥Sub2냥덩♥갤로그로 이동합니다. 11.10 23 0
2772151 진정한 동료모집의 형태는 [82] 딱국(118.235) 11.10 197 1
2772150 나이가 드니까 글자는 큰 게 좋아 프갤러(121.172) 11.10 47 2
2772146 나는 기분이 울적할때 케이크를 먹어 40대프린이(118.235) 11.10 27 0
2772145 앞으로의 고민 [3] 프갤러(165.76) 11.10 38 0
2772143 메이플할때 중요한건 현질 금액을 제한하는것 같음 ㅇㅅㅇ ㅇㅇ(123.213) 11.10 14 0
2772140 예수님은 남의 일에도 하나하나 우셨을까? [1] 딱국(118.235) 11.10 37 0
2772139 개쩌는 아이디어가 떠올랐는데 엑셀주도개발 어떰? [2] 프갤러(118.218) 11.10 51 0
2772138 Ai 그림 생성기 앱들을 사용해 봤다- [2] 프갤러(121.172) 11.10 54 2
2772136 정신병은 응어리를 풀어야 해결이 돼 [2] 딱국(118.235) 11.10 42 0
2772134 클라우드 벤더별로 외우고 있는 애들 있냐? [1] 프갤러(160.238) 11.10 29 0
2772130 둥둥둥 발명도둑잡기갤로그로 이동합니다. 11.10 21 0
2772129 19충 특) 씨알도 안먹히는 도배광고 손으로 함 프갤러(121.170) 11.10 21 0
2772126 쿠팡 일용직 다녀보신분 계신가요~ 가볼만 한가요 [1] ㅇㅇ(123.213) 11.10 38 0
2772124 인생 날로 먹고 싶은데 프로그래머 하면 일당 얼마임 [2] Snob갤로그로 이동합니다. 11.10 43 0
2772122 데이터분석 할 사람 카톡 오픈 채팅방 프취달 3기 드루와 프갤러(114.206) 11.10 27 0
2772120 설수리14 진짜 대단하신분 한분 계셔. 벌써 교수야 20대에 딱국(118.235) 11.10 32 0
2772118 본인 일좀 쉬고 있는데 [1] Snob갤로그로 이동합니다. 11.10 33 0
2772116 군대다녀와서 공부랑 메이플 일퀘, 현실재획밖에 안하고 삼;; ㅇㅇ(123.213) 11.10 41 0
2772115 늬들 클래식 바람 해봤냐 ㅋㅋ 포항의봄갤로그로 이동합니다. 11.10 27 0
2772113 new동적배열 질문 c++ [9] 프갤러(58.123) 11.10 76 0
2772111 초6때 왕따막으면서 운게 진짜 엄청난거구나 [2] 딱국(118.235) 11.10 56 0
2772106 수습기간 중 예비군 훈련 질문 형들,, [4] 프갤러(58.239) 11.10 52 0
2772104 앞으로 나는 프갤의 영웅, 프리덤건담이다 딱국(118.235) 11.10 22 0
2772103 프갤을 다시 위대하게 (아랫글 참고) 딱국(118.235) 11.10 19 0
2772101 내 메타인지 두뇌가 상시가동중이야. 자면서도 딱국(118.235) 11.10 21 0
2772100 구글은 크롤링 해도 봐주나? [1] 프갤러(172.226) 11.10 24 0
2772098 질문) zip 비번 뚫는건 브루트포스 말고는 없어? [2] ㅇㅇ(39.7) 11.10 56 0
2772092 다들 나는 신뢰하지마. 난 심리조작에 계약조작까지 해 딱국(118.235) 11.10 29 0
2772090 조울이 터지면 진심으로 공감이 그제서야 이뤄진다 딱국(118.235) 11.10 29 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2