디시인사이드 갤러리

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

갤러리 본문 영역

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

ㅆㅇㅆ(124.216) 2024.09.21 16:55:42
조회 122 추천 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/11/11 - -
2770641 코프링 왜안쓰냐? [10] 김대기갤로그로 이동합니다. 11.06 97 0
2770640 아 개씨발 잠을 못 자겠네 [1] ♥인생무상냥덩♥갤로그로 이동합니다. 11.05 80 0
2770638 백엔드 시니어 질문받습니다 [48] 김대기갤로그로 이동합니다. 11.05 155 0
2770637 arm개발하고싶은데 이번생은 포기할거임 [4] 뒷통수한방(1.213) 11.05 67 0
2770636 누가 나를 ㅆㅇㅆ와 비교하는가 [1] 김대기갤로그로 이동합니다. 11.05 64 3
2770635 이번달부터 쿠팡나가서 돈벌고 메이플하겠습니다... ㅇㅇ(123.213) 11.05 59 0
2770634 나쁜 말하면 나쁜 어린이 좋은 말 하면 착한 어린이가 아니라 도리스아(61.83) 11.05 41 0
2770633 창업 관련 질문 받습니다 ㄹㅇ [12] 창업게이(106.101) 11.05 86 0
2770632 내 회사 가치가 200억이 넘어가면 생기는 일 [1] 창업게이(106.101) 11.05 101 0
2770631 빅데이터는 걍 백엔드하던 사람들이 직무하는거네 [2] ㅇㅇ(211.36) 11.05 94 0
2770629 챗 지피티를 좀 더 효율적으로 쓰는 방법이 필요해 [1] 주아갤로그로 이동합니다. 11.05 55 0
2770628 15년차 개발자임 [6] 프갤러(14.33) 11.05 107 1
2770626 한국 무중력 장치 발명도둑잡기갤로그로 이동합니다. 11.05 26 0
2770625 빠르게 코딩하는건 리액트가 더 빠르겟지? 거북이속이거북갤로그로 이동합니다. 11.05 51 0
2770624 MBC FM DJ 윤퇴진 발명도둑잡기갤로그로 이동합니다. 11.05 39 0
2770623 건축과 쉐프가 개발이랑 비슷한거 같음 [2] 프갤러(14.39) 11.05 41 0
2770622 중국 주석선거 인민대표 2952명, 미국 대선 선거인단 538명 발명도둑잡기갤로그로 이동합니다. 11.05 37 0
2770621 우테코 취업률 5기 50퍼인데? ㅈ됐노 ㅋㅋㅋㅋ [1] 프갤러(175.120) 11.05 206 0
2770620 스프링? 기계공학 전공하셨나요? 프갤러(118.218) 11.05 70 1
2770619 여기 미국이나 외국에 사는 분 있나요? 발명도둑잡기갤로그로 이동합니다. 11.05 37 0
2770618 자바? 그냥 섬 이름 아닌가요? 프갤러(118.218) 11.05 40 0
2770617 '유리지갑' 탈탈 털더니...초유의 사태 온다 발명도둑잡기갤로그로 이동합니다. 11.05 43 0
2770615 스크래치 만지고 있는 꼬꼬마들이 자바충보다 똑똑할듯 프갤러(118.218) 11.05 43 0
2770614 아침에 9시에 일어나서 헬쓰 하는 습관을 길러볼까 발명도둑잡기갤로그로 이동합니다. 11.05 37 0
2770613 javaFX 쓰레기네 프갤러(125.179) 11.05 37 0
2770612 재밌는게 자바 욕하는 놈들은 대부분 자바 해봤는데 프갤러(118.218) 11.05 55 0
2770611 자바충들의 제일 킹받는 래퍼토리. 하는 사람이 많고 자료가 풍부하다 프갤러(118.218) 11.05 50 0
2770610 보여줄깡~ 말깡~ ♥인생무상냥덩♥갤로그로 이동합니다. 11.05 45 0
2770609 118.218에게 하는 경고 정부 요직에서 황xx 식칼 테러 사건을 알걸 도리스아(61.83) 11.05 42 0
2770608 내가 자바 범죄자들에게 꿀팁 하나 준다. [5] 프갤러(118.218) 11.05 64 0
2770607 어지간한 좋소들 싹다 지원자수 600명이러네.. [1] 프갤러(112.161) 11.05 97 0
2770606 자바 땔감은 그냥 범죄자 아님? [1] 프갤러(118.218) 11.05 49 0
2770605 솔직히 국비 6개월이라고 불러주는것도 애매하지 [1] 프갤러(118.218) 11.05 108 0
2770604 자바만 할 줄 아는 것들은 아주 높은 확률로 웹땔감 [1] 프갤러(118.218) 11.05 66 0
2770603 자바"만" 할 줄 안다면 어디가서 프로그래머라고 깝치지 마라 [1] 프갤러(118.218) 11.05 71 0
2770602 중개 수수료 폐지에 업종 떠나는 美 부동산 중개사들 발명도둑잡기갤로그로 이동합니다. 11.05 41 0
2770600 C++ 인생 40 년 갈아 넣었습니다. [1] 프갤러(59.16) 11.05 104 0
2770599 자바 자체도 약간 거슬리는데 비전공 국비들이 이미지 말아먹었지 프갤러(118.218) 11.05 69 0
2770598 자바하는 수준에선 자바밖에 못함 프갤러(118.218) 11.05 60 0
2770597 공인중개사좀 두들겨패라 [4] 멍청한유라ㅋ갤로그로 이동합니다. 11.05 67 0
2770596 서울쥐포년 인성 레전드ㅋㅋ 프갤러(149.88) 11.05 45 0
2770595 자바만 유독 까는게 여기 갤 수준이냐? [3] 프갤러(172.225) 11.05 120 0
2770594 나님 막뛰해서 10km 찍엇으니 올해는 자세교정 [1] ♥인생무상냥덩♥갤로그로 이동합니다. 11.05 49 0
2770592 강남 vs 판교 [5] 프갤러(118.235) 11.05 96 0
2770591 재택이 진짜 달콤하구나 ㅇㅇ(39.7) 11.05 73 0
2770590 11월 18일 드디어 최첨단 ai 헬스케어 기기 글로벌 판매 시작 [1] 창업게이(218.235) 11.05 52 0
2770589 음 이제 진짜 뭐하지 [2] 주아갤로그로 이동합니다. 11.05 60 0
2770588 돈 더 받는다고 실력이 뛰어난 게 아니란 걸 깨달았다 [1] 창업게이(218.235) 11.05 105 0
2770587 배터리 교체 완료 바퀴벌레갤로그로 이동합니다. 11.05 64 0
2770582 내가 자바를 쪼물딱 만지고 있는데... [1] 프갤러(59.16) 11.05 66 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2