디시인사이드 갤러리

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

갤러리 본문 영역

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

ㅆㅇㅆ(124.216) 2024.09.21 16:55:42
조회 121 추천 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 - -
2772082 소식해야 오래 산당 ♥함께일때우린아무것도두려울것이없냥덩♥갤로그로 이동합니다. 11.10 27 0
2772080 인터넷에는 고수 프로그래머만 있는데 [2] ㅇㅇ(114.30) 11.10 72 0
2772076 밥 먹고와야쥐 프갤러(121.172) 11.10 38 0
2772072 비트코인 1억 1천만원 뭐냐? [2] 헬마스터갤로그로 이동합니다. 11.10 63 0
2772071 명태균 사건은 정치공작이 확실한 듯- [1] 프갤러(121.172) 11.10 45 1
2772070 프로그래머는 되게 어렵고 힘든 직업이지. 프갤러(121.172) 11.10 83 2
2772068 우리누나 코딩 현업뛰는데 코딩 접음 [2] ㅇㅇ(124.49) 11.10 111 0
2772067 나도 프로그래머나 할까 [3] Snob갤로그로 이동합니다. 11.10 61 0
2772066 롯리 닭다리 사이드 씨발 존나 맛있네 Snob갤로그로 이동합니다. 11.10 27 0
2772065 닐로툰 초코냥갤로그로 이동합니다. 11.10 22 0
2772062 코딩 공부할때 함수 메소드 이런거 다 외우는 편이야? [1] 프갤러(211.224) 11.10 62 0
2772061 진짜 알고리즘 공부하다보면 천재들이 만들었나 싶은거 몇개있던데 프갤러(58.233) 11.10 39 0
2772059 나 만들고 싶은게 하나생김. 어떨거같음?? ㅇㅇ(123.213) 11.10 24 0
2772054 군대다녀와서 공부랑 메이플 일퀘, 현실재획밖에 안하고 사는것 같음 [4] ㅇㅇ(123.213) 11.10 70 0
2772050 ㅇㅅㅇ / ♥함께일때우린아무것도두려울것이없냥덩♥갤로그로 이동합니다. 11.10 19 0
2772049 의주빈 증원=국비충 양성 ㅇㅇ [2] ㅇㅇ(211.234) 11.10 32 0
2772048 일본 취업 유학 워홀 여행 오픈톡 [1] ㅇㅇ(106.146) 11.10 21 0
2772046 안녕하세요 C# 개발에 대해서 궁금한게 있는데요 [3] 프갤러(39.124) 11.10 61 0
2772044 일본에서 파칭코에 가본 적이 있는데요 [1] 프로외노자갤로그로 이동합니다. 11.10 66 0
2772036 비개발자들 인성이 더 놀랍던데 프갤러(117.110) 11.10 72 0
2772034 공유기 와이파이는 왜 ip 주소가 안바뀜? [2] 프갤러(58.237) 11.10 38 0
2772033 저는 일본 SI업계에는 지원 자체를 안합니다 [2] 프로외노자갤로그로 이동합니다. 11.10 74 0
2772030 장고쓰는 애들은 다 변태들이냐? 프갤러(124.53) 11.10 37 0
2772026 Rx에서 AI로 이미지를 컨트롤 해보았다 [1] 프갤러(121.172) 11.10 58 1
2772025 플리스 입으시는분? ㅈㅁ(121.171) 11.10 21 0
2772024 토리야 푸갤에 왜 마음아픈사람들이 찾아오는지 알려주라 [2] 딱국(118.235) 11.10 40 0
2772023 대방어와 슈톨렌의 계절이 오는구나... 낭만이다. [1] ㅇㅇ(123.213) 11.10 17 0
2772022 미래의 어느 역사학자들의 대화라는데 (에필로그) 아갤러(121.129) 11.10 38 0
2772021 미래의 어느 역사학자들의 대화라는데 (요약편) 아갤러(121.129) 11.10 37 0
2772020 미래의 어느 역사학자들의 대화라는데 아갤러(121.129) 11.10 43 0
2772019 개발자 인성 평균 왜 이러냐? [3] 프갤러(121.54) 11.10 101 0
2772018 재명이는 끝낫고 다음에 빨갱이 대타 누구냐 ♥함께일때우린아무것도두려울것이없냥덩♥갤로그로 이동합니다. 11.10 25 0
2772017 프갤러들이 헌혈 하면 안되는 이유 [5] 헬마스터(211.107) 11.10 246 6
2772016 오늘도 환자로운 푸갤입니다 ㅇㅅㅇ [4] 나트륨찡갤로그로 이동합니다. 11.10 43 0
2772015 저 오늘 선데이 이벤트로 환산 1000올렸어용 ㅋㅋ 짱쎄졌죠? ㅇㅇ(223.62) 11.10 16 0
2772014 tektrofix 아저씨한테 문의함. 도리스아(14.35) 11.10 27 0
2772012 나님 시작합니당☀+ ♥함께일때우린아무것도두려울것이없냥덩♥갤로그로 이동합니다. 11.10 20 0
2772011 평행이론 프붕이의 세계 는 뭘까 도리스아(14.35) 11.10 28 0
2772010 소니 엑스페리아 10 ii 108,000원에 판매중. 중고나라 웹 도리스아(14.35) 11.10 33 0
2772009 하루 한 번 헤르미온느 찬양 [2] 헤르 미온느갤로그로 이동합니다. 11.10 47 0
2772008 개발 취준방 모집합니다. ㅇㅇ(180.68) 11.10 36 0
2772006 나님 시작합니당☀+ [3] ♥함께일때우린아무것도두려울것이없냥덩♥갤로그로 이동합니다. 11.10 61 0
2772005 환자로운 푸갤의 나츠아롱이 동장이염 ㅇㅅㅇ [6] 나트륨찡갤로그로 이동합니다. 11.10 61 0
2772003 포트폴리오용 사이트 만드려고 하는데 최상위 도메인 kro.kr이거 [1] okane갤로그로 이동합니다. 11.10 46 1
2771999 유로트럭인가 그딴게임은 왜하는거냐? [10] 헬마스터갤로그로 이동합니다. 11.10 89 0
2771997 음기 충전 발명도둑잡기갤로그로 이동합니다. 11.10 29 0
2771996 der Bohrer 발명도둑잡기갤로그로 이동합니다. 11.10 25 0
2771987 대학생 정치활동 금지하는 학칙은 기본권 침해 [2] 발명도둑잡기갤로그로 이동합니다. 11.10 38 0
2771985 2022.6.20. 김건희에 관해 썼던 글 발명도둑잡기갤로그로 이동합니다. 11.10 34 1
2771983 미군이 400만명 역대 최다 학살한 전쟁이 코리아전쟁 [3] 발명도둑잡기갤로그로 이동합니다. 11.10 53 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2