유니티

유니티 3D 쿼터뷰 액션게임 - 수류탄 구현하기 / 투척, 던지기 / 폭발

nock_ji 2022. 4. 24. 23:27

 

유니티 3D 쿼터뷰 액션게임 만들기

 

👾  수류탄 구현하기  👾

 

 

 


 

1.  오브젝트 생성

 

- Prefab Weapon Grenade 수류탄 가져오기

- 미리 준비된 파티클 Prefab을 자식 오브젝트로 등록

- 던지고 굴러야하므로 Rigidbody와 Collider추가

- 물리재질 Physics Material 생성하여 해당 Collider에 추가 (설정값 : 1,1,1)

- Mesh object (자식오브젝트)에 잔상을 주기위한 Trail Renderer 추가 

 

- 수류탄이 Player와 부딪히지 않게 Layer 설정 (PlayerBullet)

- 만든 수류탄을 Asset창에 드래그하여 Prefab으로 저장

 

📣  모든 오브젝트는 (0,0,0)로 초기화 !! 

 


 

2.  수류탄 투척

 

 

🔻 Player 로직에 수류탄 Prefab을 저장할 변수 추가 

public GameObject grenadeObj;



 

- Fire2 button : 마우스 오른쪽버튼 클릭

- 수류탄 전용 Input과 함께 함수 생성 

bool gDown

void GetInput()
{
	gDown = Input.GetButtonDown("Fire2"); 
}

void Update()
{
	Grenade();
}

void Grenade()
{
	//수류탄을 쓰기 이전에 제한 조건들을 작성 
}

 

 

 

- 수류탄 투척을 쓸 수 없는 제한 조건 : hasGrenades 가지고 있는 수류탄 개수가 0일 때

- 마우스 클릭을 한 곳에 수류탄을 던질 수 있도록 RayCast사용

- Instantiate()함수로 수류탄 생성 (인스턴스화)

- 완성된 수류탄의 Rigidbody를 활용하여 던지는 로직 구현 (AddForce(), AddTorque())

- 수류탄 하나 던지는 로직 후 hasGrenades 개수를 하나 빼줌

- Player 주변에 맴돌고 있는 수류탄도 하나 비활성화함 

Player logic.

 

🔻 수류탄 Prefab에서 파티클 오브젝트는 미리 비활성화 하기 

 

 

 


 

3.  수류탄 폭발

 

 

✏️ 수류탄 폭발시키는 스크립트 생성

 

🔻 각 자식 오브젝트와 Rigidbody를 담을 변수 추가 (meshObj, effectOfj)

Grenade logic.

 

 

🔻 Throw Grenade Prefab에 해당 스크립트 추가하고 변수 초기화

 

 

 

✏️  시간차 폭발 스크립트 

- 시간차 폭발을 위해 코루틴 선언 IEnumerator ()

- 3초 후에 실행, 폭발할 때 수류탄이 굴러가는 물리적 속도를 모두 Vector3.zero로 초기화

- 수류탄 Mesh는 비활성화, 폭발은 활성화 

📌  velocity  : rigidbody의 속도를 나타냅니다

📌 AngularVelocity : 물리 회전 속도

📌 SetActive() : 오브젝트 활성화 함수

Grenade logic.

 

 

 


 

4.  수류탄 피격

 

수류탄이 폭파했을 때, 주변에 있던 적들이 데미지를 입는 로직

 

특정 범위에 걸린 적 검출하기 

공모양의 부피가 있는 Raycast

RaycastHit에 걸린 오브젝트를 모두 가져와야하므로 배열 사용 

 

Physics.SphereCastAll

구체 모양의 레이캐스팅, 범위에 걸린 모든 적들을 가져와야함

(위치 , 반지름 , Ray를 쏘는 방향 , Ray를 쏘는 길이, Layermask)

Layermask.GetMask("")

레이어 이름 목록

 

foreach 문으로 수류탄 범위에 있는 적들의 피격함수를 호출

foreach (데이터형식 변수명 in 배열) {} 

rayHits안에 있는 hitObj를 하나씩 가지고 오면서 호출

수류탄은 파티클이 사라지는 시간을 고려하여 길게 Destroy()호출 

Grenade logic.

 


 

📌 Enemy 로직

 

✏️  Enemy가 수류탄에 의해 공격받았을 때 체력 & 넉백 죽기 전 리액션 

 

🔻 Enemy가 수류탄에 의해 공격받았을 때의 체력 및 위치 

 

 

 

 

-수류탄만의 큰 리액션을 위해 넉백로직에 bool 매개변수 추가 (isGrenade)

-수류탄은 true, 나머지는 false 

 

 

 

 

✏️ 수류탄에 의해 죽을 때 Enemy가 공중회전하면서 죽도록 함

-수류탄에 의한 사망 리액션은 큰 힘과 회전을 추가시킴 

-Freeze Rotation x,z축이 고정되어 있으므로 해제시킴

-죽기 전에 AddForce, AddTorque 실행됨