1. 장애물이 없는 환경에서 오브젝트 이동
- Transform Component : GameObject의 위치를 제어하는 Component
2) GetKey() Method, GetAxisRaw() Method를 이용한 이동 방향 제어
transform.position = ..
라는 코드에서
transform
은 script를 component로 가지고 있는 GameObject의 Transform Component를 나타낸다.
.position
은 Transform Component의 Position 변수를 나타낸다.
즉, Script에서 자신이 소속된 GameObject의 Transform Component에 접근 할 때는 transform으로 접근 가능하다
위치 설정 : transform.posiont = 수식
위치 정보 사용 : Debug.Log(transform.position);
- Vector3 구조체 : Game의 2D/3D 공간에서 이동, 회전, 크기를 표현하기 위해 죄표 체계를 나타내는 단위
- 2차원 : Vector2, 3차원 Vector3, 정수 Vector2Int, 실수 Vector3Int로 구조체가 정의 되어 있음
- 구조체 내부에는 연산을 위한 property, Method가 정의
- Time.deltaTime : 업데이터 사이의 시간
- Input Class : Unity에서 제공하는 입력과 관련된 모든 Method가 정의되어 있는 Class
- GetKey Method : 키보드 키 입력 여부 확인 Method
- KeyCode 열거형에 정의되어 있는 상수 또는 문자열(string)을 매개변수로 사용
- 반환되는 값은 조건만족(True), 조건 불만족(False)
- 상황에 따른 키 입력 여부
- GetKeyDown() : 매개변수와 동일한 키를 누르는 순간 1회 True 반환
- bool result = Input.GetKeyDown(KeyCode key);
- bool result = Input.GetKeyDown(string key);
- GetKey() : 매개변수와 동일한 키를 누르고 있는 동안 매 Frame True 반환
- bool result = Input.GetKey(KeyCode key);
- bool result = Input.GetKey(string key);
- GetKeyUp() : 매개변수와 동일한 키를 떼는 순간 1회 True 반환
- bool result = Input.GetKeyUp(KeyCode key);
- bool result = Input.GetKeyUp(string key);
Tip)
[+=]
사용 시 대각선 방향으로도 이동 가능(누른 키 값이 중첩되기 때문)
[=]
사용 시 대각선 방향으로 이동 불가
- InputManager : 단축키 시스템
- 장점 : 1~4개의 키를 한 세트로 묶어 검사 가능
- 키보드, 마우스, 외부 컨트롤러 모두에 설정 가능
- 동일한 이름의 단축키 생성 가능
- 조작 인터페이스가 바뀌더라도 코드를 수정하지 않고 적용 가능
- 단축키 추가 시 Axes의 Size 변경하고, 추가된 단축키의 이름과 파라미터 수정함
- GetAxis Method :
- Input Manager에서 설정한 단축키의 키 입력 여부 확인
- 동시에 여러 키의 정보를 확인 가능
- 매개변수 : InputManager에 등록되어 있는 단축키명을 String(문자열)로 사용
- 긍정키 : 0 < n ≤ 1
- 부정키 : -1 ≤ n < 0
- 아무 키도 누르지 않을 경우 0값 반환
- 0에서 1로 서서히 증가
- 0과 1사이에 있는 소수점 데이터 출력
- GetAxisRaw() Method : -1, 0, 1의 세 정수만 출력
- Input.GetAxisRaw(”Horizontal”) 단축키 :
[a]
, [d]
, [←]
, [→]
방향키 저장
[a]
, [←]
: -1
[d]
, [→]
: 1
- 아무 키도 누르지 않을 경우 : 0 값 반환
- Input.GetAxisRaw(”vertical”) :
[w]
, [s]
, [↑]
, [↓]
방향키 저장
2. 장애물이 있는 환경에서 오브젝트 이동
1) GameObject 물리와 충돌 범위
-
Rigidbody Component
a. Mass : Object 질량
b. Drag : 위치 움직임에 대한 마찰력
c. Angular Drag : 회전 움직임에 대한 마찰력
d. Use Gravity : 중력 사용 여부(True
: 중력 적용)
e. Is Kinematic : 물리 적용 On/Off(true
: 물리 시스템으로 이동/회전 불가능)
f. Constraints : 체크된 축은 외부로부터 받은 물리력에 의해 이동, 회전 하지 않음
-
Collider Component
- 3차원 공간에서 Object의 충돌 범위 표현
- Box Collider : 육면체 형태의 충돌 범위 설정
- 충돌 범위는 화면에 출력되는 이미지보다 크거나 작게 설정 가능
- Sphere Collider : 구 형태의 충돌 범위를 설정 할 때 사용
- 구 충돌이 모든 충돌 중 연산 속도가 가장 빠름
- Capsule Collider : 캡슐 형태의 충돌 범위를 설정할 때 사용
- Mesh Collider : 3차원 Object의 Mesh Data와 동일한 형태의 충돌 범위 설정
- 세밀한 충돌 가능
- 많은 Object를 필요로 할 때는 지양
- Wheel Collider : 자동차 바퀴 충돌 범위 설정
- Terrain Collider : 3차원 높이 맵(Terrain)의 충돌 범위 설정
- [GameObject] - [3D Object] - [Terrain]으로 생성
- Terrain Data : Project View에 ASsset으로 생성되는 Terrain 정보
2) GameObject 충돌 처리
서로 다른 차원의 Component들은 반응하지 않음으로 통일해서 사용해야 함
- 2D Game 제작용 : Rigidbody2D - Collider2D
- 3D Game 제작용 : Rigidbody - Collider
-
Transform Component를 이용한 Object 이동
- Rigidbody Component : 충돌로 인해 Object의 x, z 축이 회전하지 않도록 설정
- MovementTransform Script
- 장애물과의 충돌에 대한 처리 미실시
- 사용자가 입력한 방향키 방향으로만 이동
- Rigidbody, Collider Component : 장애물과의 충돌 시 밀어내는 등의 처리 역할
- 물리, 중력, 장에물에 대한 처리
- (
transform.position +=
..) 코드 이전에 처리
- 결과에 따라 다양한 행동 실행
- 실제로 코드를 쳐서 하기에는 많은 노력과 시간이 필요하므로 일반적으로는 Rigidbocy, CharacterCollider Component사용하거나 다른 개발자가 만든 이동 Asset 사용함
-
Rigidbody Component를 이용한 Object 이동
- 별도의 이동 Method 호출
- Object의 이동 여부 파악 → 이동 불가하면 이동 코드 미실행
GetComponent<Component명>()
3) 충돌 Event Method
- 물리적인 충돌과 충돌 Event Method 호출
- OnCollision Event Method : 두 Object 간의 물리적인 충돌 상황에 따라 특정 Method를 호출할 때 사용
- 물리적인 충돌 없이 충돌 Event Method 호출
- OnTrigger Event Method : 두 Object 간의 비물리적인 충돌 시 특정 Method만 호출할 때 사용
이것 저것 실습이 있어서 시간이 길어졌지만 따라가기엔 수월한 수업이였다. 실습한 결과물을 이미지 또는 동영상으로 업로드 추가 해봐야 겠다.