디시인사이드 갤러리

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

갤러리 본문 영역

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

ㅆㅇㅆ(124.216) 2024.09.21 16:55:42
조회 56 추천 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 - -
공지 프로그래밍 갤러리 이용 안내 [73] 운영자 20.09.28 38004 62
2752824 1 9 ) 섹톡 레전드 .jpg ㅇㅇ(218.149) 19:45 0 0
2752823 형님들 MX사업부 준비 막막해서 질문드립니다 ㅇㅇ(106.102) 19:42 5 0
2752822 일할 때 메모하는 습관 중요하더라 포항의봄갤로그로 이동합니다. 19:41 6 0
2752821 프론트 엔드는 중학생 정도 논리만 필요함 ㅇㅇ갤로그로 이동합니다. 19:41 2 0
2752819 임베디드에서 웹으로 전향 어려울까 [4] 프갤러(218.38) 19:29 28 0
2752817 개발자 스트레스 받아도 하는 이윤 뭐임 [1] 프갤러(211.44) 19:24 19 0
2752814 애널 습도때문에 에어컨 틀고자야할듯 [2] ♥냥덩캣♥갤로그로 이동합니다. 19:20 14 0
2752813 토스가 인당 생산성 원톱이더라 [2] 포항의봄갤로그로 이동합니다. 19:19 25 0
2752811 사실 우리나라 직장 문화는 개발자랑 맞지 않음 [1] hrin(118.235) 19:13 17 0
2752809 이런 게이밍 책상 최대 하중이 얼마나 되냐 [1] 프갤러(218.52) 19:09 13 0
2752808 취업했는데 jdk 1.6으 짜여있는데 [1] 프갤러(211.44) 19:09 17 0
2752806 주말출근에 야근하는거 실력부족임? [3] 프갤러(211.44) 19:03 28 0
2752805 솔직히 프로그래밍이 진짜 인풋 아웃풋이 존나 확실함 ㅆㅇㅆ(124.216) 19:03 23 0
2752802 그리고 프로그래밍 좋은 이유<<내 자아 표현 욕구 ㅆㅅㅌㅊ ㅆㅇㅆ(124.216) 18:59 16 0
2752799 게시글 모니터링 필터링 AI 현업에 계신분들께 질문과 조언부탁드립니다 프갤러(122.42) 18:48 10 0
2752798 자 맥북으로 문명 드가자~~~~ [1] 아스카영원히사랑해갤로그로 이동합니다. 18:46 24 0
2752796 의협 파업 관련해서 윤석열이 좆같은 점 프갤러(211.112) 18:43 13 0
2752793 내일부터 임장 하러 다녀야지 ㅇㅅㅇ 포항의봄갤로그로 이동합니다. 18:36 16 0
2752792 개발 공부하는데 둘 중 뭐가 낫노? ㅇㅇ(211.234) 18:36 36 0
2752789 efi 파일 vmware workstation으로 실행시키는법 아시는분? 프갤러(106.102) 18:28 11 0
2752788 대범하게 일해야한다 [1] 포항의봄갤로그로 이동합니다. 18:27 16 0
2752787 에러고치느라 싫증났어 [1] 프갤러(106.102) 18:26 15 0
2752783 인터넷에서 무한증식하는 바이러스는 없음? [1] 프갤러(106.241) 18:22 15 0
2752781 내가 개쩔게 하드캐리 하는 상상하기도 하지만 [1] 포항의봄갤로그로 이동합니다. 18:18 21 0
2752780 3040 오늘 뭐했노 [3] 포항의봄갤로그로 이동합니다. 18:17 30 0
2752779 죽이되든 밥이되든 프로그래밍 해야지 돈 없을수록 ㅇㅇ [5] ㅆㅇㅆ(124.216) 18:16 71 9
2752776 주말에 쉴 때는 회사 생각 안해야는데 ㅇㅅㅇ [3] 포항의봄갤로그로 이동합니다. 18:11 21 0
2752775 업무 확장하는게 쉽지 않노 [7] 포항의봄갤로그로 이동합니다. 18:09 36 0
2752773 비전공자는 제발 현실을 살자. 프갤러(106.101) 18:06 35 0
2752772 Gpt 이 깡통로봇새기 [1] 프갤러(223.39) 18:03 22 0
2752770 시니어 <== 별거없더라 ㅇㅇ(210.178) 18:02 26 1
2752766 부딫혀가면서 애자일하기 vs 완벽하게 설계하고 빡구현 [5] 포항의봄갤로그로 이동합니다. 17:54 31 0
2752765 날씨가 쿰쿰하니 기분도 쿰쿰 춘절갤로그로 이동합니다. 17:54 14 0
2752764 이미지에서 텍스트 추출을 막으려면 어떻게 해야할까요 [5] 프갤러(122.42) 17:53 29 0
2752762 메가커피앱이 레전드긴 한것같다 [2] 헬마스터갤로그로 이동합니다. 17:41 45 0
2752760 내가 일하면서 패턴거리는애들 100% 특징 [1] ㅇㅇ(106.102) 17:37 39 0
2752757 오늘 지하철 사람개많군 헬마스터갤로그로 이동합니다. 17:29 18 0
2752756 아 오랜만에 코드 짜다가 스트레스 발산하니까 좋았다 ㅂㅂ ㅆㅇㅆ(124.216) 17:26 21 0
2752754 이게 마지막 딸감이네 ㅇㅅㅇ [1] 류류(121.160) 17:25 37 0
2752752 돼지발정제 뚱정은의 촉감놀이❤+ ♥냥덩캣♥갤로그로 이동합니다. 17:23 15 0
2752750 개발하는 중인데 [4] hrin(220.120) 17:21 51 0
2752749 갠적으로 추천하는 선형대수 책=이상구 교수책 성균관대 교수임 ㅇㅇ ㅆㅇㅆ(124.216) 17:20 18 0
2752748 주짓수 도복 새로산 거 맘에 든다 [1] 쇼요롤갤로그로 이동합니다. 17:20 25 0
2752746 프갤 탈갤하고 확실이라는 닉넴으로 다른갤에서 활동하겠음 [1] 조흐디(118.235) 17:15 27 0
2752744 비전공자라서 프로그래밍에 필요한 수학을 공부하려는데 추천하는 방법있음? [2] 프갤러(115.23) 17:10 41 0
2752743 가끔 코딩테스트 같은거 프갤러(211.107) 17:08 22 0
2752741 보르노 자동차가 중국차였군 헬마스터갤로그로 이동합니다. 17:08 13 0
2752737 패턴 쓰는 이유는 생각보다 간단하지 않냐 남한테 질문할려면 패턴써야함 [4] ㅆㅇㅆ(124.216) 16:59 49 2
근데 진짜 GOF 읽고 안 읽어보고 코드 질이 달라지는 느낌이긴함 [4] ㅆㅇㅆ(124.216) 16:55 56 2
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2