-
[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는 주로 애니메이션 시간에 따른 값을 정의하는데 사용되고
특히 더 복잡한 애니메이션을 제어하기 위해서 사용되는 경우가 많다.
예를 들어서 오브젝트의 움직임, 크기 조정, 회전 등에 대한 애니메이션을 정의하거나
재미있는 게임 요소들에 활용할 수 있다.
나 같은 경우는 이번에 게임 내의 해와 달의 회전을 조정하여 낮과 밤을 만드는데 사용했다.
'개발일지 > 스파르타 코딩클럽 부트캠프' 카테고리의 다른 글
[TIL] 7주차 3일 개인과제주차 (0) 2024.05.29 [TIL] 7주차 2일 개인 프로젝트 주차 (Interface, 아이템 상호작용 ) (0) 2024.05.28 [TIL] 6주차 5일 유니티 숙련주차 시작, 개인 프로젝트 ( RayCast, SkyBox, ForceMode) (0) 2024.05.24 [TIL] 6주차 4일 팀 프로젝트 끝, 객체 지향 특강 ( SOLID 원칙 ) (0) 2024.05.23 [TIL] 6주차 3일 팀 프로젝트 마무리 단계, 랭킹 시스템 (2) 2024.05.22