Unity 강의/Unity Course(2) - 절대강좌! 유니티

[Unity Course 2] 05. 총 발사 로직 1

첨부엉. 2024. 6. 19. 15:39
반응형
위키북스 출판사 이재현 저자님의 '절대강좌! 유니티' 책을 참고하여 필기한 내용입니다.

 

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

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

 

 

반응형