✅ 오늘의 학습 목표
1. Collider 및 Rigidbody 학습 - 2D Car 구현
2. Collider 및 Rigidbody 활용 - 고양이 무한 맵
3. Physics Material 맛보기
1. 2D 자동차
🥕 예행 작업
1. Scene 생성 (Car 2D)
2. Script 생성 (CarMovement)
1. Collider
- 오브젝트끼리 충돌을 감지하는 기능
- 충돌 감지하는 기능만 있지 물리적인 무언가를 하는 역할은 없음 따라서 Rigidbody를 구현해주어야 함
1.1. Car 오브젝트 생성 및 콜라이더 적용


1.2. Car 오브젝트 움직임 구현
using UnityEngine;
public class CarMovement : MonoBehaviour
{
public float moveSpeed = 3f;
void Update()
{
float h = Input.GetAxis("Horizontal");
transform.position += Vector3.right * h * moveSpeed * Time.deltaTime;
}
}
1.3. 양 옆에 벽 생성 후 콜라이더 적용

벽에 콜라이더를 적용시켜도 자동차는 벽을 뚫고 지나간다.
=> 물리적인 작용을 하려면 Rigidbody를 적용시켜주어야 함
2. Rigidbody
오브젝트의 움직임과 충돌을 처리해 주는 기능
2.1. 자동차 오브젝트에 Rigidbody 적용

이때 중력을 0으로 설정해주어야 자동차 오브젝트가 밑으로 내려가지 않는다.
2.2. 떨림 현상

Rigidbody를 적용하면 이제 벽을 통과하지는 않지만,
약간의 떨림 현상이 있다.
❓ 떨림 현상이 발생하는 이유?

콜백함수에 대해서 먼저 이해를 해야 한다.
Update()는 프레임 속도에 따라 호출되기 때문에 매번 호출 간격이 달라지고,
FixedUpdate()는 프레임 간격이 고정되어 있어 일정한 간격으로 호출된다.
Rigidbody는 물리 계산과 충돌 감지를 FixedUpdate의 고정된 간격에 맞춰 수행한다.
그런데 Update에서 transform.position으로 강제로 위치를 바꾸면,
물리 엔진이 계산한 위치와 실제 위치가 어긋나게 되어 위치 보정이 반복되면서 떨림 현상이 발생하는 것이다.
2.3. Car 오브젝트 움직임 보완
using UnityEngine;
public class CarMovement : MonoBehaviour
{
public float moveSpeed = 3f;
public Rigidbody2D carRb; // GetComponent<Rigidbody2D>()
private float h;
// 성능에 따라 다른 프레임으로 실행되는 콜백함수
void Update()
{
h = Input.GetAxis("Horizontal"); // 수평값 (X값)
// Transform을 통해서 이동했기 때문에 떨림현상 있음
// transform.position += Vector3.right * h * moveSpeed * Time.deltaTime;
}
// 고정 프레임으로 실행되는 콜백함수
void FixedUpdate()
{
// Rigidbody 이동
carRb.linearVelocityX = h * moveSpeed; // h값을 업데이트 콜백함수에서 집어넣었으니 여기서도 사용 가능!
}
}
자동차 움직임을 Rigidbody로 구현해 주면 떨림 현상을 방지할 수 있다.
(Rigidbody는 애초에 일정한 간격으로 호출되니 Time.deltaTime을 곱할 필요가 없다.)
2.4. Fixed Time

설정에서 Fixed Time의 간격을 조절해 줄 수 있다.
3. Trigger
물리 충돌은 감지하되 실제로 부딪히지 않게 만드는 기능
🥕 예행 작업
1. Scene 생성 (Rigidbody) / 3D로 구현할 거임
2. Script 생성 (ColliderEvent)
3.1. 바닥, 구체 2개 생성

3.2. 둘 구체 중 하나는 Trigger 기능을 체크해 준다.

3.3. Collider Event 스크립트 구현 및 적용
using UnityEngine;
public class ColliderEvent : MonoBehaviour
{
// isTrigger = false일 경우 호출
void OnCollisionEnter(Collision other)
{
Debug.Log($"{this.gameObject.name} Collision Enter");
}
// isTrigger = true일 경우 호출
void OnTriggerEnter(Collider other)
{
Debug.Log($"{this.gameObject.name} Trigger Enter");
}
}
3.4. 결과


트리거를 체크해 놓은 파란 구체는 그대로 떨어지고
트리거를 체크하지 않은 빨간 구체는 바닥에 놓여지는 것을 확인할 수 있다.
2. 고양이 무한 맵
위에서 배운 콜라이더와 리지드바디를 고양이 씬에 적용시켜 보자
1. 오브젝트
1.1. 고양이 오브젝트에 콜라이더 및 리지드바디 적용

고양이 오브젝트에 리지드바디를 적용했기 때문에 바닥에도 적용되지 않으면 그냥 밑으로 쓩 내려감
1.2. 바닥 오브젝트 생성

GroundCollider를 생성하고 콜라이더를 적용해 준다.
이 바닥이 굳이 화면에 노출될 필요는 없으니 Sprite를 비활성화해준다.
2. 점프 구현
저번 시간에 고양이 오브젝트의 애니메이션은 구현하였지만,
고양이 움직임에 대해서는 구현한 것이 없다.
🥕 예행 작업
1. Script 생성 (CatController)
2.1. Pipe 오브젝트 생성
고양이 오브젝트의 점프를 구현할 것이기 때문에 장애물을 한번 배치해 보자


Pipe도 바닥과 배경과 동일하게 Offset 값을 이동시켜서 반복적으로 나타나게 구현할 것이다.
보통 피벗은 센터에 있기 때문에 센터 값으로 Offset 값을 변동시키면 원하는 위치에 가지 않을 수 있으니 Bottom으로 변경해 주자.
피봇은 이미지 자체에서 변경할 수 있다. (오브젝트에서 변경하는 것이 아님)
2.2. 고양이 점프 구현
using UnityEngine;
public class CatController : MonoBehaviour
{
private Rigidbody2D catRb;
public float jumpPower = 10f;
void Start()
{
catRb = GetComponent<Rigidbody2D>();
}
void Update()
{
// 점프 구현
if (Input.GetKeyDown(KeyCode.Space))
{
catRb.AddForceY(jumpPower, ForceMode2D.Impulse); // Impulse 순간적으로 힘을 가하는 방식
}
}
}
- catRb.AddForceY(jumpPower, ForceMode2D.Impulse);
- AddForce : 힘을 가하는 메소드
- jumpPower : 힘의 크기
- ForceMode2D.Impulse : 순간적으로 힘을 가하는 기능

이렇게 코드를 구현해 주면 고양이가 무한 점프가 가능함.
2.3. 무한 점프 방지 구현
using UnityEngine;
public class CatController : MonoBehaviour
{
private Rigidbody2D catRb;
public float jumpPower = 10f;
public bool isGround = false;
void Start()
{
catRb = GetComponent<Rigidbody2D>();
}
void Update()
{
// 점프 구현 - 바닥에서 점프할 때만 점프가능(중복 방지)
if (Input.GetKeyDown(KeyCode.Space) && isGround)
{
catRb.AddForceY(jumpPower, ForceMode2D.Impulse); // Impulse 순간적으로 힘을 가하는 방식
}
}
private void OnCollisionEnter2D(Collision2D other)
{
if (other.gameObject.CompareTag("Ground"))
{
isGround = true;
}
}
private void OnCollisionExit2D(Collision2D other)
{
if (other.gameObject.CompareTag("Ground"))
{
isGround = false;
}
}
}
고양이 오브젝트가 바닥에 닿아있을 때에만 점프를 할 수 있도록 Tag 기능을 이용한다.

바닥 오브젝트에 Ground 태그를 달아서 해당 코드가 잘 구현되도록 설정해 준다.
2.4. 2단 점프 구현
using UnityEngine;
public class CatController : MonoBehaviour
{
private Rigidbody2D catRb;
public float jumpPower = 10f;
public bool isGround = false;
public int jumpCount = 0;
void Start()
{
catRb = GetComponent<Rigidbody2D>();
}
void Update()
{
// 2단 점프 구현
if (Input.GetKeyDown(KeyCode.Space) && jumpCount < 2)
{
catRb.AddForceY(jumpPower, ForceMode2D.Impulse);
jumpCount++;
}
}
private void OnCollisionEnter2D(Collision2D other)
{
if (other.gameObject.CompareTag("Ground"))
{
isGround = true;
jumpCount = 0;
}
}
private void OnCollisionExit2D(Collision2D other)
{
if (other.gameObject.CompareTag("Ground"))
{
isGround = false;
}
}
}
3. Game Over 구현
뭐 딱히.. 엄청난 것을 구현하는 건 아니고
그냥 로그에 Game Over 뜨게 하는 거다..
using UnityEngine;
public class ColliderEvent : MonoBehaviour
{
private void OnCollisionEnter2D(Collision2D other)
{
if (other.gameObject.CompareTag("Player"))
{
Debug.Log("Game Over");
}
}
}
3.1. 스크립트 적용

3.2. 고양이 오브젝트에 Player 태그 적용

3.3. 결과

파이프에 닿으면 콘솔창에 게임오버가 나타난다!
3. Physics Material
Collider에 붙여서 마찰력이나 반발력 같은 물리 반응을 조절하는 머테리얼이다.
약간 오브젝트의 미끄럼이나 튀는 정도를 조정한다고 생각하면 된다.
- 구체랑 바닥에 피직스 머테리얼을 적용해 주는 작업


- 결과

피직스 머테리얼에 관한 설명은 다음 시간에 더 자세히 해주신다고 하셨으니 짧게 마무리하겠다!
오늘은 수업시간 중간에 한 30분? 졸아버렸다..ㅎ휴ㅠ
이번주는 노느라고 맨날 2~3시에 잤더니 그런가부다.. 오늘은 일찍 자야징..
그리고 점점 더 많은 기능들을 구현하고 있다 보니까 조금 정리할 필요가 있어 보인다!
사람들은 오브젝트도 기깔나게 만들던데.. 어캐 그렇게 잘하는지 부럽다!!
나도 유니티 에디터가 조금 익숙해지면 엄청 빨라지겠지? 하면서 오늘도 긍정 마무리!! ^-^
'Unity > 멋쟁이사자처럼 부트캠프' 카테고리의 다른 글
| [멋쟁이사자처럼부트캠프] 유니티 게임 개발 5기(14일차) - 애니메이션 활용 및 다중 적용 (0) | 2025.05.30 |
|---|---|
| [멋쟁이사자처럼부트캠프] 유니티 게임 개발 5기(13일차) - 핀볼 게임 및 애니메이션 활용 (0) | 2025.05.29 |
| [멋쟁이사자처럼부트캠프] 유니티 게임 개발 5기(11일차) - if문 및 Marterial 실습 (1) | 2025.05.27 |
| [멋쟁이사자처럼부트캠프] 유니티 게임 개발 5기(10일차) - Transform과 Polygon 동작 확인 및 C# 기초(6) (1) | 2025.05.26 |
| [멋쟁이사자처럼부트캠프] 유니티 게임 개발 5기(9일차) - 게임 오브젝트 업그레이드 및 구현 (1) | 2025.05.23 |