이번주 수업에서는 Unity 창의 기본 구성 요소와 Component의 개념에 대해 배웠다.
Unity 창 기본 구성 요소
- 가운데 Scene
현재 Scene의 전경을 보여준다. 마우스 스크롤 휠을 통해 확대/축소해 볼 수 있다. 선택된 도구에 따라 오브젝트를 이동하거나 크기를 변경할 수 있다.
오브젝트 하나를 선택하고 단축키를 눌러 도구간 이동을 빠르고 쉽게 할 수 있다.
W: 위치 옮기기. 직접 움직여도 되고 Transform에서 Position 숫자를 직접 수정도 가능.
E: 회전
R: scale. 크기 조정
T: 2D RectTransform 조정 가능.
Y: 회전, 크기 조정 한 번에 가능.
- 왼쪽 Hierarchy
현재 Scene에 존재하는 모든 오브젝트를 보여준다. 카메라, Light, 큐브 등의 물건, UI 모두 포함한다.
- 아래 Project
현재 프로젝트를 구성하는 모든 material, prefab, scene, script 등을 담아두는 폴더를 보여준다.
- 아래 Console
프로젝트를 실행하면 실행에 따른 Debug.Log 내용이나 에러 메시지를 보여준다.
- 오른쪽 Inspector
오브젝트에 붙어있는 여러 component를 보여준다.
Inspector with components
Hierarchy 창에서 하나의 오브젝트를 클릭했을 때 그 오브젝터에 붙어 있는 component를 보여주고 설정할 수 있는 부분이 inspector 창이다.
오른쪽 상단 자물쇠 버튼을 눌러 잠금 설정을 해주면 설정이 실수로 변경되지 않게 고정할 수 있다.
Tag & Layer
주로 trigger를 만들 때 태그를 달아 CompareWithTag 등으로 특정 오브젝트가 들어왔을 때만 반응하도록 설정하는데 그 태그 이름을 정해줄 수 있는 부분이다.
Transform
물체의 위치, 회전 정도, 크기를 설정할 수 있다. 참고로 Unity에서 transfrom은 자동으로 gameObject의 모든 속성을 가지고, 모든 GameObject는 transfrom이라는 컴포넌트를 가지고 있다.
Mesh Renderer
물체가 보이게끔 하는 컴포넌트로 이 컴포넌트를 꺼버리면 오브젝트가 존재하는데 Scene에서 보이지 않는다.
Box Collider
주로 충돌체크를 할 때 달게 되는 컴포넌트. Is Trigger를 체크해 trigger로 만들 수 있다.
이 외에도... Rigidbody, Audio, Animation 등 부착할 수 있는 Component는 무수히 많다.
정리하자면 Component란 게임 내 물체, 오브젝트 각각에 붙는 속성, 특징이라 생각하면 될 것 같다.
Occlusion
Occlusion이란 카메라에 더 가까운 물체에 의해 가려진 오브젝트를 렌더링하지 않음으로써 GPU 리소스 사용을 줄이는 최적화 기법 중 하나이다.
Shading mode를 overdraw로 설정하면 물체가 얼마나 겹치는지를 파악할 수 있다. 색이 진할수록 오브젝트끼리 겹친다는 뜻. 앞 물체에 가려져서 안 보이는 부분은 사실상 렌더링 할 필요가 없다. 왜냐, 플레이어의 눈(카메라)에 안 보이니까!
다른 오브젝트를 가리는 큰 오브젝트를 Occluder, 완전히 가려져서 안 보이는 오브젝트를 Occludee로 설정해주면 된다. 오브젝트 클릭 후 해당 오브젝트의 Inspector 창에서 static 오른쪽 눌러 occluder인지, occludee인지 설정한다. 나중에는 코드로 크기 비교를 통해서 static occluder, occludee 넣거나 빼거나 할 수 있다는데 일단 지금은 수동으로...
occlusion 할지 말지 계산하는 것은 CPU 사용, 그래서 그림을 덜 그리는 것은 GPU의 효율 추구로 보면 된다.
Window - Rendering - Occlusion Culling을 누르면 오른쪽 Inspector 창 자리에 Occlusion 메뉴가 생긴다.
만약 오브젝트가 다른 오브젝트를 가리는지 아닌지 잘 설정했다면 이런 식으로 Occluder인지 Occludee인지 체크가 잘 나온다. 남에게 가려지기도 하면서 자기보다 더 작은 오브젝트를 가린다면 이런 식으로 Occluder, Occludee 2가지를 모두 체크할 수도 있다.
이후 옆 메뉴에서 Bake를 눌러주면 어떤 오브젝트를 렌더링하고, 가려진 오브젝트는 렌더링하지 않는다. 이후 Visualize를 누르면 이렇게 존재하는 오브젝트가
렌더링 되지 않는 것을 확인할 수 있다.
3D, 2D에서의 Rigidbody 차이
3D rigidbody
- kinematic 물리법칙 영향 받지 않음 // 충돌 처리 가능
- dynamic 물리법칙 영향 받음 // 충돌 처리 가능
2D rigidbody
- kinematic // 외부의 힘 (ex. AddForce)에 의해서 움직이지 않음. 자기 힘으로는 못 움직이고 오직 간접적인 힘으로만 움직임. transform.position.x 같은 것은 물리 엔진이 관리하는 것이 아니라 렌더링 부분. 따라서 2D 게임에서 움직이는 발판 같은 것은 kinematic으로 설정해두고, 위치를 옮길 수 있음.
- static // 3D에서의 kinematic. 간접적인 힘으로도 움직이지 않음. 땅 같은 것.
- dymatic // 직접 움직임
충돌 구현
충돌하려는 두 물체의 한쪽에는 Rigidbody가 있어야 하고 충돌하려는 둘 모두에 collider가 있어야 함.
capsule collider의 height가 0이면 sphere collider와 같음. 그래서 주로 capsule collider를 사용한다고.
collision: 2개의 물체가 충돌하면 서로의 영역을 침범하지 않음. 진짜로 부딪혔는지 확인하기 위해 사용. ex.당구 게임. 퍼즐 게임이나 어드벤처 게임에서 어떤 장애물이 길을 막고 있는 경우.
trigger: 2개의 물체가 충돌하면 하나가 다른 하나의 영역을 침범함.
특정 장소에 도달해야 하는 경우 트리거 사용. 보이지 않는 공간을 만들어 놓고 collider를 씌운 다음 IsTrigger를 켜 놓으면 다른 rigidbody가 들어왔을 때 해당 범위 안에 물체가 들어왔는지 아닌지 확인 가능.
OnCollisionEnter, Stay, Exit vs. OnTriggerEnter, Stay, Exit
public class FixedUpdateEx : MonoBehaviour
private void OnCollisionEnter(Collision collision)
{
//처음 붙었을 때
//contacts: 구와 큐브가 있다면 거의 한 점에서 만날 것
//사각형이면 여러 곳에서 만날 수 있음
//collision.transform.GetComponent<>(); 활용 가능
}
private void OnCollisionStay(Collision collision)
{
//붙어 있는 상태
}
private void OnCollisionExit(Collision collision)
{
//붙었다가 다시 떨어졌을 때
}
private void OnTriggerEnter(Collider other)
{
//하나가 다른 하나의 영역에 처음으로 들어왔을 때
}
private void OnTriggerStay(Collider other)
{
//하나가 다른 하나의 영역에 들어와서 머무를 때
}
private void OnTriggerExit(Collider other)
{
//하나가 다른 하나의 영역을 들어왔다 나갈 때
}
}
Rigidbody의 속성
Mass 질량
Drag 바람의 저항
Angular Drag 회전 저항
값이 커지면 회전이 잘 안 됨.
Interpolate vs. Extrapolate
Interpolate: 이전 프레임의 움직임 값을 참고해서 현재 움직임을 결정
Extrapolate: 다음 프레임의 움직임 값을 참고해서 현재 움직임을 결정
Collision Detection
continuous이면 컴퓨터에 부하가 가지만 프레임 당 충돌 체크 횟수를 늘려 충돌 체크를 더 잘 하게 함. 개발 하다보면 캐릭터가 벽을 뚫고 가는 경우가 많이 생김. Velocity가 너무 크면 deltaPosition이 너무 커져서, 이전 위치 대비 다음 위치가 벽 너머의 위치로 계산이 되어서 벽을 뚫고 지나갈 수 있음. 이런 경우에는 continuous로 설정하는 것이 도움이 됨. 움직이는 물체에 대해 충돌 검출이 자세하게 필요하다면 continuous를 사용할 수 있음.
Constraints
Freeze Position x, y, z 체크하면 각각 x, y, z 축 상의 위치가 움직이지 않음. 앞으로 달리기 게임을 할 때는 z축만 이동하면 되므로 x, y축을 잠그는 제한을 줄 수 있음.
Freeze Rotation 회전 제한. 좌우로 몸을 돌려 주변을 살피는 느낌을 주고 싶을 때 x, z 축 회전을 제한하는 방식으로 구현 가능.
위치, 회전 3개 축을 모두 고정하면 Kinematic과 같음.
Physics Material
Friction
Dynamic friction 움직일 때의 마찰력 ex. 공이 굴러갈 때. 숫자가 클수록 물건이 움직일 때 마찰력이 세게 작용.
Static friction 멈춰있을 때의 마찰력
Bounciness 탄성 계수.
숫자 클수록 더 잘 튐.
Friction Combine
굴러오던 공과 멈춰있는 공이 만났을 때, dynamic friction과 static friction을 어떻게 합쳐서 계산할 것인지 그 방식.
Average 평균 / Minimum 더 작은 것 / Multiply 곱하기 / Maximum 더 큰 것
이렇게 만든 Physics material을 Collider에 넣어주면 위의 값이 적용됨.
Joint
원래는 오브젝트 2개가 독립된 개체로 존재하지만, joint를 사용할 경우 2개의 물체가 상호작용하게끔, 짝으로 만들어줄 수 있다. Fixed Joint 컴포넌트를 Cube 같은 오브젝트에 추가하고 다른 연결할 오브젝트를 Connected Body 칸에 넣어주면 2개의 물체가 연결된다.
Break Force
힘에 의한 끊김. 특정 값을 넣으면 그 값 이상의 힘이 들어왔을 때 오브젝트 간 연결 깨짐. Infinity면 연결이 절대 안 끊어짐.
Break Torque
회전 값에 의한 끊김. 회전이 얼마 이상 되어야 물체의 연결을 끊을 것인지 그 값 정의.
다른 종류의 Joint
Hinge Joint 회전을 받으면 axis 기준으로 문 여닫기 가능하게 만들 수 있음.
Character Joint 같은 경우 3D 모델 등을 불러와서 팔과 몸의 연결 관계 같은 것을 설정해줄 수 있다고...
Mesh Collider
3D object (polygon) 받아와서 Mesh Collider를 달아주면 그 모양에 맞추어 충돌 범위 구현할 수 있음. Mesh collider는 Convex를 눌러야만 Is Trigger 옵션을 켤 수 있음.
Convex
육각형은 non convex, 안쪽으로 들어온 부분이 있는 경우 convex라 볼 수 있음. 그런데 이런 안쪽으로 들어온 부분은 그냥 없다고 생각하고 다각형처럼 생각하고 충돌 처리를 함. 이런 방식이 Convex Hull Algorithm 구멍 채우기 알고리즘. 그래서 convex 버튼을 눌러야만 바깥쪽 기준으로 collider 형성해주기 때문에 트리거로 설정이 가능한 것.
그런데 안쪽으로 파인 부분까지도 정확하게 충돌처리를 하고 싶음. 그렇다면 vertex(꼭짓점)을 이은 뒤, 콜라이더를 2개로 나눠서 2개의 collider로 구현함. 나중에 더 공부할 것.
Particle System
Graphic 작업이나 영화 작업할 때 많이 사용한다고 함. 게임 내 영상, footage 만들 때도 주로 사용. 불이 타닥 거리는 효과, 연기 올라가는 효과 등.
Particle System 생성 후 Inspector 창에서 원하는 설정을 건드리면 된다. 아직 많이 안 배워서 나중에 다시 정리할 것.
후기
Occlusion 같은 최적화 기법은 알아볼 생각도 하지 않았고, 존재하는지조차 몰랐던 개념이라 새롭고 재미있었다. 지금 당장은 Occlusion을 쓸 일이 없지만, 앞으로 메타버스를 만들 때 최적화를 위해서 사용하게 될 것 같다.
유데미코리아 바로가기 : https://bit.ly/3b8JGeD
본 포스팅은 유데미-웅진씽크빅 취업 부트캠프 유니티 1기 과정 후기로 작성되었습니다.
새로운 가능성의 시작, 유데미 x 웅진씽크빅
글로벌 최신 IT 기술과 실무 교육을 입문부터 심화까지! 프로그래밍, 인공지능, 데이터, 마케팅, 디자인 등 세계 최고의 강의를 경험하세요.
www.udemykorea.com
댓글