지난번에 만들었던 ItemSystem의 UseItem 부분이 마음에 안들어서 구조를 수정해보았다.
로직 변경 사항
현의 로직은 이러하다.
이게 전 로직
전은 너무 더럽고 가독성이 없었는데 지금 좀 Interface로 분리해서 깔끔하게 만들었다.
Interface를 분리 용도도 있지만 Assemly definition 때문에 교차 참조가 일어나기 때문에 사용한 것도 있다. 그래서 Utils 라는 admf를 만들어서 서로 참조하지 않도록 하였다.
코드 부분 변경 사항
using LJS.Item.Effect;
using Sirenix.OdinInspector;
using System;
using System.Collections.Generic;
using LJS.Utils;
using UnityEngine;
namespace LJS.Item
{
[Flags]
public enum ItemType
{
None = 0,
Healing = 1 << 0,
Buff = 1 << 1,
DeBuff = 1 << 2
}
public class ItemSOBase : ScriptableObject, IGetValueable
{
[Header("BaseInfo")]
public string itemName;
public ItemType typeOfItem;
[TextArea]
public string description;
[PreviewField(75)]
[HideLabel]
public Sprite icon;
[Header("Effect Settings")]
public bool endImmediately;
public float effectEndTime;
public List<ItemEffectBase> effectList;
#region itemValue
[Header("Effect Value")]
[SerializeField] private int healCount;
[SerializeField] private int damageCount;
private int defenceDecrease;
private int defenceIncrease;
private int strength;
private int weakening;
#endregion
private Dictionary<Enums.EffectType, int> effectDict = new();
public ItemSOBase()
{
effectDict = new Dictionary<Enums.EffectType, int>
{
{ Enums.EffectType.Heal, healCount },
{ Enums.EffectType.Damage, damageCount },
{ Enums.EffectType.Strength, strength },
{ Enums.EffectType.Weakening, weakening },
{ Enums.EffectType.DefenceDecrease, defenceDecrease },
{ Enums.EffectType.DefenceIncrease, defenceIncrease }
};
}
public virtual void UseItem()
{
foreach(ItemEffectBase effect in effectList)
{
effect.SetEffectValue(this);
}
if (endImmediately)
EndItemEffect();
else
ItemManager.Instance.Delay(EndItemEffect, effectEndTime);
}
public virtual void EndItemEffect()
{
foreach(ItemEffectBase effect in effectList){
if(effect is IDeleteable)
(effect as IDeleteable).DeleteEffect();
}
}
public float GetValue(Enums.EffectType effectType)
{
return effectDict.ContainsKey(effectType) ? effectDict[effectType] : 0;
}
}
}
이게 ItemSOBase고
using LJS.Utils;
using UnityEngine;
namespace LJS.Item.Effect
{
public abstract class ItemEffectBase : ScriptableObject
{
public Enums.EffectType effectType;
private float _value = 0;
public abstract void UseEffect(float value);
public void SetEffectValue(IGetValueable getValueable)
{
float value = getValueable.GetValue(effectType);
UseEffect(value);
}
}
}
이게 ItemEffectBase고
public interface IGetValueable
{
public float GetValue(Enums.EffectType effectType);
}
Interface부분이다.
'Unity' 카테고리의 다른 글
[Unity]UniTask란? (0) | 2025.03.31 |
---|---|
[Unity] 2D 환경에서 점프 구현 (y축 이동이 구현되어 있을 때) (0) | 2025.03.17 |
[졸업작품, Unity]Assembly definition를 사용하는 방법 (1) | 2025.03.12 |
[졸업작품, Unity]아이템 시스템 수정 (0) | 2025.03.09 |
[졸업작품, Unity] 결과창 제작 (0) | 2025.03.06 |