내일배움캠프 24일차 TIL Unity 게임개발 숙련(TryGetComponent,Unity 조명 시스템,AnimationCurve)
TryGetComponent
Unity에서 사용하는 메서드로, 검색하려는 컴포넌트를 찾으면 true를 반환하고, 못 찾으면 false를 반환합니다. 따라서 null 검사를 직접 하지 않아도 됩니다.
메서드 형식:
public bool TryGetComponent<T>(out T component) where T : Component;
/* T: 가져오려는 컴포넌트의 타입
component: 컴포넌트를 가져올 때 사용되는 out 매개변수 */
Rigidbody rb;
if (TryGetComponent<Rigidbody>(out rb))
{
// 컴포넌트를 성공적으로 찾았을 때의 처리
}
else
{
// 컴포넌트를 찾지 못했을 때의 처리
}
GetComponent와 TryGetComponent의 차이점
1. 반환 방식:
- GetComponent: 요청한 컴포넌트를 반환하며 없으면 null을 반환.
- TryGetComponent: 요청한 컴포넌트를 out 매개변수로 반환하며 찾으면 true, 찾지 못하면 false를 반환.
2. 안전성:
- GetComponent: 반환 값이 null일 가능성이 있으므로 null 검사를 반드시 해야 한다.
- TryGetComponent: true 또는 false를 반환하므로 null 검사 대신 조건문으로 컴포넌트의 존재 여부를 쉽게 확인.
3. 성능:
- 두 메서드 모두 내부적으로 동일한 성능 특성을 가지지만 TryGetComponent는 null 검사를 자동으로 처리해 코드의 가독성과 안전성을 높여준다.
3줄 요약:
- GetComponent는 특정 컴포넌트를 검색해 반환하며 없으면 null을 반환.
- TryGetComponent는 컴포넌트를 안전하게 검색해 out 매개변수로 반환하고 성공 여부를 true 또는 false로 반환.
- TryGetComponent는 null 검사를 필요로 하지 않아 코드의 가독성과 안전성을 높여준다.
Unity 조명 시스템
Unity의 조명 시스템은 3D 및 2D 씬에서 시각적 요소를 강화하고 현실감 있는 장면을 만들기 위해 다양한 종류의 조명과 조명 효과를 제공한다. 조명은 씬의 분위기를 설정하고, 물체의 모양과 질감을 강조하는 데 중요한 역할을 한다.
1. 조명의 종류
Unity에서는 다양한 종류의 조명을 제공한다.
- Directional Light (방향성 광원): 무한히 먼 곳에서 오는 평행한 빛을 시뮬레이션. 씬 전체에 고르게 빛을 비춘다.
- Point Light (점 광원): 특정 점에서 모든 방향으로 빛을 발산. 전구와 같은 광원을 시뮬레이션하며 거리 제곱에 반비례하여 빛이 감쇠.
- Spot Light (스포트라이트): 원뿔 모양으로 빛을 발산. 특정 방향으로 빛을 집중시키며 손전등이나 자동차 헤드라이트와 같은 광원을 시뮬레이션.
- Area Light (면 광원): 특정 면적에서 나오는 빛을 시뮬레이션. 실시간 조명으로는 지원되지 않으며 주로 베이크된 조명에서 사용
2. 조명 설정
각 조명은 다양한 속성을 가지고 있으며 이를 통해 조명의 특성을 설정할 수 있다.
- Color: 조명의 색상을 설정.
- Intensity: 조명의 밝기를 설정.
- Range: 조명의 영향을 미치는 최대 거리를 설정. 주로 Point Light와 Spot Light에서 사용.
- Spot Angle: 스포트라이트의 원뿔 각도를 설정.
- Shadows: 그림자를 활성화할지 여부와 그림자의 유형을 설정. (없음, 하드, 소프트)
3. 실시간 조명 vs. 베이크된 조명
조명은 실시간으로 계산될 수도 있고, 베이크(Bake)하여 사전에 계산된 데이터를 사용할 수도 있다. 두 방법 모두 장단점이 있으며 성능과 품질 요구 사항에 따라 선택할 수 있다.
- 실시간 조명: 게임 실행 중에 실시간으로 계산. 동적인 장면에서 유용하지만, 성능에 큰 영향을 미칠 수 있다.
- 베이크된 조명: 빛맵(Lightmap)에 사전 계산되어 저장. 주로 정적인 장면에서 사용되며, 성능 향상에 유리하지만 동적인 조명 효과는 지원되지 않는다.
4. 그림자
Unity의 조명 시스템은 그림자를 지원하여 장면의 깊이와 현실감을 더해준다.
그림자는 성능에 큰 영향을 미치므로, 필요에 따라 적절한 품질 설정을 선택하는 것이 중요.
- 하드 그림자: 경계가 명확한 그림자.
- 소프트 그림자: 경계가 부드러운 그림자.
5. 글로벌 조명 (Global Illumination, GI)
Global Illumination은 간접 조명을 시뮬레이션하여 더 현실감 있는 조명 효과를 제공.
빛이 표면에 반사되어 다른 표면을 밝히는 효과를 포함. Unity에서는 두 가지 GI 방법을 제공.
- 정적 GI: 빛맵을 사용하여 사전 계산된 간접 조명을 적용.
- 동적 GI: 실시간으로 간접 조명을 계산합니다. Enlighten 기술을 사용하여 구현.
6. 라이트 프로브 (Light Probes)
Light Probes는 정적인 라이트맵이 적용되지 않는 동적 객체에 간접 조명을 제공하는 데 사용. 씬 전체에 걸쳐 여러 프로브를 배치하여 다양한 위치에서의 조명 정보를 저장하고, 동적 객체가 이동할 때 해당 정보를 사용.
7. 조명 설정 관리
- Lighting 창: 조명과 관련된 모든 설정을 관리할 수 있는 창. 여기서 글로벌 조명, 환경 조명, 빛맵 설정 등을 조정할 수 있다.
- Post Processing: 조명 효과를 더욱 강화하기 위해 포스트 프로세싱 효과를 적용할 수 있다. 블룸, 색상 보정, 안티앨리어싱 등 다양한 효과를 통해 시각적 품질을 향상시킬 수 있다.
- Lighting Intensity Multiplier : 실제 환경의 빛을 조절한다.
- Reflecting Intensity Multiplier : 실제 오브젝트에 반사되는 정도를 조절한다.
8. 퍼포먼스 고려사항
조명은 성능에 큰 영향을 미치므로 최적화가 중요. 다음과 같은 최적화 방법을 고려할 수 있다:
- 필요 없는 조명 비활성화
- 적절한 그림자 품질 설정
- 베이크된 조명을 사용하여 실시간 계산 부담 줄이기
- 라이트 프로브와 리플렉션 프로브 사용
5줄 요약:
- Unity 조명 시스템은 방향성 광원, 점 광원, 스포트라이트, 면 광원 등 다양한 조명 유형을 제공.
- 실시간 조명과 베이크된 조명은 성능과 품질 요구 사항에 따라 선택할 수 있다.
- 그림자와 Global Illumination을 통해 현실감 있는 장면을 만들 수 있다.
- 라이트 프로브는 동적 객체에 간접 조명을 제공하여 일관된 조명 효과를 유지.
- 최적화를 위해 조명 설정과 품질을 적절히 조정하고 필요에 따라 베이크된 조명을 사용해야 한다.
AnimationCurve
AnimationCurve 생성 및 편집
AnimationCurve는 코드 내에서 생성할 수 있으며, 에디터에서 직접 편집할 수도 있다.
AnimationCurve curve = new AnimationCurve();
curve.AddKey(0f, 0f);
curve.AddKey(0.5f, 1f);
curve.AddKey(1f, 0f);
//세 개의 키프레임을 가진 커브를 생성합니다.
//키프레임은 AddKey 메서드를 사용하여 추가할 수 있으며, 각각의 키프레임은 시간과 값 쌍으로 정의됩니다.
에디터에서 생성 및 편집하기:
- AnimationCurve 변수를 스크립트에서 공개 변수로 선언한다.
- Unity 에디터에서 해당 스크립트를 컴포넌트로 포함하는 게임 오브젝트를 선택한다.
- 인스펙터 창에서 커브 편집기를 사용하여 커브를 시각적으로 편집한다.
Keyframe
Keyframe은 AnimationCurve의 기본 단위이다. 각 Keyframe은 시간과 값 외에도 입출력 탄젠트 정보를 포함한다.
이를 통해 곡선의 형태를 세밀하게 조정할 수 있다.
Keyframe key1 = new Keyframe(0f, 0f);
Keyframe key2 = new Keyframe(0.5f, 1f);
Keyframe key3 = new Keyframe(1f, 0f);
AnimationCurve curve = new AnimationCurve(key1, key2, key3);
커브의 속성
AnimationCurve는 다음과 같은 속성을 제공한다:
- keys: 커브의 모든 키프레임을 배열로 반환.
- length: 커브의 키프레임 개수를 반환.
- preWrapMode: 시작 전의 래핑 모드를 설정. (예: 반복, 반복 없음)
- postWrapMode: 종료 후의 래핑 모드를 설정.
Evaluate 메서드
Evaluate 메서드는 주어진 시간에서 커브의 값을 반환. 이 메서드는 키프레임 사이의 값을 보간하여 계산한다.
float valueAtTime = curve.Evaluate(0.75f);
Debug.Log("Value at time 0.75: " + valueAtTime);
//시간 0.75에서의 커브 값을 평가하여 출력합니다. 이 메서드는 커브의 형태와 키프레임의 위치에 따라 값을 보간하여 반환합니다.
사용 예시
AnimationCurve를 사용하여 오브젝트의 위치를 애니메이션하는 예제:
using UnityEngine;
public class MoveObject : MonoBehaviour
{
public AnimationCurve curve;
public float duration = 2f;
public Vector3 startPoint;
public Vector3 endPoint;
private float time = 0f;
void Update()
{
if (time < duration)
{
time += Time.deltaTime;
float t = time / duration;
float curveValue = curve.Evaluate(t);
transform.position = Vector3.Lerp(startPoint, endPoint, curveValue);
}
}
}
/* 위 예제는 AnimationCurve를 사용하여 오브젝트를 일정 시간 동안 부드럽게 이동시키는 방법을 보여줍니다.
Vector3.Lerp 함수와 결합하여 커브 값을 기준으로 위치를 보간합니다.*/
4줄 요약:
- AnimationCurve는 시간에 따라 값을 변경하는 애니메이션을 정의하며, 키프레임으로 구성.
- Keyframe은 시간과 값, 그리고 탄젠트 정보를 포함하여 곡선의 형태를 정의.
- Evaluate 메서드는 주어진 시간의 값을 평가하고, 보간을 통해 키프레임 사이의 값을 계산.
- Interpolation을 사용하여 키프레임 사이의 값을 부드럽게 보간한다.