디시인사이드 갤러리

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

갤러리 본문 영역

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

ㅆㅇㅆ(124.216) 2024.09.21 16:55:42
조회 80 추천 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
등록순정렬 기준선택
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 연예인하면 더 인기 많을 것 같은 스포츠 스타는? 운영자 24/09/16 - -
2752876 메 이 드 래 곤 극 장 판 개 봉 기 념 똥 꼬 쇼 아스카영원히사랑해갤로그로 이동합니다. 09.21 25 0
2752875 왠만하면 디자이너 따로있음? 프갤러(211.44) 09.21 17 0
2752873 스위프트 앱개발 배워보고싶은데 프갤러(106.255) 09.21 17 0
2752872 [프비지원]초보! 웹사이트 만들기 ㅡ 63강 애니메이션 구현 개발군주(58.236) 09.21 19 0
2752870 기껏해야 어짜피 DB상하차 하는데. 급 나누기 지리네 프갤러(119.199) 09.21 48 0
2752869 css 하나도 모름 어케댐? 프갤러(211.44) 09.21 23 0
2752868 신입오면 잘해줄거라고 생각했는데 [3] 포항의봄갤로그로 이동합니다. 09.21 78 0
2752867 프론트 엔드는 그냥 중학생 수준 [6] ㅇㅇ갤로그로 이동합니다. 09.21 99 0
2752866 메이드래곤 3기 ?!? [1] ♥다이어트1일차냥덩♥갤로그로 이동합니다. 09.21 22 0
2752865 실베 "좌표를 사용한 보드게임?!" 보니까 딱국 생각난다 [1] 발명도둑잡기갤로그로 이동합니다. 09.21 28 3
2752864 나 딱군 질문받는다. 피에로가르뎅갤로그로 이동합니다. 09.21 25 0
2752863 신입 잘 안 뽑는 이유 [6] 프갤러(119.199) 09.21 145 0
2752862 왜 여기는 저렇게 조현병이 많을까. 한녀니 뭐니 그딴거에 매몰되고 [2] ㅆㅇㅆ(124.216) 09.21 95 1
2752860 국비충인데 좆된거 같다. 어케 해야되냐? [14] 프갤러(210.123) 09.21 107 0
2752859 이런 미소녀랑 결혼할려면 어떻게 해야됨 ㅇㅅㅇ [1] 류류(121.160) 09.21 32 0
2752858 뭐임? 메이드래곤 2기로 종결 아니였낭? ♥다이어트1일차냥덩♥갤로그로 이동합니다. 09.21 17 0
2752856 아무도 한녀를 사랑하지도 걱정하지도 개발군주(58.236) 09.21 24 0
2752853 한녀들이 요즘 불행한 이유 개발군주(58.236) 09.21 32 0
2752852 작업음악 개발군주(58.236) 09.21 20 0
2752851 「特報」京アニ2025新しい作品!!!! 아스카영원히사랑해갤로그로 이동합니다. 09.21 34 0
2752849 괴물이되지말라고?? ㅋㅋㅋ좇센+좇센징 살면서 괴물되지말라고?? 뒷통수한방(1.213) 09.21 21 0
2752848 술 마시지 마세요 ♥냥덩캣♥갤로그로 이동합니다. 09.21 23 0
2752847 라이브러리 사용법이 어려우면 어캐해야하냐 [1] ㅇㅇ(223.38) 09.21 24 0
2752846 나님 트위터를 해보앗어양.. ♥냥덩캣♥갤로그로 이동합니다. 09.21 33 0
2752845 프비지원 심야반 1교시를 마칩니다. 개발군주(58.236) 09.21 14 0
2752844 [프비지원]초보! 웹사이트 만들기 ㅡ 62강 0렙 맵 구현 개발군주(58.236) 09.21 19 0
2752841 금일 프비지원을 심야반으로 다시 시작합니다. 개발군주(58.236) 09.21 21 0
2752837 일본여자도 이쁜애는 진짜 이쁜듯 ㅇㅅㅇ 류류(121.160) 09.21 26 0
2752836 코딩이라는게 직업으로 삼지 않아도 배워두면 유용할까? 프갤러(58.29) 09.21 31 0
2752832 프론트앤드 = 중학생들이나 하는거 ㅇㅇ갤로그로 이동합니다. 09.21 63 1
2752831 좇소연봉20원 공무원 연봉 3%인상 왜 공무원 안하냐 ㅋㅋㅋ [2] 뒷통수한방(1.213) 09.21 35 0
2752830 프론트 엔드 = 중등 사고 논리 인증 ㅇㅇ갤로그로 이동합니다. 09.21 23 0
2752829 금일 프비지원을 마칩니다. 개발군주(58.236) 09.21 22 0
2752828 프론트엔드 = 중학교 논리 ㅇㅇ갤로그로 이동합니다. 09.21 43 0
2752826 이런 아내 있었으면 좋겟음 ㅇㅅㅇ [3] 류류(121.160) 09.21 81 2
2752825 중소인데 3년 이상 다닌 사람이 별로 없음 [3] 프갤러(211.44) 09.21 81 0
2752822 일할 때 메모하는 습관 중요하더라 [1] 포항의봄갤로그로 이동합니다. 09.21 54 0
2752821 프론트 엔드는 중학생 정도 논리만 필요함 ㅇㅇ갤로그로 이동합니다. 09.21 28 0
2752819 임베디드에서 웹으로 전향 어려울까 [4] 프갤러(218.38) 09.21 72 0
2752817 개발자 스트레스 받아도 하는 이윤 뭐임 [1] 프갤러(211.44) 09.21 46 0
2752814 애널 습도때문에 에어컨 틀고자야할듯 [2] ♥냥덩캣♥갤로그로 이동합니다. 09.21 39 0
2752813 토스가 인당 생산성 원톱이더라 [2] 포항의봄갤로그로 이동합니다. 09.21 70 0
2752811 사실 우리나라 직장 문화는 개발자랑 맞지 않음 [1] hrin(118.235) 09.21 56 0
2752809 이런 게이밍 책상 최대 하중이 얼마나 되냐 [1] 프갤러(218.52) 09.21 37 0
2752808 취업했는데 jdk 1.6으 짜여있는데 [1] 프갤러(211.44) 09.21 56 0
2752806 주말출근에 야근하는거 실력부족임? [5] 프갤러(211.44) 09.21 66 0
2752805 솔직히 프로그래밍이 진짜 인풋 아웃풋이 존나 확실함 ㅆㅇㅆ(124.216) 09.21 49 0
2752802 그리고 프로그래밍 좋은 이유<<내 자아 표현 욕구 ㅆㅅㅌㅊ ㅆㅇㅆ(124.216) 09.21 36 2
2752799 게시글 모니터링 필터링 AI 현업에 계신분들께 질문과 조언부탁드립니다 프갤러(122.42) 09.21 19 0
2752798 자 맥북으로 문명 드가자~~~~ [3] 아스카영원히사랑해갤로그로 이동합니다. 09.21 60 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2