사용자 정의 효과 작성 (C#)
내장 이펙트를 사용하거나 검사기에서 커스텀 이펙트를 만드는 것 외에도, C#을 통해 커스텀 이펙트를 쉽게 프로그래밍할 수 있습니다.
1. 이펙트 기본 클래스
해야 할 일은 기본 클래스를 상속받는 것입니다 Febucci.UI.Effects.AnimationScriptableBase 클래스 (스크립팅 API).
public class CustomEffect : AnimationScriptableBase
{
//[...]API에서 확인할 수 있는 유용한 클래스들이 이미 몇 가지 있습니다. 예를 들어 각 이펙트 카테고리를 위한 “BehaviorScriptableBase”나 “AppearanceScriptableBase”, 그리고 “a, f, w” 같은 수정자를 이미 처리하는 “BehaviorSineBase” 등이 있습니다.
2. 속성(Attributes)
Actions와 마찬가지로 ScriptableObject를 생성하므로, 인스턴스화 및 직렬화를 위해 필요한 속성들을 추가해야 합니다:
[CreateAssetMenu(fileName = "YourCustomEffect", menuName = "Text Animator/Custom/YourCustomEffect")]
[System.Serializable]
public class CustomEffect : AnimationScriptableBase
{
//[...]이렇게 하면 프로젝트 창에서 해당 오브젝트들을 생성할 수 있습니다.
를 상속하면 AnimationScriptableBase상속받는 상위 클래스에 따라 오버라이드할 몇몇 메소드들이 있으며, 일부는 필수(abstract)이고 다른 일부는 선택적(virtual)입니다. 문서(스크립팅 API와 IDE 모두)에서 새로운 메소드들에 대한 더 많은 예제와 정보를 찾을 수 있습니다.
3. 수정자(Modifier) 메소드
이펙트는 “수정자(Modifiers)”의 영향을 받을 수 있으므로, 애니메이션에서 이를 처리하기 위해 다음 메소드들을 오버라이드할 수 있습니다:
이 메소드들은 애니메이션 전에 순서대로 적용됩니다.
3.1 ResetContext
void ResetContext(TAnimCore animator)이 메소드를 사용하여 애니메이션 변수들을 초기 상태로 재설정할 수 있습니다.
예를 들어, 검사기에서 baseSpeed라는 변수를 공개적으로 노출하지만, 이펙트 내부에서는 currentSpeed만 사용하고 이 메소드 안에서 baseSpeed를 사용한다고 가정할 수 있습니다. currentSpeed 그리고 해당 변수를 currentSpeed=baseSpeed 로 이 메소드 내에서 설정할 수 있습니다.
3.2 SetModifierTo
void SetModifier(ModifierInfo modifier)이 메소드를 사용해 수정자를 변수에 적용할 수 있습니다.
예를 들어 이것은 currentSpeed 값을 s 수정자(있다면)에 의해 곱할 것입니다.
public override void SetModifier(ModifierInfo modifier)
{
switch (modifier.name)
{
case "s": currentSpeed *= modifier.value; break;
}
}👍🏻 만약 “amplitude”, “frequency”, “waveSize” 같은 세 가지 수정자를 갖는 Behavior 이펙트를 만들고 싶다면, 이를 처리해주는 클래스를 상속받아 만들 수 있습니다. BehaviorSineBase 가 그것들을 처리해 줄 것입니다.
4. 애니메이션 메소드
여기 커스텀 애니메이션을 만들기 위해 오버라이드할 수 있는 몇 가지 메소드가 있습니다.
4.1 GetMaxDuration
이펙트의 최대 지속 시간입니다. 이는 애니메이션의 총 지속 시간을 계산하고 부드러운 전환을 위해 사용됩니다. 그러나 끝나지 않는 이펙트라면 -1을 반환해야 합니다;
4.2 CanApplyEffectTo
bool CanApplyEffectTo(CharacterData character, TAnimCore animator)현재 문자에 이펙트를 적용할 수 있는지 확인하는 데 사용됩니다. 예를 들어, 문자 통과 시간이 이펙트의 지속 시간 내에 있을 때만 적용되는 appearance 이펙트를 만드는 경우(하지만 그런 경우에는 “AppearanceScriptableBase”를 상속받아 처리하게 할 수 있습니다).
더 나아가 문자가 숫자인지 문자(알파벳)인지, 또는 단어 인덱스 등 여러 조건을 검사할 수 있습니다.
4.3 ApplyEffect
void ApplyEffectTo(ref CharacterData character, TAnimCore animator)문자에 애니메이션을 적용하는 주요 메소드로, “CanApplyEffectTo”가 true를 반환할 때 호출됩니다.
character.current은 매 프레임 리셋됩니다 (character.source와 일치), 따라서 문자를 애니메이션하려면 해당 값들을 수정해야 합니다.character.source는 문자의 원래 위치 및 색상으로, 수정되면 기본적으로 문자를 영구적으로 변경하는 것(새 텍스트가 설정될 때까지)입니다. 이것을 기반으로만 사용하고 대신character.current를 수정하는 것이 권장됩니다.
✅ 완료!
모든 필요한 단계를 완료했습니다, 축하합니다! 이펙트를 더 많이 추가할수록 이 과정이 더 익숙하고 단순하게 느껴질 것입니다.
프로젝트 뷰에서 효과 ScriptableObject를 생성하고 데이터베이스에 추가하는 것을 잊지 마세요.
자세한 내용은 여기에서 읽을 수 있습니다: 데이터베이스
👍🏻 내장 이펙트 클래스를 항상 살펴보고 어떻게 구현되어 있는지 확인할 수 있습니다.
이펙트를 적용하며 즐거운 시간 보내세요!
Last updated