RPG 게임에서 사용하는 케릭터 스탯 관리 코드 입니다. 케릭터의 스탯 이외에도 기본값과 변화를 분리하여 처리해야 하는 부분에 사용할 수 있습니다.
- 패키지 관리자의 툴바에서 좌측 상단에 플러스 메뉴를 클릭합니다.
- 추가 메뉴에서 Add package from git URL을 선택하면 텍스트 상자와 Add 버튼이 나타납니다.
- https://github.com/DarkNaku/CharacterStats.git 입력하고 Add를 클릭합니다.
연산 순서는 Add > Percent > Multiply > Reduce > Subtract 이며, 추가 순서와 상관 없이 고정 입니다. 만약 순서를 변경하거나 연산 내용을 변경하고 싶다면 상속을 받아 Stat의 CalculateValue 함수를 오버라이드 하면 됩니다. CharacterStats 또한 CreateStat 함수를 변경을 위해 오버라이드 할수 있도록 제공하고 있습니다.
// 단일 스탯 사용 방법
public enum STAT_TYPE { POWER, HEALTH, INTELIGENCE, WISDOM, AGILITY, LUCKY }
var stat = new Stat<STAT_TYPE>(STAT_TYPE.POWER, 100);
stat.Add(new Modifier(ModifierType.Add, 5)); // 100 + 5
stat.Add(new Modifier(ModifierType.Percent, 0.15f)); // 105 + (105 * 0.15)
stat.Add(new Modifier(ModifierType.Multiply, 0.1f)); // (105 + (105 * 0.15)) * 1.1
stat.Add(new Modifier(ModifierType.Reduce, 0.1f) { Source = key }); // ((105 + (105 * 0.15)) * 1.1) * 0.9
stat.Add(new Modifier(ModifierType.Subtract, 50f).SetID("A")); // (((105 + (105 * 0.15)) * 1.1) * 0.9) - 50
stat.RemoveBySource(key); // key 오브젝트 키로 등록된 모든 수정사항 스탯에서 제거
stat.RemoveByID("A"); // "A" 아이디로 등록된 모든 수정사항 스탯에서 제거
// 스탯 집합인 케릭터 클래스 사용 방법
var characterStats = new CharacterStats<STAT_TYPE>("Sample");
characterStats.AddStat(STAT_TYPE.POWER, 50);
characterStats.AddStat(STAT_TYPE.HEALTH, 100);
characterStats.AddStat(STAT_TYPE.INTELIGENCE, 30);
characterStats.AddModifier(STAT_TYPE.POWER, new Modifier(ModifierType.Add, 20));
characterStats.AddModifier(STAT_TYPE.POWER, new Modifier(ModifierType.Add, 10) { Source = key }); // key 오브젝트 키 설정
characterStats.AddModifier(STAT_TYPE.INTELIGENCE, new Modifier(ModifierType.Multiply, 0.1f) { Source = key }); // key 오브젝트 키 설정
characterStats.AddModifier(STAT_TYPE.HEALTH, new Modifier(ModifierType.Percent, 0.1f).SetID("A")); // "A" 아이디 설정
characterStats.AddModifier(STAT_TYPE.INTELIGENCE, new Modifier(ModifierType.Multiply, 0.1f).SetID("A")); // "A" 아이디 설정
characterStats.RemoveModifierBySource(key); // key 오브젝트 키로 등록된 수정사항 모든 스탯에서 제거
characterStats.RemoveModifierByID("A"); // "A" 아이디로 등록된 수정사항 모든 스탯에서 제거
직렬화 불가
설명: 생성자를 통해 최초 설정된 값을 가지고 있음. (읽기전용)
타입: float
설명: 수정 사항들이 반영 되지 않은 값을 가지고 있음.
타입: float
설명: 모든 수정 사항들을 적용한 최종 결과값. (읽기전용)
타입: float
설명: 스탯을 고유하게 만들기 위해 사용하는 키값. 일반적으로 string 또는 enum 타입을 지정합니다. (읽기전용)
타입: 제네릭
설명: 스탯 수정 사항이 발생하는 경우 이벤트를 받기위해 사용합니다. (읽기전용)
타입: UnityEvent
설명: 초기값과 Key 값을 설정할 수 있습니다.
매개변수:
key
(T): 키값.initialValue
(float): 초기값.
설명: 다른 스탯을 참조하여 초기 값으로 사용할 수 있습니다. 참조한 스탯이 변경되는 경우 기반으로 생성한 스탯도 값이 변경됩니다. 전투에서 버프나 디버프 같은 일시적인 스탯 수치와 분리해야 할 때 유용합니다.
매개변수:
parent
(Stat): 참조 스탯.
설명: 수정 사항을 추가합니다.
매개변수:
modifier
(Modifier): 수정 사항.
Returns: void
설명: 수정 사항을 제거합니다.
매개변수:
modifier
(Modifier): 수정 사항.
Returns: void
설명: ID가 같은 모든 수정 사항을 찾아 제거합니다.
매개변수:
id
(string): 수정 사항 ID.
Returns: void
설명: object를 소스로 사용하고 있는 모든 수정 사항을 찾아 제거합니다.
매개변수:
source
(object): 수정 사항을 부여한 주체.
Returns: void
설명: modifierType의 모든 수정사항을 얻어옵니다.
매개변수:
modifierType
(ModifierType): 수정 사항 타입.
Returns: IReadOnlyList
직렬화 가능
설명: 수정 타입. 계산되는 방식을 지정한다. (읽기전용)
타입: Modifier
설명: 수정에 적용할 수치. (읽기전용)
타입: float
설명: 수정사항을 고유하게 구분하기 위한 문자열.
타입: string
설명: 수정 사항을 부여한 주체 등 수정사항들을 그룹화 하기 위한 속성. (주의 : 이 속성은 직렬화 되지 않습니다.)
타입: object
설명: 수정 타입과 수정 수치를 설정하고 이 후 수정은 불가능 합니다.
매개변수:
type
(ModifierType): 수정타입.value
(float): 수치.
설명: 수정사항 들의 그룹을 만들기 위해 ID를 설정합니다. 수정 사항의 제거가 보다 편해집니다.
매개변수:
id
(string): ID.
Returns: void
설명: 케릭터 이름.
타입: string
설명: 모든 스탯 정보.
타입: IReadOnlyList
설명: 스탯 타입을 포함한 모든 스탯 정보.
타입: IReadOnlyDictionary<T, Stat>
설명: 수정 사항의 변동에 대한 이벤트.
타입: UnityEvent<CharacterStats, Stat>
설명: Key를 통해 특정 Stat을 얻어 올 수 있습니다.
타입: Stat
설명: Key 보유 여부 확인.
매개변수:
key
(T): 스탯의 키.
Returns: bool
설명: 스탯을 추가 합니다.
매개변수:
key
(T): 스탯의 키.initialiValue
(float): 스탯 초기값.
Returns: bool
설명: 수정 사항을 추가합니다.
매개변수:
key
(T): 스탯의 키.modifier
(Modifier): 수정사항.
Returns: bool
설명: 수정 사항을 제거합니다.
매개변수:
key
(T): 스탯의 키.modifier
(Modifier): 수정사항.
Returns: void
설명: 모든 Stat에서 같은 id를 가진 모든 수정을 제거합니다.
매개변수:
id
(string): 문자열 ID
Returns: void
설명: 모든 Stat에서 같은 소스를 가진 모든 수정을 제거합니다.
매개변수:
source
(object): 소스
Returns: void
설명: 스탯들의 상태를 로그로 출력하는 함수입니다.
매개변수:
title
(string): 로그 구분을 위한 타이틀 문자열.
Returns: void