오늘의 구현 내용
1. Game View 설정하기
프레임 그리는 속도를 모니터 갱신 속도에 맞춰주기위해
Game뷰에서 "Vsync(Game view only" 를 체크해준다.
2. Scene만들기
이번 게임에서는 Scene이
1. Game이 진행되는 씬
2. 정상에 도달했을 때의 씬
3. 추락하여 목숨을 모두 잃어 Game out되는 씬
3가지가 존재한다.
먼저 1. Game이 진행되는 씬을 만들기 위해
상단 메뉴의 File -> Save As를 눌러 씬을 저장해준다. (씬의 이름은 원하는 대로!)
3. Physics (Rigidboby, Collider) 컴포넌트 적용하기
-> physics가 적용된 경우, 좌표변환이 아니라 오브젝트에 힘을 가해 오브젝트에 움직임을 줄 수 있게 된다.
본 게임에서, 플레이어(고양이)는 중력의 영향을 받아 아래로 떨어지면서 & 구름과 충돌하는 경우 구름위에 올라선다.
이를 위해서는 Physics2D (2D게임을 제작하는 것이므로 "Physics"가 아닌 "Physics2D"로 적용해야 한다.)의 항목 중
1. rigidbody --> 오브젝트를 강체로 변하게 함. 즉, 질량이 생겨 중력의 영향을 받게됨.
2. collider 2D --> 충돌반응을 위해 필요함.
위 2가지 항목이 추가 되어야 한다.
이때, Collider의 종류는 여러가지 인데, 오브젝트의 모양과 기능에 맞게 설정해주면 된다.
대표적인 Collider의 종류는 아래와 같다. (아래 그림에서, 초록 경계부분이 충돌을 감지하는 경계라고 보면 된다.)
이름 | 모양 |
Circle Collider 2D | ![]() |
Box Collider 2D | ![]() |
Edge Collider 2D | ![]() |
Polygon Collider 2D | ![]() |
꿀팁
🍯 여러 종류의 collider을 동시에 적용해줄 수 있다.
🍯 rigidbody가 적용된 오브젝트가 중력과 물리연산의 영향을 무시하도록 설정하는 법
Rigidbody2D 항목 -> BodyType을 "kinematic"으로 설정해준다.
Kinematic이 적용된 오브젝트는 중력과 외부의 힘에 영향을 받지 않는다.
🍯 오브젝트에 적용되는 중력의 크기 조정하기
Rigidbody2D 항목 -> Gravity Scale의 값을 변경해준다.
(이때, 이 값이 클수록 더 큰 중력을 받는다. 즉, 낙하속도가 빨라진다.)
4. 회전으로 인한 넘어짐 방지하기
◀왼쪽과 같이, 발밑의 collider 경계가 원형인경우, 외부에서 조금만 힘을 가해도 오브젝트가 회전하여 쉽게 넘어지게 된다.
이를 방지해주기 위해선 회전을 방지해주어야 한다.
Rigidbody항목 -> Constraints -> Freeze Rotation 을 체크하면
Z 회전 축으로의 회전을 방지할 수 있다.
(🍯 이때, Freeze Position x/y는 각각 x/y 방향으로의 이동을 방지하는 역할을 한다.)
5. 오브젝트에 힘을 가해 오브젝트에 움직임을 주기
점프하기
다음은 스페이스바를 누르면 오브젝트가 점프를 할 수 있도록 오브젝트에 위쪽 방향으로 힘을 가하는 코드이다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
Rigidbody2D rigid2D;
float jumpForce = 680.0f;
void Start()
{
this.rigid2D = GetComponent<Rigidbody2D>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space)) //스페이스바를 누르면
{
this.rigid2D.AddForce(transform.up * this.jumpForce); //오브젝트에 위로 힘을 가한다.(즉, 오브젝트는 점프한다.)
}
}
}
방향키로 좌우로 움직이기
다음은 좌우 방향키를 누르면 오브젝트가 좌우로 움직일 수 있도록 오브젝트에 좌우로 힘을 가하는 코드이다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
Rigidbody2D rigid2D;
float jumpForce = 680.0f;
float walkForce = 30.0f;
float maxWalkSpeed = 2.0f;
void Start()
{
this.rigid2D = GetComponent<Rigidbody2D>();
}
void Update()
{
//점프 구현 코드
if (Input.GetKeyDown(KeyCode.Space)) //스페이스바를 누르면
{
this.rigid2D.AddForce(transform.up * this.jumpForce);
//오브젝트에 위로 힘을 가한다.(즉, 오브젝트는 점프한다.)
}
//좌우 이동 구현 코드
int key = 0;
if (Input.GetKey(KeyCode.RightArrow)) key = 1; //오른쪽 이동
if (Input.GetKey(KeyCode.LeftArrow)) key = -1; //왼쪽 이동
float speedx = Mathf.Abs(this.rigid2D.velocity.x); //현재 오브젝트의 속력
if (speedx < this.maxWalkSpeed) //속력 제한
{
this.rigid2D.AddForce(transform.right * key * this.walkForce); //좌우로 힘을 가해 오브젝트를 움직임
}
}
6. 좌/우 이미지 반전시키기
오브젝트가 어느쪽으로 움직이느냐에 따라 오브젝트의 모습이 변해야 한다.
좌/우 모습에 대한 이미지를 각각 불러와서 애니메이션 효과를 주어도 되지만
아래와 같이 간단하게 scale의 값을 음수로 주어 이미지를 반전시킬 수 있다.
위 코드를 몇 줄 살펴보면,
if (Input.GetKey(KeyCode.LeftArrow)) key = -1; //왼쪽 방향키를 누르는 경우 "key"라는 변수 값이 음수가 된다.
이때
transform.localScale = new Vector3(key, 1, 1); //이와 같이 설정되어 있으므로 왼쪽 방향키를 누르면 x의 scale값이 음수가 되어 좌우로 이미지가 뒤집히게 된다.
여기까지 따라온다면, 플레이어(고양이)가
1. 스페이스바를 누르면 점프하고
2. 방향키를 누르면 좌우로 움직이는
모습까지 구현될 것이다.
"애니메이션 모습을 추가하는 것 & 카메라 위치를 변경하는 것 & 정상에 도착했을 때 씬이 바뀌는 것"
에 대해선 다음 챕터에서 마저 설명해 보고자 한다.
[unity] class4_physics와 애니메이션_제작과정2 (완성)
[unity] class4_physics와 애니메이션_제작과정2
[unity] class4_physics와 애니메이션_제작과정
bigballdiary.tistory.com
'대외 활동 > 유니티 스터디' 카테고리의 다른 글
[unity] class5_3D게임 (1) | 2021.08.06 |
---|---|
[unity] class4_physics와 애니메이션_제작과정2 (0) | 2021.07.24 |
[unity] class4_physics와 애니메이션 (0) | 2021.07.24 |
[unity] physics효과 주기 (collider, rigidbody, AddForce ...) (0) | 2021.07.22 |
[unity] class3_prefab과 충돌판정 (0) | 2021.07.22 |