디시인사이드 갤러리

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

갤러리 본문 영역

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

ㅆㅇㅆ(124.216) 2024.09.21 16:55:42
조회 136 추천 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
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 이번주 설문은 탈모 걱정 없어 보이는 머리숱 금수저 스타는? 운영자 25/07/14 - -
AD 휴대폰 액세서리 SALE 운영자 25/07/15 - -
2871626 저녁때 뭔가 맛난걸 먹구시푼데 먹구시푼게 없구낭 ♥지나가던길냥덩♥갤로그로 이동합니다. 07.14 23 0
2871625 비트코인씨 2억원 가겠구나 [2] 헬마스터갤로그로 이동합니다. 07.14 52 0
2871624 진보더하기 | 2026년 최저임금도 실패... 발명도둑잡기갤로그로 이동합니다. 07.14 23 0
2871623 LIVE | 혼동의 국제정세, 한국 중립외교 방안과 가능성 발명도둑잡기갤로그로 이동합니다. 07.14 17 0
2871621 슬랙 이 비융신같은거 재현갤로그로 이동합니다. 07.14 17 0
2871620 아래 한글 사용 자제합시다 [1] 재현갤로그로 이동합니다. 07.14 34 0
2871618 감히 화장실에서 통화를해? ㅋㅋ 개멍청한유라갤로그로 이동합니다. 07.14 36 0
2871617 에러로그 봐도 원인파악이 안됨 ㅇㅇ(211.234) 07.14 24 0
2871615 effective modern c++ 번역본 개 구데기임? ㅇㅇ(218.235) 07.14 24 0
2871614 옆에서 일하는 사람 상당히 거슬림 [2] ㅇㅇ(211.234) 07.14 53 0
2871612 일을 존나 빠르게 처리해줘도 [4] 아스카영원히사랑해갤로그로 이동합니다. 07.14 66 0
2871611 개발자 채용할때 어디에 올리는게 효과적임? [2] 프갤러(106.240) 07.14 48 0
2871610 30년 된 라면 발명도둑잡기(39.7) 07.14 31 1
2871609 Ada가 나중에 Go도 따먹고 JS 다음 순위 먹겠구만 루비갤로그로 이동합니다. 07.14 33 0
2871608 Ada: GC없이 메모리 세이프 보장하는 언어 중 1위 루비갤로그로 이동합니다. 07.14 33 0
2871607 Ada 언어 순위 9위면 빨리 공부해야 되는가요? [1] 루비갤로그로 이동합니다. 07.14 27 0
2871606 러스팅 소울, 8장: 그림자의 춤 (마지막회) 루비갤로그로 이동합니다. 07.14 20 0
2871605 콘솔 입력기 아키텍처 및 상세 이벤트 흐름 루비갤로그로 이동합니다. 07.14 30 0
2871604 닐슨코리아에서 한 달쯤 전엔가 미디어 시청 관련 자동응답 와서 발명도둑잡기(39.7) 07.14 23 0
2871603 회사일 특 [10] 프갤러(73.25) 07.14 62 0
2871602 c와 c++의 차이점 - include [1] ㅇㅇ(118.235) 07.14 78 2
2871601 오늘 유행하는 좋은 말도 배우고 배구공(119.202) 07.14 34 0
2871600 조선은 병역거부 가능하고 대학생은 군대 안감 발명도둑잡기(39.7) 07.14 31 0
2871599 버스 전광판에 여유 발명도둑잡기(39.7) 07.14 28 0
2871598 니 쫄았제? [1] ♥지나가던길냥덩♥갤로그로 이동합니다. 07.14 41 0
2871597 북좇센에태어나면 군복무 10년 실화냐?? [1] 뒷통수한방(1.213) 07.14 32 0
2871595 잠오노 [1] 루도그담당(211.184) 07.14 30 0
2871594 딴짓거리 말고 국비 6개월 자바배우고 취업해라 [1] 프갤러(167.172) 07.14 137 2
2871593 씹센징이 뭐지... [9] 배구공(119.202) 07.14 59 0
2871592 Ai 등장이후로 흥미도 떨어지고, 점점 도태 되는 중 [2] 무한탐구(218.234) 07.14 56 1
2871591 중국 사대주의 새끼들 프갤러(223.39) 07.14 30 0
2871590 이적 "30년 음악해도 '연예인' 느낌 안 들어 발명도둑잡기갤로그로 이동합니다. 07.14 32 0
2871589 PL이 무섭다 [4] 개멍청한유라갤로그로 이동합니다. 07.14 60 0
2871588 힙합 갤러리에서도 심리공작하는 친미극우 공작원 106.101 발명도둑잡기(118.216) 07.14 39 0
2871587 과연 회사들이 개발을 해야되서 하는걸까? [1] 프갤러(183.101) 07.14 51 1
2871586 인공지능 나오고 난 뒤부터 모드 활렵소가 사라짐 무한탐구(218.234) 07.14 36 1
2871584 ❤✨☀⭐⚡☘♥+나님 시작합니당♥+☘⚡⭐☀✨❤ [3] ♥지나가던길냥덩♥갤로그로 이동합니다. 07.14 30 0
2871583 미국 비자 심사에 SNS 계정과 음주운전 전과도 본다 발명도둑잡기(118.216) 07.14 22 0
2871582 인공지능 쓰면, 게임도 하루만에 뚝딱이네 무한탐구(218.234) 07.14 53 1
2871581 아빠의 아재개그는 자녀 정서의 도움이 된다 발명도둑잡기(118.216) 07.14 23 0
2871580 진정한 개발자가 되는 꿈을 꿨음 [6] 공기역학갤로그로 이동합니다. 07.14 95 2
2871579 노멀 아반떼 신형 렌트 받음.jpg [2] 야옹아저씨갤로그로 이동합니다. 07.14 56 0
2871578 출근했는데.. 일이 없음 [1] 프갤러(1.235) 07.14 41 0
2871577 또 싸우냐 병신들아 [4] 아스카영원히사랑해갤로그로 이동합니다. 07.14 69 0
2871576 일본을 따라잡기는 커녕 현실은 중국에 추월당한 한국 [5] 발명도둑잡기(118.216) 07.14 52 0
2871575 ❤✨☀⭐⚡☘♥+나님 시작합니당♥+☘⚡⭐☀✨❤ [2] ♥지나가던길냥덩♥갤로그로 이동합니다. 07.14 49 0
2871574 오늘도 평화로운 프갤 [4] 루도그담당(211.184) 07.14 62 0
2871573 멍유야 니가 잘못함. 자꾸 냥덩이랑 친한척해주니까 [9] ㅆㅇㅆ(124.216) 07.14 81 0
2871572 냥덩아 그리고 보빨할거면 제대로 해라 뭔 씨발 은근슬쩍 [2] ㅆㅇㅆ(124.216) 07.14 47 0
2871571 점마는 아카이브 링크때문에 냥덩이라 하는 줄아나 [5] ㅆㅇㅆ(124.216) 07.14 53 0
뉴스 이펙스, 새 타이틀곡은 ‘눈물나게 고마워’…정규 3집 트랙리스트 공개 디시트렌드 07.15
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2