[Unity Course 2] 05. 총 발사 로직 1
위키북스 출판사 이재현 저자님의 '절대강좌! 유니티' 책을 참고하여 필기한 내용입니다.
Projectile 방식 : 총알이 물리적으로 발사되는 방식, 총알이 직접 날아가 적에게 타격을 입힌다. 총알이 시각적으로 표현되어 좋지만 짧은 시간 동안 여러개의 총알을 생성하면 속도가 느려진다.
**총알은 로우폴리 모델, 동적생성보단 오브젝트풀링으로 재사용
RayCasting 방식 : FPS게임에서 저격용 총의 발사 루틴을 구현하는데 자주 활용, 실제 총알이 발사되는 것이 아니라 레이저 빔과 같이 광선을 발사해 물체를 검출
** 총알 발사 루틴뿐 아니라 미로를 탐색하는 로봇의 센서 기능이나 추적기능을 구현가능
총알 모델 준비


총알 씬뷰에 넣기

빈 오브젝트 생성 후 이름은 Bullet, position (0,1,5)
lowpolybullet의 Rotation은 (90,0,0)
총이 아래로 발사되는 이유 => bullet의 게임 오브젝트를 90도 움직였기 때문 하위 오브젝트인 모델을 90도 회전해야됨
Rigidbody 컴포넌트
물리 엔진의 힘을 이용하여 발사하기 위해서는 Rigidbody컴포넌트가 필요

bullet 오브젝트에 Rigidbody 컴포넌트를 추가한 후 Use Gravity 체크 해제
Rigidbody 컴포넌트 : 물리학 용어의 강체를 의미, 충돌 감지 또는 물리 시뮬레이션을 위한 중요한 컴포넌트
| 속성 | 설명 |
| Mass | 질량, 상대적인 의미의 질량, 무게의 단위따위가 아님 하지만 편의상 1kg으로 가정하고 작업 |
| Drag | 이동할 때 적용되는 마찰계수(저항) |
| Angular Drag | 회전할 때 적용되는 마찰계수(저항) |
| Use Gravity | 중력 적용 여부 |
| Is Kinematic | 체크하면 물리 시뮬레이션을 이용해 이동하지 않고 Transform 컴포넌트를 이용해 이동, 이 옵션을 해제하면 물리엔진의 영향을 받지 않는다. |
| Interpolate | 물리력을 이용한 움직임이 끊어지는 현상이 발생할 때 보간 - Interpolate : 이전 프레임의 Transform에 맞게 움직임을 부드럽게 처리 - Extrapolate : 다음 프페임의 Transform 변화를 추정해 움직임을 부드럽게 처리 |
| Collision Detection |
충돌 감지 옵션, 아주 빠른 물체는 물리 엔진이 충돌 검출을 놓칠 수 있음 빠르게 이동하는 물체의 충돌을 감지하려면 Continuous, Continuous Dynamic, Continuous Speculative옵션을 사용 |
| Freeze Position | XYZ 축 중에서 해당 축으로의 이동을 막는다 |
| Freeze Rotation | XYZ 축 중에서 해당 축을 기준으로 회전을 막음 |
using UnityEngine;
public class BulletCtrl : MonoBehaviour
{
// 총알의 파괴력
public float damage = 20.0f;
// 총알 발사 힘
public float force = 1500.0f;
private Rigidbody rb;
void Start()
{
// Rigidbody 컴포넌트 추출
rb = GetComponent<Rigidbody>();
// 총알의 전진 방향으로 힘(Force)을 가한다.
rb.AddForce(transform.forward * force);
}
}
BulletCtrl 스크립트 생성 후 Bullet오브젝트에 추가
물리 엔진 속성 설정 - Physics Manager

중요한 속성 몇가지
Gravity
: Rigidbody의 Use Gravity 속성에 체크하면 Gravity에 설정된 값으로 중력이 작용
Default Material
: 두 물체가 충돌했을 때 물리적인 반작용에 대한 속성을 전역적으로 설정, None으로 설정하면 각 Rigidbody에서 개별적으로 물리적인 반작용을 설정할 수 있다.
Bound Threshold
: 충돌한 두 물체의 상대 속도가 이 값보다 작으면 충돌이 발생하지 않는다. 또한 떨림 현상을 감소시키는 역할
Layer Collision Matrix
: Bulid in Layer 또는 사용자 정의 레이어간의 충돌 감지 여부를 선택적을 활성화하거나 비활성화할 수 있다.
Rigidbody를 포함한 게임오브젝트가 특정 레이어에서만 물리 엔진의 영향을 받게 할 수 있는 옵션
Collider 컴포넌트
:충돌을 감지하는 센서라고 생각하기
- Box Collider
- Sphere Collider
: 처리속도가 가장빠른 콜라이더, 정밀한게 아니라면 이 콜라이더를 추천
- Capsule Collider
: 인체, 나무 가로등 같은 물체의 콜라이더로 사용
- Mesh Collider
: cpu부하가 가장 높은 Mesh Collider 사용을 추천하지 않지만 미로나 스테이지 하나를 하나의 큰 메시 콜라이더로 설정하고 사용하는 방법도 있음
- Wheel Collider
: 차량의 바퀴에서 사용할 목적, 바퀴의 서스펜션, 바닥과의 마찰계수와 미끄러지는 저항을 세밀하게 설정
- Terrain Collider
: Terrain Engine 을 이용하여 생성한 지형에 적용, 지형 복잡도에 따라 부하가 높아지니 로우폴리메시를 이용한 Mesh Collider 추천
***연산속도 빠른 순서 : Sphere - Capsule - Box
충돌 감지 조건


Radius 는 0.2
이제 실행해보면 벽에 막혀서 더이상 가지 못하는 총알을 볼 수 있다.