7/16 물리,사운드 및 이펙트

심지태
∙∙조회 7
7/16 물리,사운드 및 이펙트

Force / Impuls

구분ForceMode.ForceForceMode.Impulse
의미지속적으로 힘을 가함순간적으로 충격을 가함
적용 방식여러 물리 프레임에 걸쳐 사용보통 한 번만 호출
질량 영향받음받음
시간 영향FixedDeltaTime의 영향을 받음시간 간격과 무관하게 즉시 적용
주요 용도이동, 가속, 추진력, 바람점프, 폭발, 총알 피격, 넉백
호출 위치주로 FixedUpdate()이벤트 발생 시 한 번 호출
느낌서서히 빨라짐속도가 즉시 크게 변함

Force

힘을 계속 가하면 물체가 점점 가속됩니다.

csharp
void FixedUpdate()
{
    rb.AddForce(Vector3.forward * 10f, ForceMode.Force);
}

자동차 엔진, 로켓 추진력, 바람에 밀리는 물체, 물리 기반 캐릭터 이동

Impulse

짧은 순간에 강한 충격을 가합니다.

csharp
void Jump()
{
    rb.AddForce(Vector3.up * 5f, ForceMode.Impulse);
}

점프, 폭발, 총알에 맞았을 때, 적을 밀쳐내는 넉백

Rigidbody 주요 기능 정리

힘과 회전력 계열

메서드기능대표 용도
AddForce()월드 좌표 기준으로 힘 적용이동, 점프
AddRelativeForce()물체의 로컬 좌표 기준으로 힘 적용자동차, 비행기, 로켓
AddTorque()월드 좌표 기준 회전력 적용바퀴 회전, 물체 굴리기
AddRelativeTorque()로컬 좌표 기준 회전력 적용비행체 회전
AddForceAtPosition()특정 위치에 힘 적용문 밀기, 물체 한쪽 타격
AddExplosionForce()폭발 중심에서 바깥쪽으로 힘 적용폭탄, 충격파

Rigidbody 인스펙터 값: 추가 물리적 성질

값의미참고
Mass질량(kg), 기본값 1크면 같은 힘에 덜 움직이고, 충돌 시 상대를 더 세게 밀어냄
Linear Damping이동 시 받는 공기 저항 (구 Drag)0이면 저항 없이 관성으로 영원히 이동
Angular Damping회전 시 받는 저항 (구 Angular Drag)0이면 저항 없이 영원히 회전
Use Gravity중력 적용 여부끄면 Project Settings의 중력(-9.81 m/s²)을 안 받음
Is Kinematic힘 계산 무시켜도 여전히 물리 오브젝트라, 다른 Rigidbody에는 영향을 줌
Freeze (Constraints)체크한 축은 이동·회전이 일어나지 않음캐릭터가 넘어지지 않게 회전 X·Z만 고정하는 식으로 사용
Layer Overrides이 오브젝트만 특정 레이어와 충돌 여부를 예외 설정4절에서 배우는 Layer/Collision Matrix를 개별 오브젝

튀는 재질: Physic Material

   
Bounciness튀는 정도 (0 = 안 튐, 1 = 거의 그대로 튐)0 / 0.5 / 0.9 비교
Dynamic Friction움직일 때 마찰 (작을수록 미끄러움)0으로 두면 얼음판처럼 됩니다

Raycast: 보이지 않는 감지선

Raycast란?

Raycast는 특정 위치에서 특정 방향으로 보이지 않는 직선을 발사하여 Collider와 충돌하는지 검사하는 기능입니다.

markdown
시작 위치 ───────────────▶ 방향
                충돌 지점

Raycast 기본 구조

csharp
Physics.Raycast(
    origin,
    direction,
    out hit,
    maxDistance,
    layerMask,
    queryTriggerInteraction
);
매개변수자료형의미
originVector3Ray가 시작되는 월드 좌표
directionVector3Ray를 발사할 방향
out hitRaycastHit충돌한 물체의 상세 정보
maxDistancefloatRay의 최대 거리
layerMaskint, LayerMask검사할 레이어
queryTriggerInteractionenumTrigger 감지 여부
반환값bool충돌하면 true, 아니면 false

Raycast는 화면에 보이지 않으므로, 확인용으로 Debug.DrawRay를 함께 씁니다.

csharp
Debug.DrawRay(transform.position, Vector3.forward * 10f, Color.red);

Raycast 활용

활용설명
바닥 감지캐릭터가 땅에 서 있는지 확인해 점프 가능 여부를 정합니다
시선 처리적이 플레이어를 볼 수 있는지(중간에 벽이 없는지) 확인합니다
즉시 명중(Hitscan)총알이 날아가는 시간 없이 조준 즉시 맞은 것으로 처리합니다

Layer: 오브젝트를 그룹으로 관리하기

오브젝트가 많아지면 "이 그룹끼리는 부딪히고, 저 그룹끼리는 무시하자"는 규칙이 필요해집니다. Layer는 오브젝트를 이름 붙은 그룹으로 나누는 시스템이고, 주로 두 곳에 씁니다.

기능역할예시
Collision Matrix특정 레이어끼리만 충돌하게 설정Player와 Monster는 부딪히지만, Player와 FriendlyBullet(아군 총알)은 무시
LayerMask (Raycast 필터)Raycast가 특정 레이어만 감지하거나 무시하게 설정투명벽 레이어는 이동은 막지만, 총알 Raycast는 통과

Layer Collision Matrix 정리

edit -> project settings -> physics -> settings -> layer collision matrix

plain text
Edit
→ Project Settings
→ Physics
→ Settings
→ Layer Collision Matrix

Layer Collision Matrix는 어떤 레이어끼리 물리 충돌을 계산할지 설정하는 표입니다.

예를 들어 Player와 Enemy의 체크를 해제하면, 두 레이어의 Collider가 서로 겹쳐도 물리 충돌을 처리하지 않습니다.

체크를 해제하면 발생하는 결과 -> 두 오브젝트 사이에 OnCollision / OnTrigger 이벤트가 발생하지 않음

LayerMask란?

LayerMask는 여러 Layer 중에서 “어떤 레이어를 검사할지” 선택하는 필터입니다.

ini
// Enemy만 검사
int mask = LayerMask.GetMask("Enemy");

// Enemy와 Wall 검사
int mask = LayerMask.GetMask("Enemy", "Wall");

// Player를 제외한 모든 레이어 검사
int mask = ~LayerMask.GetMask("Player");

Physics Material

속성범위설명값이 낮을 때값이 높을 때
Dynamic Friction0~1움직이거나 미끄러질 때의 마찰력얼음처럼 잘 미끄러짐빠르게 감속함
Static Friction0~1정지한 물체가 움직이기 시작할 때의 마찰력작은 힘에도 움직임움직이기 어려움
Bounciness0~1충돌했을 때 튀는 정도거의 튀지 않음고무공처럼 튐
Friction Combine선택충돌한 두 표면의 마찰값 계산 방식아래 표 참고—
Bounce Combine선택충돌한 두 표면의 탄성값 계산 방식아래 표 참고—

Sound

Unity에서 소리가 나려면 세 부품이 필요합니다. 음악 감상에 비유하면 음원 파일, 스피커, 귀입니다.

부품역할위치
AudioClip음원 파일 (mp3, wav)Project 창의 에셋
AudioSource소리를 재생하는 스피커소리 낼 오브젝트에 붙임
AudioListener소리를 듣는 귀Main Camera에 기본으로 있음

AudioSource를 3D로 변경한다는 것은 소리가 게임 월드의 위치를 가지게 된다는 뜻입니다.

설정동작
2D오브젝트 위치와 상관없이 일정한 크기로 들림
3D소리가 나는 위치와 카메라 사이의 거리·방향에 따라 달라짐
Spatial Blend 0.52D와 3D 효과가 절반씩 혼합됨

AudioSource와 AudioMixer 차이

구분역할
AudioClip실제 음원 파일
AudioSource음원을 재생하는 컴포넌트
AudioMixer여러 AudioSource의 출력과 볼륨, 효과를 통합 관리
AudioListener최종적으로 소리를 듣는 위치, 일반적으로 Main Camera

소리의 흐름은 다음과 같습니다.

markdown
Explosion AudioSource
        ↓
AudioMixer의 SFX 그룹
        ↓
Master 그룹
        ↓
AudioListener
        ↓
스피커

이펙트: ParticleSystem

Time.deltaTime VS Time.unscaledDeltaTime

구분Time.deltaTimeTime.unscaledDeltaTime
의미게임 시간 기준 프레임 간격현실 시간 기준 프레임 간격
timeScale 영향받음받지 않음
timeScale = 1정상적으로 증가정상적으로 증가
timeScale = 0.5절반으로 감소변화 없음
timeScale = 00계속 증가
게임 일시정지함께 멈춤일시정지 중에도 작동
주요 용도캐릭터 이동, 게임 타이머, 게임 효과일시정지 UI, 메뉴 애니메이션, 현실 시간 타이머

정리 질문 (퀴즈)

ForceMode.Force와 ForceMode.Impulse의 차이는 무엇인가요? -> 서서히 힘을 주는 방식, 즉시 힘을 주는 방식

공이 튀는 정도는 어디서 조절하나요? -> Physics Material의 Bounciness

소리가 나기 위한 세 가지 부품은 무엇인가요? -> audio listener, audio source, audio clip

AudioSource와 ParticleSystem에서 Play On Awake를 끄는 이유는 무엇인가요? -> Play On Awake 이 켜져 있으면 씬에 존재하게될 때, 반드시 실행되기 때문에

재생 전에 null 확인을 하는 이유는 무엇인가요? -> AudioClip이나 컴포넌트가 할당되지 않았을 때 발생하는 NullReferenceException을 방지하기 위해서

질량 2인 공에 Impulse 6을 주면 속도는 얼마가 되나요? 근거 공식은? -> Impulse 6 / Mass 2 = 3, F = m*a (힘 = 질량 × 가속도)

Raycast가 작은 물체를 놓칠 수 있는 이유와 대안은 무엇인가요? -> Raycast는 굵기가 없는 한 줄의 광선이라 작은 Collider를 비껴갈 수 있으므로, 반지름을 가진 SphereCast나 CapsuleCast를 사용할 수 있습니다.

Layer의 Collision Matrix와 LayerMask는 각각 어디에 쓰이나요? -> Collision Matrix는 레이어 간 물리 충돌 여부를 전역으로 정하고, LayerMask는 Raycast 등이 검사할 레이어만 선택할 때 사용

Is Kinematic을 켜도 다른 Rigidbody에 영향을 줄 수 있는 이유는 무엇인가요? -> 물리 연산을 안해도 충돌은 감지되기 때문에