| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
- navisworks api
- Unity
- 최단거리 알고리즘
- 행동트리
- unity korea
- sparkmain(clone) 무한생성
- readonly
- 너비탐색
- 최소신장트리 mst
- 오블완
- articulation body
- GetComponent
- 습관형성 #직장인자기계발 #오공완
- dropdown
- 깊이탐색
- 티스토리챌린지
- raycast
- unity sparkmain(clone)
- 드롭다운
- 디지털트윈
- 유니티
- 트리구조
- removeAll
- 유니티 sparkmain(clone)
- C#
- Simulation
- list clear
- sparkmain(clone)
- 크루스칼
- dfs
- Today
- Total
목록분류 전체보기 (188)
낑깡의 게임 프로그래밍 도전기
물체선택하기 : 마우스 왼쪽 클릭물체 여러개 선택 : Shift + 물체 클릭 / 드래그물체 전체 선택 : A물체 전체 선택 해제 : A두번 / Alt+A / 허공 클릭\메뉴보기 : 마우스 오른쪽 클물체 삭제 : 물체 선택 후 마우스 우클릭 + 메뉴에서 Delete / X / Delete실행취소 : Ctrl+Z실행취소를 취소 : Ctrl+Shift+z화면돌리기 : 마우스 휠 누르고 드래그화면 확대 축소 : 마우스 휠 굴리기화면 이동 : 마우스 휠+Shoft+드래View pie manu : ~물체 생성 창(add) : Shift+A선택 물체 바로 보기 : ~+View Selected, 숫자패드 .전체 물체보기 : Home선택물체만 보기 : / (다시 돌리기 : /)물체 복사하기 : 메뉴>Duplicate ..
오늘은 유니티에서 카메라 쉐이크(Camera Shake) 효과를 구현하는 방법을 배웠다. 단순히 화면을 흔드는 것 같지만, 실제로는 연출의 몰입감을 크게 높여주는 중요한 기술이라는 걸 느꼈다. 폭발이 터질 때, 총을 발사할 때, 혹은 강한 충돌이 일어날 때 카메라가 순간적으로 흔들리면 플레이어는 훨씬 더 현실적인 타격감을 느낄 수 있다. 랜덤을 활용한 흔들림 카메라 쉐이크의 기본은 랜덤(Random) 값을 이용해 카메라의 위치나 회전을 짧게 흔드는 것이다. 단순히 좌표를 일정하게 흔드는 것보다, 매 프레임마다 조금씩 다른 랜덤 값을 주면 더 자연스럽고 예측 불가능한 진동이 만들어진다. 이때 중요한 건 흔들림의 강도와 지속 시간을 적절히 조절하는 것인데, 너무 크면 화면이 불안정해지고, 너무 약하면 효과..
오늘은 유니티 네브메쉬(NavMesh) 에 대해 배우는 시간이 있었다. 네브메쉬는 단순히 "AI가 걸어다니는 길"을 만드는 도구가 아니라, 게임 속 공간을 탐색 가능한 영역과 그렇지 않은 영역으로 나누는 지능적 시스템이라는 걸 느꼈다. 평평한 바닥은 물론이고, 경사면이나 계단 같은 지형 조건도 설정값에 따라 통행 가능 여부가 달라지는데, 이게 단순히 숫자 슬라이더 조정이 아니라 게임 플레이의 체감을 직접적으로 바꾸는 핵심 요소였다. 예를 들어 경사 허용 각도를 조금만 높여도 캐릭터가 원래 못 올라가던 비탈길을 오르게 되고, 계단 높이를 조정하면 작은 턱은 자연스럽게 넘어가지만 큰 단차는 차단된다. 단순한 옵션처럼 보이지만, 사실상 레벨 디자인과 캐릭터 이동의 룰을 결정짓는 중요한 기준이었다. 또 하나 ..
오늘은 FPS 움직임에 대해 배웠다. 단순히 캐릭터를 이동시키는 것을 넘어서, 마우스로 카메라를 움직이며 고개가 돌아가는 방식을 구현하는 법을 직접 경험했다. 마우스 좌우 움직임에 따라 캐릭터 본체가 회전하고, 위아래 움직임에 따라 시점이 상하로 변하는데, 실제 게임을 플레이할 때 가장 직관적인 조작 방식이라 이해하면서도 꽤 재미있었다. 흥미로웠던 점은 마우스 위아래 입력이 직관적으로 반대로 들어간다는 것이었다. 즉, 마우스를 위로 올리면 고개는 아래로 내려가고, 마우스를 아래로 내리면 고개는 위로 올라갔다. 그래서 이 부분은 입력 값을 반대로 처리해줘야 자연스러운 시점 움직임이 되었는데, 이 단순한 ‘축 반전’ 하나로 조작감이 완전히 달라진다는 게 인상 깊었다. 또 머리를 너무 많이 젖히거나 숙이지 ..
오늘은 로컬 좌표계와 글로벌 좌표계에 대해 배웠다. 처음엔 단순히 위치 값이라고만 생각했는데, 오브젝트가 어떤 기준점을 따르느냐에 따라 같은 Vector3 값이라도 전혀 다른 결과가 나온다는 걸 알게 되었다. 글로벌 좌표계는 씬 전체의 기준, 즉 월드 원점을 기준으로 한 좌표라서 항상 같은 방향과 크기를 유지했다. 반면 로컬 좌표계는 각 오브젝트가 가진 회전과 위치를 기준으로 새롭게 정의된 좌표라서, 부모의 영향도 같이 받았다. 예를 들어 어떤 캐릭터의 오른쪽으로 이동한다는 건 단순히 글로벌 X축이 아니라, 캐릭터가 바라보고 있는 방향을 기준으로 한 로컬 X축 이동이 되는 것이었다. 그래서 로컬 좌표계를 잘 이해하면 "오브젝트 기준"으로 동작하게 만들 수 있었고, 글로벌 좌표계를 이해하면 "세계 기준"으..
오늘은 단순히 프레임마다 움직이는 것 이상으로, 시간을 정해서 정확히 흐름을 제어할 수 있는 코루틴에 대해 배웠다. 코루틴은 스레드가 아니라 메인 스레드에서 프레임 사이를 가로지르며 이어서 실행되는 함수였고, 덕분에 “어느 정도 기다렸다가 이걸 하고, 다시 기다린 뒤 저걸 한다” 같은 시간 순서의 연출을 코드로 자연스럽게 적을 수 있었다. StartCoroutine으로 시작하면 첫 번째 yield 지점까지 실행된 뒤 멈췄다가, 조건이 충족되거나 지정한 시간이 지나면 다음 줄부터 다시 이어서 실행되었다. update에 타이머를 두고 if로 분기하는 방식보다 읽기 쉬웠고, 컷신이나 단계적인 UI 연출, 스폰 간격 제어, 페이드 인/아웃처럼 순차 진행이 중요한 로직에 특히 어울렸다. Start를 IEnumer..
이 번 주제는 오브젝트를 선형보간(Linear Interpolation, Lerp) 으로 움직이는 방법이었다. 겉보기엔 단순히 “A에서 B로 부드럽게 이동”이지만, 사실 핵심은 P(t) = (1 - t) * A + t * B라는 단순한 수학식 안에 있다. 여기서 중요한 건 t 값(0~1)을 어떻게 관리하느냐이다. t가 0이면 시작 위치, 1이면 목표 위치이며, 그 사이 값은 중간 지점이다. Vector3.Lerp(current, target, Time.deltaTime * speed)처럼 매 프레임 호출하면 시작점이 계속 갱신되어 목표에 무한히 수렴하는 ‘따라가기’ 느낌이 나고, 정해진 시간 안에 딱 도착하는 구조는 되지 않는다. 반면 t를 elapsedTime / duration 형태로 누적·정규화하면..
오늘은 유니티에서 트랜스폼(Transform) 조작과 레이캐스트(Raycast), 그리고 태그·레이어 마스크에 대해 배웠다. 오브젝트의 위치를 바꿀 때는 transform.position +=처럼 덧셈을 사용해 좌표를 더하는 방식으로 이동하고, 회전할 때는 transform.rotation *=처럼 곱셈을 사용해 기존 회전에 새로운 회전을 누적하는 방식을 쓴다는 점이 흥미로웠다. 이동과 회전이 이렇게 다른 수학 연산을 사용하는 이유는, 회전 값이 단순한 숫자가 아니라 방향과 각도를 함께 포함하는 쿼터니언(Quaternion) 구조이기 때문이다. 이 원리를 알게 되니, 회전을 코드로 제어할 때 왜 곱셈 순서나 회전 축 지정이 중요한지도 이해가 됐다. 레이캐스트는 화면이나 씬 속에서 ‘이 방향으로 쏜 보이..
오늘은 유니티에서 입력 처리와 좌표 변환, 그리고 오브젝트 이동 로직에 대해 배웠다. 단순히 키를 눌러 움직이는 것처럼 보이는 기능도 내부적으로는 트랜스폼(Transform)과 벡터(Vector)를 활용한 좌표 연산으로 이루어진다는 점이 흥미로웠다. 예를 들어, transform.Translate()나 transform.position += Vector3 같은 방식으로 오브젝트의 위치를 변경하면, 코드 한 줄로도 씬 속 객체를 자유롭게 이동시킬 수 있다. 하지만 여기서 중요한 건 ‘얼마나 부드럽게’ 움직이느냐였다. 강사님은 이동 코드를 작성할 때 Time.deltaTime을 곱하는 습관을 강조하셨다. Update() 메서드는 매 프레임마다 실행되지만, 프레임 속도는 컴퓨터 성능이나 게임 상황에 따라 달..
오늘은 유니티에서의 충돌 판정에 대한 강의를 들었다. 충돌 판정은 단순히 “부딪혔다/안 부딪혔다”를 확인하는 기능이 아니라, 게임에서 물리적인 사실감을 결정짓는 핵심 요소다. 이를 위해 Rigidbody와 Collider의 존재가 필수적인데, Rigidbody는 오브젝트에 물리 연산을 적용해 중력이나 힘에 반응하게 만들고, Collider는 눈에 보이지 않는 경계선을 만들어 충돌 영역을 정의한다. 이 두 가지가 모두 있어야 물리적으로 자연스러운 충돌이 가능하다. 다만, 단순 영역 감지나 트리거 이벤트만 필요하다면 Rigidbody 없이 Collider만 두는 것도 가능하다. 여기에 Constraints(프리즌) 기능을 활용하면 특정 축의 움직임이나 회전을 고정해, 불필요한 물리 변화를 방지할 수 있다. ..