ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [TIL] 7주차 1일 개인 프로젝트 주차 ( 조명, 카메라 절두체, Coroutine)
    개발일지/스파르타 코딩클럽 부트캠프 2024. 5. 27. 20:47

     

    오늘 배운 내용 


     TryGetComponent

     

    TryGetComponent는 유니티에서 사용하는 메소드이다. 게임 오브젝트의 컴포넌트를 가져온다.

    보통 지금까지 GetComponent로 주로 컴포넌트를 가져왔고 이건 사용해본 적이 없는데,

    두 메소드의 차이점을 알아보자

    public bool TryGetComponent<T>(out T component) where T : Component;

     

    TryGetComponent의 형식은 다음과 같다.

    T : 가져오려는 컴포넌트의 타입. MonoBehaviour를 상속한 컴포넌트는 모두 사용 가능하다.

    component : 컴포넌트를 가져올 때 사용되는 out 매개변수

     

    아래는 강의에서 나온 사용법이다.

    using UnityEngine;
    
    public class ExampleScript : MonoBehaviour
    {
        private void Start()
        {
            // 게임 오브젝트에 Rigidbody 컴포넌트가 있는지 확인하고 가져옵니다.
            Rigidbody rb;
            if (TryGetComponent<Rigidbody>(out rb))
            {
                // Rigidbody 컴포넌트가 있다면 해당 컴포넌트로 원하는 동작을 수행합니다.
                rb.AddForce(Vector3.up * 100f);
            }
            else
            {
                // Rigidbody 컴포넌트가 없다면 다른 처리를 수행합니다.
                Debug.Log("Rigidbody component not found.");
            }
        }
    }

     

    TryGetComponent만의 차이점은

    컴포넌트가 없어도 예외를 발생시키지 않는다는 점이다.

    컴포넌트가 있으면 해당 컴포넌트를 가져와서 사용하고, 없어도 null값이 발생하지 않아서

    조금 더 안전하게 컴포넌트를 가져올 수 있다.

    bool값으로 반환되는 점도 TryGetComponent의 특징이다.

     

    Coroutine

     

    Coroutine은 작업을 다수의 프레임에 분산하는 메소드이다. 이렇게만 들으면 사실 뭔 소린지..

     

    유니티에서 코루틴은 실행을 일시정지하고 제어를 유니티에 반환하지만 다음 프레임을

    계속할 수 있는 메소드이다. 코루틴을 사용하기 전에 동기와 비동기에 대해서 알아야한다.

    동기와 비동기란?

     

    동기 : 클라이언트 작업을 하다가 서버에 작업을 넘겨준다. 서로의 작업이 끝나기 전에는

              서로 작업을 진행할 수 없다. 한 마디로 동기는 다른 작업을 진행할 때 기존에 있는 작업을

              진행하지 못하는 것을 뜻한다. 각각의 작업이 끝나기 전까지는 다음 작업을 할 수 없다.

    비동기 : 동시에 작업을 할 수 있다. 서버가 작업을 한다고 클라이언트의 작업이 끊어지지 않는다.

                  

    코루틴은 동시에 진행되는것 처럼 보이지만 사실은 비동기가 아닌 동기다.

    기존의 함수의 경우에는 함수를 호출하면 함수의 작업이 다 끝나야지만 돌아온다.

    코루틴은 코루틴을 호출할 때 코루틴과 메인작업을 계속해서 왔다갔다 한다.

     

    일시정지 -> 메인 -> 재개 -> 일시정지 반복

     

    하지만 코루틴은 스레드가 아니다. 유니티는 동시에 작업을 하는걸 멀티스레딩으로 동작할 수 있게 해주는데

    코루틴은 왔다갔다 한다고 하지만 코루틴은 단일스레드를 사용한다. 양보해줬다가 돌아온다는 느낌이다.

    현상은 비동기처럼 보이지만 실체는 동기이다.

     

     

    Light (조명)

     

    라이트 소스에 대해서 먼저 알아보자

     

    라이트 소스는 게임 또는 3D렌더링에 광원을 추가하는 데 사용된다.

    이것은 특정 위치 또는 방향에서 발생하는 빛을 나타낸다.

    점 광원과 방향성 라이트이다.

     

    점 광원(Point Light) : 모든 방향으로 균등하게 빛을 발사하는 광원이다.

    방향성 라이트(Directional Light) : 무한히 멀리 위치하여 한 방향으로만 빛을 발사하는 광원이다.

     

    스포트라이트와 면 광원이다

     

    스포트라이트(Spot Light) : 씬의 한 점에 위치하여 원뿔 모양으로 빛을 발산하는 광원이다.

    면 광원(Area Light) : 표면 영역 전체에 걸쳐서 균둥하게 모든 방향으로 빛을 방출한다. 사각형의 한쪽 면에서만 방출한다.

     

    • 속성 : 위치, 방향, 강도(intensiy), 색상(color), 범위(range), 각도(angle) 등이 있다.
    • 그림자 : 라이트와 객체 사이의 관계에 따라 그림자는 라이트가 부딪히는 객체 뒤에 생성.
    • 성능 : 라이트는 렌더링 성능에 큰 영향을 미친다. 특히 그림자가 포함된 경우 렌더링 성능에 부정적인 영향을 미칠 수 있어 최적화에 신경 써야 함.
    • Lighting Intensity Multiplier : 실제 환경의 빛을 조절한다.
    • Reflecting Intensity Multiplier : 실제 오브젝트에 반사되는 정도를 조절한다.

    AnimationCurve

     

    AnimationCurve는 유니티에서 애니메이션의 키프레임을 사용해서 값을 보간하는데 사용되는 클래스이다.

    이걸 사용해서 시간에 따라 값을 부드럽게 변화시키는 커브를 정의하고, 이를 기반으로 애니메이션을 만들 수 있다.

     

    AnimationCurve 클래스의 기본적인 구성 요소는 다음과 같다.

     

    키 프레임 (Keyframe) : 시간에 따른 값을 정의하는 점을 의미한다. 키프레임은 시간(t) 과 해당 시간에 대응하는 값(value)                                       으로 이루어진다.

    보간 방식 (Interpolation Mode) : 인접한 키프레임 사이의 값을 보간하는 방법을 지정한다. 기본적으로는 Cubic Bezier

                                                        보간이 사용되며, 선형, 스텝 등 다양한 보간 방식을 선택할 수 있다.

     

    AnimationCurve의 사용법은 아래와 같다.

     

    Addkey : 새로운 키프레임을 추가한다.

    using UnityEngine;
    
    public class ExampleScript : MonoBehaviour
    {
        private AnimationCurve curve;
    
        private void Start()
        {
            // 새로운 AnimationCurve 생성
            curve = new AnimationCurve();
    
            // 키프레임 추가 (시간, 값)
            curve.AddKey(0f, 0f);
            curve.AddKey(1f, 1f);
        }
    
        private void Update()
        {
            // 시간에 따라 값을 보간하여 출력
            float time = Time.time;
            float value = curve.Evaluate(time);
            Debug.Log("Time: " + time + ", Value: " + value);
        }
    }

    Evaluate : 특정 시간에 해당하는 값을 보간하여 반환한다.

    keys : 키프레임의 배열을 가져옵니다. 이를 통해 키프레임들을 추가, 수정, 삭제할 수 있다.

     

    AnimationCurve는 주로 애니메이션 시간에 따른 값을 정의하는데 사용되고

    특히 더 복잡한 애니메이션을 제어하기 위해서 사용되는 경우가 많다.

    예를 들어서 오브젝트의 움직임, 크기 조정, 회전 등에 대한 애니메이션을 정의하거나

    재미있는 게임 요소들에 활용할 수 있다.

    나 같은 경우는 이번에 게임 내의 해와 달의 회전을 조정하여 낮과 밤을 만드는데 사용했다.

Designed by Tistory.