6 minute read

참고 링크들 북마크에 정리



씬 뷰에서 이동 시 빠르게 이동하는 법

Shift 를 누르면 빠르게 움직인다.


게임 오브젝트 스냅핑

Vertex Snapping (오브젝트 점끼리 붙이기)
단축키 : V 누르고 이동

Surface Snapping (오브젝트 표면에 붙이기)
단축키 : Ctrl + Shitf 누르고 이동


Collider 의 중심과 크기

에디터에서 Collider 의 중심과 크기는 게임 오브젝트의 중심과 크기를 기준으로 한다.

다만, 스크립트에서는 주의가 필요하다.
bounds는 항상 실제 크기와 Scale을 기준으로 한다.

Collider col = GetComponent<Collider>();
col.bounds // 게임 오브젝트의 중심과 Scale, Collider의 Center를 모두 고려한 값
col.bounds.extents // Collider 실제 크기의 절반
col.bounds.center // 월드 좌표계 기준 Collider 의 실제 중심 위치
col.bounds.size // Collider 의 실제 크기

BoxCollider bcol = GetComponent<BoxCollider>();
bcol.bounds // 게임 오브젝트의 중심과 Scale, Collider의 Center를 모두 고려한 값
bcol.extents // 에디터 상 size의 절반
bcol.center // 에디터 상에 설정된 값과 동일
bcol.size // 에디터 상에 설정된 값과 동일

// Capsule Collider 의 Direction (X, Y, Z)
해당 축을 기준으로 Radius, Height 가 설정되며, 변경하면 회전한 것처럼 보인다.
Center 에는 영향을 미치지 않는다.

- 참고
https://yoon735.tistory.com/entry/UnityB005%EC%9C%A0%EB%8B%88%ED%8B%B0-%EA%B8%B0%EC%B4%88-%EC%BB%AC%EB%9D%BC%EC%9D%B4%EB%8D%94
https://nforbidden-fruit.tistory.com/41


유니티의 거리 단위

유니티의 1 Unit = 1 m 이다.


유니티의 좌표계

월드 좌표계 (게임 공간)
=> 뷰포트 (0~1, 카메라 화면 전체, UI 등)
=> 스크린 (픽셀, 플레이 화면 크기, 마우스 입력 등)

// 화면 크기 가져오기
Screen.height  // 세로
Screen.width   // 가로

Windows API 를 공부할 때는 분명 좌측 상단이 (0, 0)이었던 것 같은데,
유니티는 좌측 하단이 (0, 0)이라고 한다.

transform 은 좌표계의 변환을 의미한다.

Vector3 mp = Input.mousePosition;

// 스크린 => 뷰포트
Vector3 scrToVw = Camera.main.ScreenToViewportPoint(mp);

// 스크린 => 월드
// 마우스 위치는 스크린 포인트 좌표계에서의 위치이므로 x, y 만 존재한다.
// ScreenToWorldPoint 인자의 z는 카메라 중심으로부터의 거리를 나타내는데,
// z값을 넣어주지 않아 0이 되면, 항상 카메라 위치와 동일한 위치가 된다.
// 스크린 포인트 좌표계를 월드 좌표계로 바꾸고 카메라로부터의 거리는 1 unit 으로 한다.
Vector3 scrToWrd = Camera.main.ScreenToWorldPoint(mp + Vector3.forward);

// Camera.main 은 메인 카메라의 Camera 컴포넌트이다.
Camera Camera.main

// 뷰포트 => 스크린
Camera.main.ViewportToScreenPoint(scrToVw);

// 뷰포트 => 월드
// 뷰포트 좌표계도 x, y 만 존재하기 때문에 ScreenToWorldPoint 와 비슷한 처리가 필요하다.
Vector3 vwToWrd = Camera.main.ViewportToWorldPoint(scrToVw + Vector3.forward);

// 월드 => 스크린
Camera.main.WorldToScreenPoint(scrToWrd);

// 월드 => 뷰포트
Camera.main.WorldToViewportPoint(vwToWrd);

- 참고
https://devkoboso.com/entry/Unity-%ED%99%94%EB%A9%B4%ED%81%AC%EA%B8%B0-%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0
https://forum.unity.com/threads/gameobject-getcomponent-vs-getcomponent.948035/
https://docs.unity3d.com/ScriptReference/MonoBehaviour.html
https://github.com/Unity-Technologies/UnityCsReference/blob/2022.2/Runtime/Export/Scripting/Component.bindings.cs
https://answers.unity.com/questions/1360282/what-is-the-difference-between-gameobjectgetcompon.html
https://pleasantstep.tistory.com/16
https://202psj.tistory.com/1287
https://fiftiesstudy.tistory.com/254
https://gamedev.stackexchange.com/questions/158815/why-is-screentoworldpoint-always-giving-same-coordinates-with-mouse-position
https://forum.unity.com/threads/resolved-camera-main-screentoworldpoint-always-returns-the-position-of-the-camera.793167/


C# 에서 클래스 용어들

C++ 기준
필드 = 멤버 변수
메서드 = 멤버 함수

프로퍼티 = private 변수를 Get, Set 할 때 조건으로 값을 제어할 필요가 있을 때 사용


카메라의 속성들

Background : 스카이 박스가 없을 경우 이 색상으로 여백이 채워진다.

Culling Mask : 체크가 해제된 레이어는 게임 뷰에서 보이지 않는다.

Projection
- Perspective : 원근이 존재 (멀수록 작고, 가까울수록 크다)
- Orthographic : 원근에 상관 없이 크기를 표현한다. (Size는 세로의 절반)

Clipping Planes
- Near : 이 거리부터 보여진다.
- Far : 이 거리를 넘어서는 부분은 보이지 않는다.

Field of View (FOV) : 카메라 뷰의 각도를 나타낸다.
값이 작을수록 뷰포트로 만들어지는 피라미드가 좁아진다고 생각하면 되고, 줌을 땡긴 것과 같은 효과를 낸다.
값이 클수록, 피라미드가 넓어지며, 넓은 영역을 뷰포트에 표현해야하기 때문에 볼록 렌즈와 비슷한 효과를 낸다.

FOV Axis : FOV 값을 Horizontal 기준으로 할지, Vertical 기준으로 할 지 정한다.

Physical Camera : 실사 느낌이 나도록하는데 사용된다는데, 무엇을 하는지는 잘 모르겠다.

Viewport Rect (뷰포트가 보여지는 영역을 조절한다.)
X, Y : 뷰포트가 표시되는 오프셋이다. (1은 가로, 세로 길이와 같다.)
W, H : 카메라의 출력 너비와 높이이다. (1은 가로, 세로 길이와 같다.)
화면에 표시되는 부분이 없으면 오류가 출력되며, X/Y/W/H/ 를 각각 -1/-1/2/2 로 설정해도 정상적으로 보이긴 한다.

- 참고
https://twinbraid.blogspot.com/2015/02/blog-post_26.html
https://pleasantstep.tistory.com/16
https://docs.unity3d.com/kr/2019.4/Manual/class-Camera.html
https://notyu.tistory.com/39


Audio Source 속성들

Mute : 음소거

Play On Awake : Awake() 시 (보통은 시작과 동시에) 재생할지

Loop : 연속 재생

Volume (0 ~ 1) : 상대 볼륨 조절

// 스크립트에서 제어
AudioSource as = GetComponent<AudioSource>();
as.Play();
as.Stop();

- 참고
https://docs.unity3d.com/kr/2020.3/Manual/class-AudioSource.html


Time.deltaTime 의 의미와 사용 이유

Time.deltaTime 을 곱해주는 것은 모든 시스템에서 실행을 동기화 하기 위함이다.
30fps 인 시스템에서는 한 프레임이 1/30초가 걸리고, 60fps 인 시스템에서는 1/60초가 걸리는데

둘 다 동일하게 1초 동안 speed 만큼 direction 방향으로 이동할 수 있게 해준다.
1초 동안 Time.deltaTime 의 값을 누적하면 항상 1이 되기 때문이다.

transform.position += direction * speed * Time.deltaTime;

// 시간 배속 조절하기
Time.timeScale = 0f; (멈춤)
Time.timeScale = 2f; (2배속)

- 참고
https://bluemeta.tistory.com/1


Quad 와 Plane

Quad 는 2개의 폴리곤으로 이루어진 반면, Plane은 여러 개의 폴리곤으로 이루어져 있다.
Quad 가 더 경제적이다.

둘 모두 백-페이스 컬링이 적용되어 후면은 렌더링하지 않아 보이지 않는다.

- 참고
https://m.blog.naver.com/wowsoft72/221049597965


Input Manager 의 속성들

Axes - Size 사용할 입력축의 개수

Name : Input.GetAxis(string), Input.GetButtonDown(string) 에 쓰이는 이름

Positive Button : 이 버튼이 눌리면 양수가 반환된다.

Negative Button : 이 버튼이 눌리면 음수가 반환된다.

Gravity : 아무것도 누르지 않을 때 중심으로 돌아가는 속도 (unit/s)
값이 높을수록 빨리 0이 되고, 낮을수록 천천히 0이 된다.
Gravity 가 0이라면 값이 감소하지 않으므로 캐릭터는 키를 떼어도 계속 이동하게 된다.

Dead : 조이스틱 등 아날로그 입력에서 절댓값이 이 값 미만이면 0

Sensitivity (-1 혹은 1 에 얼마나 빨리 도달할지)
키보드 : 값이 높으면 응답 시간이 빨라지고 낮으면 더 매끄러워진다.
마우스 : 실제 마우스의 delta 가 Scale 된다.

Snap : 반대 키를 누르면 즉시 중심으로 리셋 됨

Invert : 키 입력을 반전 (키 입력이 바뀌는 아이템 등에 적용)

- 참고
https://docs.unity3d.com/kr/530/Manual/class-InputManager.html
https://hvstudy.tistory.com/5
https://ikaros79.tistory.com/entry/Input-Manager-%ED%82%A4%EB%B3%B4%EB%93%9C-%EC%9E%85%EB%A0%A5-%EB%A7%88%EC%9A%B0%EC%8A%A4-%ED%81%B4%EB%A6%AD-%EC%A1%B0%EC%9D%B4%EC%8A%A4%ED%8B%B1-%EB%93%B1
https://m.blog.naver.com/stizms/220220482356


Physics 의 속성들

Gravity : Rigidbody 에 Use Gravity 를 켜면 적용되는 중력의 크기 (unit/s^2)

Bounce Threshold : 상대 속도가 이 값 미만인 두 충돌하는 오브젝트는 튕기지 않는다.

- 참고
https://docs.unity3d.com/kr/530/Manual/class-PhysicsManager.html


Rigidbody 의 옵션들

Mass : 질량 (kg, g 단위가 아니라 상대적인 크기이다.)
무게가 아니기 때문에 크다고 해서 다른 오브젝트보다 빨리 떨어지지는 않는다.

Drag : 이동할 때의 마찰 계수

Angular Drag : 회전할 때의 마찰 계수

Use Gravity : 중력 적용 여부

Is Kinematic : 모든 물리 작용을 하지 않는다.

Interpolate : 물리 작용으로 인한 움직임이 끊어질 때 보간해준다.
- Interpolate : 이전 프레임의 Transform에 맞춰 처리한다.
- Extrapolate : 다음 프레임의 Transform을 추정해 처리한다.

Collision Detection : 아주 빠른 물체의 충돌을 놓치지 않기 위한 옵션
정밀도 Discrete < Continuous < Continuous Dynamic

Constraints (축을 고정)
// 해당 축으로의 물리적 작용을 받지 않는다.
// 2D 게임에서 Z 축을 고정 등
- Freeze Position (X, Y, Z) : 해당 축의 이동을 막는다.
- Freeze Rotation (X, Y, Z) : 해당 축의 회전을 막는다.

// 내 기준 앞으로 10만큼 힘 작용하기
// 우주에서 물건을 던진 것처럼 해당 방향으로 등속운동 한다.
GetComponent<Rigidbody>().AddForce(transform.forward * 10f, ForceMode.Impulse);

- 참고
https://dlgnlfus.tistory.com/63


Character Controller 의 옵션들

Slope Limit : 올라갈 수 있는 경사

Step Offset : 올라갈 수 있는 높이 (계단 등)

Skin Width : 충돌 시 쿠션 두께 (양 쪽을 합한 값이다.)
피부라고 생각하면 되고, 충돌하면 이 값만큼 겹쳐진다.

Min Move Distance : 이동할 수 있는 최소 거리

Height : 게임 오브젝트에 상대적인 높이이다.
(scale.y * Height 가 실제 높이이다.)

Radius : 게임 오브젝트에 상대적인 반지름이다.
(scale.x * Radius * 2 가 실제 너비이다.)

Center : Collider 와 마찬가지로 게임 오브젝트의 실제 크기와 중심을 기준으로 정해지는 중심 좌표이다.

Move() 함수로 이동하면 충돌 시 물체를 통과하여 지나가지 않게 된다.

- 참고
https://docs.unity3d.com/kr/530/ScriptReference/CharacterController.html


Input 클래스

// -1 ~ 1 사이의 값을 반환한다.
// 주로 이동에 사용
float Input.GetAxis(string);

// -1, 0, 1 중 하나를 즉시 반환한다.
// 주로 즉시 반응이 필요한 스킬 등에 사용
float Input.GetAxisRaw(string);

// true, false 를 반환한다.
// Axis 와 다르게 값이 아닌 눌린 여부만 알 수 있다.
bool Input.GetKey(string);
bool Input.GetButton(string);

// 마우스 휠 처리
float delta = Input.GetAxis("Mouse ScrollWheel");
delta = Input.mouseScrollDelta.y;

- 참고
https://onecoke.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-GetAxis%EC%99%80-GetAxisRaw
https://seongju0007.tistory.com/26
https://wergia.tistory.com/117


자주 사용하는 Input 들

// 플레이어 기준 좌우 회전은 Y축 회전이므로, Y에 값을 넣어주어야 한다.
"Mouse X" : 마우스 좌우 이동
// 플레이어 기준 상하 회전은 X축 회전이므로, X에 값을 넣어주어야 한다.
// 또, X축 회전은 값이 커질수록 아래로 회전하기 때문에 부호를 반대로 넣어주어야 한다.
"Mouse Y" : 마우스 상하 이동

rx += Input.GetAxis("Mouse Y") * speed * Time.deltaTime;
ry += Input.GetAxis("Mouse X") * speed * Time.deltaTime;

// -80도 ~ 80도 클램핑
// 유니티는 각도가 음수가 되면 자동으로 360 - 값으로 변환하기 때문에 주의해야 한다.
rx = Mathf.Clamp(rx, -80f, 80f);

transform.eulerAngles = new Vector3(-rx, ry, 0);

"Mouse ScrollWheel" : 마우스 스크롤 (한 틱은 0.1)

"Horizontal" : 키보드 좌우 입력
"Vertical" : 키보드 상하 입력

"Fire1" : 마우스 좌클릭 / 좌측 Ctrl

KeyCode.키 : 키보드 입력


KeyCode.Alpha숫자 : 숫자 입력


OnMouse 콜백 함수들

// 게임 오브젝트에 마우스가 들어왔을 때
private void OnMouseEnter()

// 게임 오브젝트에 마우스를 Hover 하고있을 때
private void OnMouseOver()

// 게임 오브젝트에서 마우스가 나갔을 때
private void OnMouseExit()

// 게임 오브젝트를 마우스로 눌렀을 때
private void OnMouseDown()

// 게임 오브젝트에서 마우스를 땠을 때
private void OnMouseUp()

// 게임 오브젝트에서 마우스를 누르고 움직일 때
private void OnMouseDrag()

- 참고
https://blog.daum.net/arkofna/18283276
https://godnr149.tistory.com/122

Categories:

Updated: