티스토리 뷰
반응형
키보드를 쓰기 시작했다. 뭔가 이제 게임을 만드는 것 같고, 벌써부터 알면 안될 것 같은데 버그가 왜 생기는지 알 것 같다.
2D 게임이 목표인데도, 물리엔진이 어떻게 돌아가는지 알아야 하구나를 느끼고 있다.
근데 뭔가 재밌다! 초등학교때인가 하던 고양이 스크립트? 하는 느낌! 아직 기초라서 그렇겠지만,!
Gamelog 03. '키 입력과 충돌 판정'을 따라해봤다.
키 조작으로 움직이기
키 입력을 판정하기 위해서는 Input.GetKey("right")
나 Input.GetKey(Keycode.Space)
를 사용한다.
- 키 이름 예시: right, left, up, down, space, tab, delete, a, b, c, 1, 2, 3 ...
Update()
와 FixedUpdate()
를 조합하여 사용한다.
→ 입력 실수가 적고, 매끄러운 움직임 가능
float vx = 0;
void Update()
{
vx = 0;
if (Input.GetKey("right")){
vx = 1;
}
}
void FixedUpdate()
{
this.transform.Translate(vx/50, 0, 0);
}
}
public float speed = 2; // 속도:Inspector에 지정
float vx = 0;
float vy = 0;
bool leftFlag = false;
void Update()
{
vx = 0; // 0으로 계속 초기화 함으로써, 하기 조건문에서 초기화 불필요
vy = 0;
if (Input.GetKey("right"))
{
vx = speed;
leftFlag = false;
}
if (Input.GetKey("left"))
{
vx = -speed;
leftFlag = true;
}
if (Input.GetKey("up"))
{
vy = speed;
}
if (Input.GetKey("down"))
{
vy = -speed;
}
}
void FixedUpdate()
{
this.transform.Translate(vx / 50, vy / 50, 0);
this.GetComponent<SpriteRenderer>().flipX = leftFlag;
}
up/down 때마다 rotate
를 먹여보고 싶은데, 생각보다 엄청 안된다.
조금더 체험해보고 투두리스트로 도전해보기로!
- 자동차 up/down 키 누를 경우 rotate 적용하기
충돌기능 적용하기
① 리지드바디: 물리적인 움직임을 시키는 컴포넌트
- 벽에 닿으면 나아가지 않거나, 다른 물체와 충돌하면 되돌아오거나, 공중에 떠있을 때 낙하하게 함
- 3D용 Rigidbody와 2D용 Rigidbody로 나뉨
- Gravity Scale: 0으로 설정할 경우, 낙하하지 않게 됨(충돌만 사용하고 싶을 경우 0으로 설정)
- Freeze Position/Rotation: 충돌해도 회전하지 않으려면 체크
[Rigidbody2D].gravityScale = 0; // 중력 0으로 설정
[Rigidbody2D].constraints = RigidbodyConstraints2D.FreezeRotation; // 충돌시 미회전 설정
② 콜라이더: 충돌을 행하는 형태 설정
- 게임 오브젝트의 어디가 충돌할 것인가를 지정하는 것
- 사각형(Box Collider 2D), 원형(Circle Collider 2D), 캡슐형(Capsule Collider 2D), 그림형(Polygon Collider 2D)가 있음
- 굴러가지 않는 물체라면 → 박스형 추천
- 굴러가는 물체라면 → 원형 추천
- 그림형의 경우, 복잡한 형태로 프로젝트가 무거워질 수 있어 비추천
- 중력이 설정될 경우, 콜라이더와 부딪힐 때까지 떨어지게 됨
- 중력에 따라 콜라이더가 반만 부딪히면 기울어 낙하하게 됨
public float speed = 2; // 속도:Inspector에 지정
float vx = 0;
float vy = 0;
bool leftFlag = false;
Rigidbody2D rbody;
void Start() { // Rigidbody2D 기본 세팅 설정
rbody = GetComponent<Rigidbody2D>();
rbody.gravityScale = 0;
rbody.constraints = RigidbodyConstraints2D.FreezeRotation;
}
void Update() {
// 움직임 설정 코드 생략
}
void FixedUpdate() {
rbody.velocity = new Vector2(vx, vy); // 물리 엔진 이동시 Rigidbody2D 내에 이동 속도 지정
this.GetComponent<SpriteRenderer>().flipX = leftFlag;
}
- Rigidbody의 설정의 경우, 스크립트에서 작성하면 별도 조작 필요 없이 세팅 가능
- 물리엔진 이동 시 Rigidbody 내에 설정해야 이동속도 지정 가능
- 중력 및 회전 미설정시, 충돌하면 단순 멈춤
반응형
'프로그래밍 > Unity' 카테고리의 다른 글
Gamelog 05. 쉬운게 역시 재밌다. (0) | 2023.01.25 |
---|---|
Gamelog 04. 게임이 보이기 시작했다. (2) | 2023.01.24 |
Gamelog 02. 스크립트를 깔짝대본다. (0) | 2023.01.22 |
Gamelog 01. 게임을 못 만들 뻔했다. (0) | 2023.01.22 |
Gamelog 00. 게임을 만들기로 했다. (0) | 2023.01.15 |
댓글