메인 효과 클래스입니다. 파라미터와 캐릭터를 받아 시간에 따라 수정합니다. 또한 다음을 처리합니다 수정자
Scriptable 래퍼
이전 요소들을 하나로 통합하고 디스크에 저장할 수 있게 해줍니다. 나머지는 우리가 할 수 있도록 몇 줄의 코드만 있으면 됩니다!
이 이름들은 단지 관례일 뿐이지만, 원하는 대로 부를 수 있습니다!
알아두세요, 필요한 것은:
효과 변수를 저장하는 무언가
문자를 수정하는 역할을 하는 구조체
이 둘을 연결하고 정보를 디스크에 저장할 수 있게 해주는 Scriptable
사용자 지정 스크립트 작성
이 예제에서는 캐릭터를 변수에 따라 위로 이동시키는 효과를 만듭니다.
먼저 필요한 네임스페이스를 가져오세요(어차피 IDE가 알려줄 거예요 <3)
usingUnityEngine;// Text Animator의 네임스페이스를 가져오기usingFebucci.TextAnimatorCore;usingFebucci.TextAnimatorCore.Text;usingFebucci.Parsing;usingFebucci.TextAnimatorForUnity.Effects;
Parameters
문자를 수정하는 데 필요한 데이터를 만드세요(인스펙터에서 보게 되고 수정하게 될 바로 그 데이터입니다).
State
효과의 "핵심" 부분입니다. 파라미터와 미리 계산된 Text Animator 데이터를 바탕으로 문자를 수정합니다.
구조체는 다음을 상속해야 합니다: IEffectState.
Scriptable Object 래퍼
사용자 지정 효과를 Text Animator에 연결하는 데 필요한 로직을 만들고, Assets 폴더에도 저장합니다.
ManagedEffectScriptable의 다른 버전도 있는데, 더 많은 타입을 받을 수 있고 "Referenced" 효과 구현도 있습니다. 하지만 이는 향후 버전에서 다룰 예정입니다!
이 스크립트들만 있으면 Text Animator가 다음을 보장하는 데 충분합니다:
자동 관리되는 커브, 재생, 수정자
경합 조건 없이 최적화된 효과
AOT 플랫폼과 호환되는 효과(Reflection을 사용할 필요 없음)
강력한 미리보기 편집기
UI Toolkit과 TextMesh Pro에서 동일하게 동작하는 효과, 동적 스케일링 포함
그리고 더 많은 것들! <3
완료! 필요한 모든 단계를 완료했습니다, 야호!
효과를 더 많이 추가할수록 이 과정은 더 익숙하고 쉬워질 것입니다.
효과에 태그를 부여하고(인스펙터에서) 데이터베이스에 추가하는 것을 잊지 마세요! 그렇지 않으면 인식되지 않습니다. 자세한 내용은 여기에서 읽을 수 있습니다: 효과 데이터베이스
효과를 적용하며 즐거운 시간 보내세요!
"Referenced" 효과를 만드는 가이드는 곧 제공될 예정입니다. 아직 UX/API 부분을 다듬고 있기 때문입니다.
// struct 또는 class일 수 있습니다
// 후자는 기본값을 둘 수 있게 해줍니다
[System.Serializable]
class CustomEffectParameters
{
public float amount = 1.5f;
}
// 반드시 구조체여야 합니다!
struct CustomEffectState : IEffectState
{
readonly float defaultAmount;
float amount;
public CustomEffectState(CustomEffectParameters data)
{
// 파라미터 클래스에서 기본 amount 값을 가져옵니다
this.defaultAmount = data.amount;
this.amount = defaultAmount;
}
public void UpdateParameters(RegionParameters parameters)
{
// 사용자가 다음과 같이 작성한 경우를 자동으로 처리합니다
// 리치 텍스트 태그의 수정자, 이 경우 "a"
// (예: <tagID a=5>는 "amount"를 5로 설정하고,
// a*2는 "amount"를 defaultAmount의 두 배로 만듭니다)
amount = parameters.ModifyFloat("a", defaultAmount);
}
public void Apply(ref CharacterData character, in ManagedEffectContext context)
{
// "amount"를 사용해 문자를 위로 이동시킵니다
// 명확하고 사용하기 쉬운 API로
character.MovePosition(
Vector3.Up * amount * context.progressionRange * context.intensity,
context.isUpPositive
);
// 1. context.progressionRange에 주목하세요 -> 이것은
// 에디터에서 할당한 커브입니다!
// 스텝, 사인, 바운스 등의 결과를 만들 수 있습니다
// 2. 또한 context.intensity에도 주목하세요. 이는
// 단계 간 부드러운 전환을 위해 필요합니다.
}
}
[System.Serializable] // <-- 직렬화 가능하게 만드세요!!
[CreateAssetMenu(fileName = "Your Custom Effect")]
class CustomEffectScriptable : ManagedEffectScriptable<CustomEffectState, CustomEffectParameters>
{
// 파라미터를 받아 새 State를 단순히 만듭니다(이미 text animator가 관리함)
protected override CustomEffectState CreateState(CustomEffectParameters parameters)
=> new CustomEffectState(parameters);
}