Overview
com.111percent.scripting.percent-cheat
이게 뭔가요?
Unity Editor & Runtime 환경에서 테스트 환경을 제공하는 패키지입니다.
왜 필요한가요?
개발의 테스트단계(레벨링, 기능 테스트, 언어 변경 등)에서 여러 테스트 작업을 구현할 수 있도록 지원합니다.
- 데이터 조작, 함수 호출 등 일반적인 리플렉션 기능을 Attribute 한 줄로 구현할 수 있습니다.
- 외부에서 값을 변경하거나 내부에 변경된 값을 추적할 수 있습니다.
- 구현에 따라 Editor & Runtime 테스트 케이스를 생성하고 관리할 수 있습니다.
어떻게 사용하나요?
사용하기
지원하는 자료형
int
,uint
,short
,long
float
,double
bool
,byte
string
enum
- 제너릭 형식을 사용하지 않는
Class
또는struct
Editor 에서 사용하기
CheatWindow를 호출하는 방법
- 상단 메뉴에서 Percent → Cheat → Open CheatWindow 를 클릭합니다.
아래 예시에서는 샘플 프로젝트에 작성된 커스텀 MenuItem을 등록하여 호출하는 방법입니다.
단축키 할당은 필수가 아니지만 자주 사용할 경우 권장합니다.
// 아래 코드는 CheatWindow를 단축키로 사용할 수 있도록 MenuItem 에 등록합니다. // Editor에서만 동작하며, Percent.Cheat.Editor 참조를 필요로 합니다. #if UNITY_EDITOR public static class ModifyCheatItemHotkey { // Ctrl(Mac is cmd) + Shift + q [UnityEditor.MenuItem("Window/My Custom CheatWindow CheatWindow %#q")] static void ShowWindow() => Percent.Scripting.Cheat.Editor.CheatEditorWindow.ShowWindow(); } #endif
Runtime
아래 코드와 같이 Show()
및 Hide()
으로 치트 UI를 활성화 및 비활성화 합니다.
if (Input.GetKeyDown(KeyCode.Q))
{
Percent.Scripting.Cheat.Cheater.Show();
}
else if (Input.GetKeyDown(KeyCode.E))
{
Percent.Scripting.Cheat.Cheater.Hide();
}
버튼 인터페이스
Settings 버튼을 누르면 사용할 수 있는 메뉴가 나타납니다.
Cheat
- 주요 기능입니다.
Options
- 폰트의 크기를 변경할 수 있습니다.
추후 업데이트 기능
System
- 기기에 대한 정보 표기
Console
- Unity Log
- Percent Package Logger
Profile
- Simple Benchmark Test Runner
- Usage Memory Profile, Used AssetBundle Profile
- Detail FPS
CheatableHeader Attribute
필터 기능을 재정의하는 속성입니다.
class
형식에 사용할 수 있습니다.- 내부
Cheatable Attribute
형식은Category
가 명시되지 않는 경우 해당 클래스의Category
이름을 사용합니다.
[CheatableHeader(Category = "Custom Category", Order = 0)]
public static class DFOIsDFMOsDOF
{
[Cheatable] public static int Custom { get; set; } = 0;
}
Cheatable Attribute
기본적인 Percent Cheat Attribute 속성입니다.
Field
,Property
형식에 사용할 수 있습니다.Category
프로퍼티를 사용하여 에디터 내 카테고리로 분류할 수 있습니다.- 비어있는 경우 상위 클래스의 이름으로 분류됩니다.
DisplayName
프로퍼티를 사용하여 보여주는 변수 이름을 변경할 수 있습니다.- 비어있는 경우 선언한 변수 이름으로 나타납니다.
ToolTip
프로퍼티를 사용하여 마우스를 변수 이름위에 올렸을 때 나타나는 메세지를 변경할 수 있습니다.- 비어있는 경우 해당 형식의 자료형 이름으로 나타납니다.
public static class MainContent
{
[Cheatable(Order = 0)] public static int Integer { get; set; } = 0;
[Cheatable(Order = 1)] public static long LongValue = 0;
[Cheatable(Order = 2)] public static float FloatValue = 0;
[Cheatable(Order = 3)] public static double DoubleValue = 0;
[Cheatable(DisplayName = "Custom Bool!")] public static bool Boolean = false;
[Cheatable(Tooltip = "Im String!")] public static string StringValue = "";
}
CheatableRange Attribute
값의 길이를 제한할 수 있는 속성입니다. 기본 형식은 Cheatable Attribute
와 동일합니다.
IsShowValue
형식으로 슬라이딩 된 값을 직접 제어할 수 있습니다.
// 클래스 이름의 '_' 형식은 띄어쓰기로 표기됩니다. (MainContent_Range -> MainContent Range)
public static class MainContent_Range
{
[CheatableRange(0, 100, Order = 0)]
public static int IntSlider = 0;
[CheatableRange(0f, 10f, Order = 1, IsShowValue = true)]
public static float FloatSlider = 0;
}
CheatableSelector Attribute
값을 선택할 수 있도록 미리 구현된 항목을 선택할 수 있는 속성입니다. 기본 형식은 Cheatable Attribute
와 동일합니다.
Enum
형식의 경우Cheatable
일 때CheatableSelector
속성으로 변경됩니다. (자동)class
또는struct
의 경우 버튼의 이름은ToString()
함수를 사용하여 표기합니다.
public static class MainContent_Selectable
{
public enum ColorType : int
{
None = 0,
Red, Blue, Green
}
public struct MyCustomStruct
{
public float AudioVolume { get; set; }
public string NickName { get; set; }
// 구조체 또는 클래스의 경우 선택하고자 하는 항목의 이름을 설정합니다.
public override readonly string ToString() => NickName;
}
private readonly static List<int> _internalValue = new() { 1, 2, 3, 4 };
private readonly static MyCustomStruct[] _internalStruct = new[]
{
new MyCustomStruct { AudioVolume = 0.5f, NickName = "First" },
new MyCustomStruct { AudioVolume = 1f, NickName = "Second" },
};
// 열거형의 경우 CheatableSelector 형식으로 변경됩니다.
[Cheatable(Order = 0)] public static ColorType MyColorType = ColorType.Red;
// param object[] 형식을 사용하여 선택할 객체를 삽입합니다.
[CheatableSelector(1, 2, 3, 4, Order = 1)] public static int IntSelect = 0;
// 미리 선언한 객체를 선택할 수 있도록 합니다.
[CheatableSelector(nameof(_internalValue), Order = 2)]
public static int IntListSelect = 2;
[CheatableSelector(nameof(_internalStruct), Order = 3)]
public static MyCustomStruct CustomStruct;
}
CheatableMethod Attribute
함수를 호출할 수 있도록 설정합니다. 기본 형식은 Cheatable Attribute
와 동일합니다.
Method
형식에서 사용할 수 있습니다.- 매개변수가 필요한 경우
CheatableMethodParameter
속성을 같이 사용합니다.
[Preserve]
public static class MainContent_Method
{
public enum ColorType : int
{
None = 0,
Red, Blue, Green
}
[CheatableMethod(Order = 0)]
public static void VoidFunc() => UnityEngine.Debug.Log("Void!");
// 매개변수가 존재하는 경우 반드시 CheatableMethodParameter 속성을 사용해주세요.
// 아래에서는 매개변수의 기본값을 설정합니다.
[CheatableMethod(Order = 1)]
[CheatableMethodParameter(0, ColorType.None)]
public static void ParamFunc(int value, ColorType color)
=> UnityEngine.Debug.Log($"Value : {value}, {color}");
// 선택할 객체를 삽입하여 함수를 호출할 때 선택할 수 있도록 합니다.
[CheatableMethod(Order = 2)]
[CheatableMethodParameter(
new int[] { 1, 2, 3, 4 },
new ColorType[] { ColorType.Red, ColorType.Blue, ColorType.Green })]
public static void ParamFunc_Selectable(int value, ColorType color)
=> UnityEngine.Debug.Log($"Value : {value}, {color}");
}
버전기록
1.1.0
gamebase 필터 제거 Unity 2022.3 이상 버전 호환 패치 진행 Field, Property 제너릭 클래스로 변경 및 인터페이스 재구성 Method Parameter 속성 추가 Order, Header 기능 구현
1.0.3
Int, Float Field 에서 기본 슬라이딩 기능 (DragHotZone) 추가 함수 호출 간결화 (컴포넌트 없이 호출할 수 있도록 기능 추가)
1.0.2
형식 있는 자료형을 CheatableSelectItemAttribute 에서 확인하지 못하는 문제 수정 Field 형식이 ItemArray 를 인식하지 못하는 문제 수정
1.0.1
Runtime 모바일 테스트 진행 완료 및 1.0.1 패키지 릴리즈
1.0.0-Pre.6
UnityEditor 내 UI 값 변경 시 다른 프로퍼티 값을 동기화 할 수 있도록 수정
1.0.0-Pre.3 ~ 5
UI Builder 시스템을 활용하여 Runtime UI 환경 제작 Runtime 환경에서도 실행할 수 있도록 기능 개선 UI Runtime Theme (.tss 파일) 이 누락되는 문제 (gitIgnore) 수정 Range (Slider), 변수 값 업데이트 버튼, Label, Tooltip이 정상적으로 표시되지 않는 문제 수정
1.0.0-Pre.2
Minibutton offset 값 수정 Int, float 슬라이더 형식 변경
1.0.0-Pre.1
패키지 테스트