AnimationCurve
시간에 따른 값을 조정하는데 사용된다. 쉽게 말하자면 보다 직관적으로 곡석을 설정하여 오브젝트의 속서을 시간에 따라 어떻게 변화시킬지를 직관적으로 조절할 수 있다. Unity에서 인스펙터창에서 쉽게 커브를 조절할 수 있다.
왜 Animation Curve를 사용해야할까?
보통 lerp을 이용해서 오브젝트를 부드럽게 이동할 수 있다. 하지만 lerp만 사용하게되면 움직임이 직선적이고 균일하게만 변경할 수 있다. 그렇게 되면 복잡하거나 자연스러운 움직임을 구현하려면 제약이 있다.
구성요소
01 Keyframe
곡선의 각 지점을 나타내며 특정시간에 해당하는 값을 정의하는 요소이다.
02 AddKey
public int AddKey(float time, float value);
시간(Time) : 해당 키프레임이 발생하는 시간
값(Value) : 해당 시간에 커브가 가지는 값
코드 예시
AnimationCurve curve = new AnimationCurve();
curve.AddKey(0f, 1f); // 낮은 값 : 해당 값의 변화의 크기가 작아짐
curve.AddKey(1f, 10f); // 높은 값 : 해당 값의 변화의 크기가 커짐
03 Evaluate
time값을 사용해서 그 시간에 해당하는 value를 반환하는 메서드이다. 즉 주어진 시간 값에 해당하는 애니메이션 커브상의 값을 반환해주는 메서드이다. 이를 이용해서 이동 경로, 변화속도 등을 조절하는데 유용하게 쓰인다.
public float Evaluate(float time);
float valueAtTime0 = curve.Evaluate(0f); // 시간 0에서 커브의 값 1
float valueAtTime05 = curve.Evaluate(0.5f); // 시간 0.5에서 커브의 값 3
float valueAtTime1 = curve.Evaluate(1f); // 시간 1에서 커브의 값
Debug.Log(valueAtTime0); // 출력: 1
Debug.Log(valueAtTime05); // 출력: 3
Debug.Log(valueAtTime1); // 출력: 5
04 Constant
모든 시간 동안 일정한 애니메이션 커브를 생성하는데 사용된다.
public static AnimationCurve Constant(float timeStart, float timeEnd, float value);
AnimationCurve constantCurve = AnimationCurve.Constant(0f, 2f, 5f); // 시간 0에서 2까지 값이 5로 일정한 커브를 생성
05 EaseInOut
시작할때는 느리게 증가하고 중간에 속도가 빨라졌다가 마지막에 다시 느리게 종료되는 곡선이다.
public static AnimationCurve EaseInOut(float timeStart, float valueStart, float timeEnd, float valueEnd);
매개변수
timeStart : 커브가 시작하는 시간
valueStart : 커브가 시작할 때의 값
timeEnd : 커브가 끝나는 시간
valueEnd : 커브가 끝날때
AnimationCurve easeInOutCurve = AnimationCurve.EaseInOut(0f, 0f, 1f, 10f); // 시간 0에서 1까지 값이 0에서 10으로 변하며, 부드러운 Ease-In-Out 곡선을 그리는 커브를 생성
06 Linear
시작 시간부터 끝 시간까지 일정한 속도로 값이 변화하는 직선 형태의 곡선다.
public static AnimationCurve Linear(float timeStart, float valueStart, float timeEnd, float valueEnd);
매개변수
timeStart : 커브가 시작하는 시간
valueStart : 커브가 시작할 때의 값
timeEnd : 커브가 끝나는 시간
valueEnd : 커브가 끝날때
AnimationCurve linearCurve = AnimationCurve.Linear(0f, 0f, 1f, 10f); // 시간 0에서 1까지 값이 0에서 10으로 선형적으로 증가하는 커브를 생성
코드 예시
public class example : MonoBehaviour
{
public Transform objectLinear; // 직선 이동 오브젝트
public Transform objectEaseInOut; // Ease-in-out 이동 오브젝트
public Transform objectBounce; // Bounce 이동 오브젝트
public Vector3 startPosition = new Vector3(-5, 0, 0); // 시작 위치
public Vector3 endPosition = new Vector3(5, 0, 0); // 끝 위치
public float moveDuration = 2f; // 이동 시간
public AnimationCurve easeInOutCurve; // Ease-in-out 커브
public AnimationCurve bounceCurve; // Bounce 커브
void Start()
{
// 각각의 오브젝트가 서로 다른 커브로 움직이도록 코루틴 시작
StartCoroutine(MoveObject(objectLinear, startPosition, endPosition, moveDuration, AnimationCurve.Linear(0, 0, 1, 1))); // 직선 커브
StartCoroutine(MoveObject(objectEaseInOut, startPosition, endPosition, moveDuration, easeInOutCurve)); // Ease-in-out 커브
StartCoroutine(MoveObject(objectBounce, startPosition, endPosition, moveDuration, bounceCurve)); // Bounce 커브
}
// 오브젝트를 주어진 커브에 따라 이동시키는 코루틴
private IEnumerator MoveObject(Transform obj, Vector3 start, Vector3 end, float duration, AnimationCurve curve)
{
float timeElapsed = 0f;
while (timeElapsed < duration)
{
// 현재 시간 비율 계산 (0 ~ 1 사이)
float t = timeElapsed / duration;
// 커브의 값을 이용해 Lerp 적용
float curveValue = curve.Evaluate(t);
obj.position = Vector3.Lerp(start, end, curveValue);
// 시간 업데이트
timeElapsed += Time.deltaTime;
yield return null;
}
// 마지막 위치 보정 (정확히 끝 위치에 도달)
obj.position = end;
}
}
실행결과 영상
Linear - 삼각형, Ease In Out - 사각형, Bounce - 원
'유니티 공부 > Unity' 카테고리의 다른 글
Unity - Sprite Library Asset (0) | 2024.11.08 |
---|---|
Unity - Unity6가 출시되었습니다! (3) | 2024.11.07 |
Unity - Hold on ( busy for .. ) 무한 로딩 문제 (0) | 2024.07.18 |
Unity - 유니티 수학(+) Model Matrix, View Matrix, Projection Matrix) (0) | 2024.06.01 |
Unity - SRP(Scriptable Render Pipelines) + Pipelines(Batching,DrawCall,Post Processing, Upscale Sampling) (0) | 2024.05.30 |
댓글