유니티 숙련주차 강의 듣기 (1-3 ~ 1-9)
그나저나 출석체크 페이지 보니까 30일차던데 왜 내 TIL은 29일차를 가리키고 있는가? 뭐 하나 빼묵은건가... 아무튼 이제 3분의 1만큼 했다. 시간이 빠르다... 금방 더워질 것 같던데 오늘도 화테엥
체력이 닳는다던가, 스태미나가 닳는다던가, 스킬을 썼을 때 쿨타임이 얼마나 남았는가 등을 표시할때 봤던 기능인 Filled에 대해 설명해보겠다.

Type → Filled
Image Type을 simple에서 Filled로 바꾼다.
Fill Method
Fill Origin
Horizontal에서 Left를 선택하면 왼쪽에서 오른쪽으로 차게 할 수 있다.Radial360의 경우 0~3 중 하나를 골라 시계 방향으로 어느 지점부터 채울지 결정할 수 있다.실제 사용 예시
public Image uiBar;
void UpdateHP(float current, float max) {
uiBar.fillAmount = current / max; // 0.0 ~ 1.0 사이 값
}
이렇게 fillAmount를 사용하면 된다. 추가로,
public void Add(float amount)
{
//만약 현재 체력이 90이고 20만큼 회복이 온다면 110이 되는데 maxValue는 100이므로 작은 값은 100으로 표시
curValue = Mathf.Min(curValue + amount, maxValue);
}
체력 회복 기능 등을 구현할 때 이 Mathf.Min or Max를 사용하면 유용할 것이다.
TryGetComponent<T> 사용법보통 나는 GetComponent를 많이 썼는데 이번 강의에서는 TryGetComponent에 대해 설명하길래 '왜 잘쓰던거 냅두고 저걸쓰지?'라는 궁금증이 생겨서 인터넷을 찾아보았다.
GetComponent는 컴포넌트를 가져오고 만약 없으면 null을 반환한다. 호출 시마다 내부에서 찾기 연산을 수행한다. 그래서 보통 Awake에서 많이 쓴다.
TryGetComponent<T>(out T comp)는 컴포넌트를 찾으면 comp에 할당하고 true를반환하던가 없으면 false를 반환하다. Update나 물리 콜백처럼 매 프레임 빈번하게 컴포넌트를 조회해야 할때나 '이 오브젝트에 컴포넌트가 붙어 있으면 추가 로직을 수행해라'와같은 처리에 사용된다.
<T>: 제네릭 타입 파라미터로, 찾고자 하는 컴포넌트 타입을 지정한다.
반환값: bool (컴포넌트를 찾으면 true, 못 찾으면 false)
out T comp: 찾은 컴포넌트를 할당해 주는 출력 파라미터
TryGetComponent<T>(out T comp)
if (gameObject.TryGetComponent<Rigidbody>(out var rb)) {
rb.AddForce(...);
}
if 분기 안에서 사용 가능Coroutine은 IEnumerator를 이용해 프레임 사이 또는 시간 간격으로 코드를 분할 실행할 수 있는 기능이다.
일정 시간 간격을 두고 반복 실행이 필요할때(예시 : 3초마다 적 스폰)나 페이드 아웃처럼 프레임 단위로 값을 조금씩 변경하며 처리할 때, '어떤 조건이 될때까지 대기'와 같이 일시 중단 로직 등이 필요할 때 사용한다.
메인 스레드 차단 없이 대기하고, 타이밍 제어를 하기 용이하다는 장점이 있지만 과도한 사용시 부담된다는 단점이 있다.
IEnumerator FadeOut() {
float t = 1f;
while (t > 0f) {
t -= Time.deltaTime;
canvasGroup.alpha = t;
yield return null; // 한 프레임 대기
}
}
// 호출
StartCoroutine(FadeOut());
yield return 종류 null → 다음 프레임 new WaitForSeconds(2f) → 지정 시간 뒤 new WaitUntil(() => 조건) → 조건 만족 시 new WaitForEndOfFrame() → 현재 프레임 렌더 후이 부분은 내가 꽤 궁금해 했던 부분인데 오늘 배워서 좋았다. 조금 상세하게 다뤄볼까 한다.
[Range(0.0f, 1.0f)]
public float time; // 0~1 사이의 “하루 진행률” (0.5가 정오)
public float fullDayLength; // 하루가 실제로 흐르는 시간(초)
public float startTime = 0.4f; // 게임 시작 시점의 진행률
private float timeRate; // 초당 진행률 증가량
public Vector3 noon;//정오. vector가 90 0 0
time : 0.0~1.0까지 변하는 하루 진행률이다.fullDaylength : 몇 초를 하루로 볼 지 정한다.noon : 정오에 해당하는 광원의 euler각도이다. 예를 들어 (90, 0, 0)라면 정오에 빛이 수직에서 쏟아진다. private void Update()
{
time = (time + timeRate * Time.deltaTime) % 1.0f;
UpdateLighting(sun, sunColor, sunIntensity);
UpdateLighting(moon, moonColor, moonIntensity);
RenderSettings.ambientIntensity = lightingIntensityMultiplier.Evaluate(time);
RenderSettings.reflectionIntensity = reflectionIntensityMultiplier.Evaluate(time);
}
% 1.0f로 하루를 한바퀴 돌면 0으로 돌아가게 한다.Updatelighting호출로 개별 광연을 제어한다.(태양, 달)ambient, reflection강도를 AnimationCurve로 적용한다. void UpdateLighting(Light lightSource, Gradient colorGradiant, AnimationCurve intensityCurve)
{
float intensity = intensityCurve.Evaluate(time);//보간
lightSource.transform.eulerAngles = (time - (lightSource == sun ? 0.25f : 0.75f)) * noon * 4.0f;
lightSource.color = colorGradiant.Evaluate(time);
lightSource.intensity = intensity;
GameObject go = lightSource.gameObject;
if (lightSource.intensity == 0 && go.activeInHierarchy)
go.SetActive(false);
else if (lightSource.intensity > 0 && !go.activeInHierarchy)
go.SetActive(true);
}
Gradient : 시간대별 색상을 에디터에서 그려놓을 수 있다.AnimationCurve : 시간대별로 에디터에서 키프레임을 찍고, 커브를 조절할 수 있는 값 변화 곡선이다.noon * 4.0f : 90도 기준 정오각을 4배로 뻥튀기시켜 하루 360도 회전 수치를 얻는다. 
이렇게 하면 태양은 6시(0.25)부터 떠올라 정오(0.5)에 수직, 오후 6시(0.75)에 지고 달은 그 반대 타이밍에 등장하고 사라지는 하루 사이클이 구현된다.
저녁먹고 나서는 TIL을 쓰느라 시간을 다 보내는 것 같다. TIL을 쓸 때 시간을 너무 많이 쓰지 말라지만 나에게는 중요한 시간이다. 왜 공부할때 노트 필기하면서 공부하지 않았던가? 딱 그런느낌이다 단순히 오늘 간단하게 이거이거 배웠다~가 아닌 노트 필기의 느낌? 기록해두지 않으면 분명 잊어버릴 것이기에 강의에서 들은 것 외 정보도 모아서 적어두려하는 편이다. 하지만 내 mbti j. 이렇게 시간을 많이 써도 개인과제 일정에는 차질이 없을 것이다.
내일은 오늘 강의를 이어서 마저 들을 예정이다. 속도가 느리긴 하지만 많이 들을 수 있도록 노력해보려한다.