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줄 요약:

  1. GetComponent는 특정 컴포넌트를 검색해 반환하며 없으면 null을 반환.
  2. TryGetComponent는 컴포넌트를 안전하게 검색해 out 매개변수로 반환하고 성공 여부를 true 또는 false로 반환.
  3. 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줄 요약:

  1. Unity 조명 시스템은 방향성 광원, 점 광원, 스포트라이트, 면 광원 등 다양한 조명 유형을 제공.
  2. 실시간 조명베이크된 조명은 성능과 품질 요구 사항에 따라 선택할 수 있다.
  3. 그림자Global Illumination을 통해 현실감 있는 장면을 만들 수 있다.
  4. 라이트 프로브는 동적 객체에 간접 조명을 제공하여 일관된 조명 효과를 유지.
  5. 최적화를 위해 조명 설정과 품질을 적절히 조정하고 필요에 따라 베이크된 조명을 사용해야 한다.

AnimationCurve

AnimationCurve는 Unity에서 시간에 따라 값을 변경하는 애니메이션을 정의하는 데 사용된다. 이를 통해 특정 시간에 특정 값을 매핑하는 곡선을 만들 수 있으며, 주로 위치, 회전, 크기 등의 애니메이션에 사용된다. AnimationCurve는 여러 키프레임으로 구성되며, 각 키프레임은 시간과 값 쌍으로 이루어져 있다.
 

AnimationCurve 생성 및 편집

AnimationCurve는 코드 내에서 생성할 수 있으며, 에디터에서 직접 편집할 수도 있다.

AnimationCurve curve = new AnimationCurve();
curve.AddKey(0f, 0f);
curve.AddKey(0.5f, 1f);
curve.AddKey(1f, 0f);
//세 개의 키프레임을 가진 커브를 생성합니다.
//키프레임은 AddKey 메서드를 사용하여 추가할 수 있으며, 각각의 키프레임은 시간과 값 쌍으로 정의됩니다.

에디터에서 생성 및 편집하기:

  1. AnimationCurve 변수를 스크립트에서 공개 변수로 선언한다.
  2. Unity 에디터에서 해당 스크립트를 컴포넌트로 포함하는 게임 오브젝트를 선택한다.
  3. 인스펙터 창에서 커브 편집기를 사용하여 커브를 시각적으로 편집한다.

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줄 요약:

  1. AnimationCurve는 시간에 따라 값을 변경하는 애니메이션을 정의하며, 키프레임으로 구성.
  2. Keyframe은 시간과 값, 그리고 탄젠트 정보를 포함하여 곡선의 형태를 정의.
  3. Evaluate 메서드는 주어진 시간의 값을 평가하고, 보간을 통해 키프레임 사이의 값을 계산.
  4. Interpolation을 사용하여 키프레임 사이의 값을 부드럽게 보간한다.
728x90