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 155 156 | using ResistanceSystem; using System.Collections.Generic; using System.Collections; using UnityEngine; public class EntityStatusEffectModule : MonoBehaviour { #region Private Fields private List<BaseStatusEffect> activeEffects = new List<BaseStatusEffect>(); // 활성 상태 효과 목록 [SerializeField] private float resistanceDecreaseInterval = 3f; // 저항 감소 주기 (초) private Dictionary<string, ResistanceStat> resistanceStats; // 저항 속성들을 저장할 딕셔너리 private ResistanceController resistanceController; // 저항 컨트롤러 #endregion #region Public Methods /// <summary> /// 초기화 메서드. ResistanceController와 저항 데이터를 설정합 /// </summary> public void Initialize(ResistanceController resistanceController, Dictionary<string, ResistanceStat> resistanceStats) { this.resistanceController = resistanceController; this.resistanceStats = resistanceStats; foreach (var resistance in resistanceStats.Values) { if (resistance is ResistanceAttribute resistanceAttribute) { resistanceAttribute.OnThresholdReached += ResistanceEventHandler.HandleThresholdReached; } } StartCoroutine(ResistanceUpdateRoutine()); } #endregion #region Resistance Updates /// <summary> /// 일정 주기로 저항 값을 갱신하는 코루틴. /// </summary> private IEnumerator ResistanceUpdateRoutine() { while (true) { yield return new WaitForSeconds(resistanceDecreaseInterval); UpdateResistanceValues(); } } /// <summary> /// 모든 ResistanceStat의 값을 갱신 /// </summary> private void UpdateResistanceValues() { foreach (KeyValuePair<string, ResistanceStat> resistanceStatPair in resistanceStats) { ResistanceStat resistanceStat = resistanceStatPair.Value; if (resistanceStat is ResistanceAttribute resistanceAttribute) { UpdateResistanceAttribute(resistanceAttribute); } } } /// <summary> /// 개별 ResistanceAttribute를 갱신 /// </summary> /// <param name="resistanceAttribute">갱신할 ResistanceAttribute</param> private void UpdateResistanceAttribute(ResistanceAttribute resistanceAttribute) { string attributeName = resistanceAttribute.GetDefinition().name; ResistanceModifier increaseModifier = new ResistanceModifier( 5, "System", ModifierOperationType.Additive ); resistanceAttribute.ApplyModifier(increaseModifier); resistanceAttribute.SetCurrentValue(resistanceAttribute.GetCurrentValue()); Debug.Log($"Updated Resistance for {attributeName}: {resistanceAttribute.GetCurrentValue()}/{resistanceAttribute.GetBaseValue()}"); } #endregion #region Debug /// <summary> /// 디버그 입력을 처리 /// 1~10번 숫자 키를 눌러 특정 ResistanceAttribute 값을 감소시킴 /// </summary> private void HandleDebugInput() { for (int i = 1; i <= 10; i++) { if (Input.GetKeyDown(KeyCode.Alpha0 + i)) { StatusEffectType type = (StatusEffectType)i; string resistanceName = $"{type}Attribute"; DebugDecreaseResistance(resistanceName, 10); } } } /// <summary> /// 특정 ResistanceAttribute 값을 감소시킴 /// </summary> /// <param name="resistanceName">감소시킬 ResistanceAttribute의 이름</param> /// <param name="amount">감소량</param> private void DebugDecreaseResistance(string resistanceName, int amount) { if (resistanceStats.TryGetValue(resistanceName, out ResistanceStat resistanceStat) && resistanceStat is ResistanceAttribute resistanceAttribute) { ResistanceModifier decreaseModifier = new ResistanceModifier( -amount, "DebugInput", ModifierOperationType.Additive ); resistanceAttribute.ApplyModifier(decreaseModifier); Debug.Log($"[DEBUG] {resistanceName}: Current Value = {resistanceAttribute.GetCurrentValue()}/{resistanceAttribute.GetBaseValue()}"); } else { Debug.LogWarning($"[DEBUG] {resistanceName} resistance not found."); } } private void Awake() { // 테스트용 ResistanceController와 데이터 생성 resistanceController = GetComponent<ResistanceController>(); // ResistanceController로부터 데이터 가져오기 resistanceStats = resistanceController.GetResistanceStats(); Initialize(resistanceController, resistanceStats); } private void Update() { HandleDebugInput(); // 디버그 입력 처리 } #endregion } | cs |
현재의 문제점.
1. 일부 중복로직 존재함.
2. 매핑 자동화를 하고 있는데 실패하고 있음(유니티 자체의 문제)
자고 일어나서 슬슬 해야지
3일 내내 붙잡고 계속하고 있는데 스트레스 받네 그냥
모노게임이엇음 매핑자동화 쉬웟을듯 ㄹㅇㅋㅋ
그런 개씹 쓰레기를 하느니 좀 어려웠어도 유니티한다 ㅇㅈ?
오랫만에 보는 c#이네
yield return new WaitForSeconds(resistanceDecreaseInterval); 이거 걍 객체 하나 만들어놓고 재활용하지
흠,이것도 괜찮을지도