유니티

유니티 3D 쿼터뷰 액션게임 - 원거리 공격 구현 / Instantiate() / Raycast / 마우스 방향으로 회전

nock_ji 2022. 4. 23. 14:14

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

 

 

👾  메인 액션 - 원거리 공격 구현하기  👾

 

 

 


 

1.  총알, 탄피 만들기

 

 

- 총알 효과로 Trail Renderer 추가

- 총알 효과를 위해 Material, Time, distance, Width 설정

 

 

🔻 Rigidbody, Collider 추가해서 물리 설정하기 

 

 

🔻 Bullet HandGun, Bullet SubMachineGun 탄 따로 만들기

 

 

🔻 탄피 모델을 꺼내서 탄피 만들기 (Bullet Case)

 

 

🔻 데미지와 삭제를 위한 스크립트 생성 (Bullet Script)

     OnCollisionEnter()에서 각각 충돌로직 작성 

     - 총알이 Floor에 닿으면 해당 게임오브젝트는 3초 뒤에 비활성화

     - 총알이 Wall에 닿으면 해당 게임오브젝트는 바로 비활성화

 

 

Bullet HandGun과 Bullet SubMachineGun, Bullet Case에 해당 스크립트 추가

Damage 수치를 각각 정하고 (20, 7) 완성된 총알과 탄피는 Prefab으로 저장 

 

 

 


 

2. 발사 구현 

 

 

 

✏️  Player가 공격버튼(Fire1 / 마우스 오른쪽)을 누르면 총을 쏘는 애니메이션 구현

🔻 애니메이터에 Shot 애니메이션 추가, Trigger 형식으로 doShot 컨디션 부여

 

 

 

 

✏️ 무기타입에 따라 다른 트리거 애니메이션 실행

🔻 현재 들고있는 무기의 타입이 근접 무기 Melee 라면 Swing anim, 아니라면(원거리 Range) Shot anim 실행

Player logic.

 


🔻  이전에 public으로 보여줬던 권총과 기관총 변수 설정하기

Weapon logic.

 

 

 

 

✏️ 총알이 발사되는 위치, 탄피가 배출되는 위치 필요

🔻 Weapon 로직 에서 변수 생성

public Transform bulletPos;             //bullet 위치 
public GameObject bullet;               //bullet을 저장할 장소 
public Transform bulletCasePos;			
public GameObject bulletCase;

 

 

- Player에 총알 발사 위치가 될 빈 오브젝트 추가 (Bullet Pos)

- 각 총마다 탄피 배출 위치가 될 빈 오브젝트 추가 (Case pos)

 

 

🔻 발사 위치, 총알, 탄피위치, 탄피를 변수에 할당

 

 

 

 

 

✏️  총알 발사 / 탄피 배출 로직 

 

Weapon 로직

🔻 무기에서 타입으로 조건을 주어 다른 코루틴 실행하기 (원거리 타입 Range)

Shot 코루틴 생성

 

 

📌  Instantiate() 

오브젝트 인스턴스화, 게임 중에 오브젝트가 필요할 때마다 실시간으로 만드는 함수 

 

📍 보통 총알이나 몬스터를 찍어낼 때 사용함

Instantiate(GameObject original, Vector3 position, Quaternion rotation)

• GameObject original : 생성하고자 하는 게임오브젝트명, 현재 씬에 있는 게임오브젝트나 Prefab으로 선언된 객체를 의미

• Vector3 position : Vector3으로 생성될 위치를 설정

• Quaternion rotation : 생성될 게임오브젝트의 회전값을 지정 

 

- bullet 총알 생성 (인스턴스화)

- 인스턴스화된 총알에 속도 적용하기

- bulletCase 탄피 생성 (인스턴스화)

- 인스턴스화된 탄피에 가해지는 힘의 방향 설정, Random.Range(시작값, 끝값) 랜덤한 힘 가하기

- AddTorque()으로 탄피 회전 

Weapon logic.

 

- 총알이 벽에 닿으면 사라지고, 탄피가 바닥에 닿으면 사라지기 때문에 tag 세팅

- 총알이 벽에 닿을 때 사라지도록 태그 설정 

 

 


 

3. 재장전 구현

 

 

🔻 Weapon 스크립트 전체 탄약 maxAmmo, 현재 탄약 변수 curAmmo생성

 public int maxAmmo;
 public int curAmmo;

 

 

🔻  원거리 타입 로직에서 현재 탄약을 조건에 추가하고, 발사 했을 때 감소하도록 작성

원거리 타입이면서 남은 탄의 개수가 0보다 클 때, 현재 탄의 개수가 줄어들고 Shot 코루틴함수 실행 

 

 

 

🔻 Player 로직에서 재장전에 관련된 변수함수 추가

bool rDown;

void Update(){
	Reload();
	}

void GetInput(){
	rDown = Input.GetButtonDown("Reload");
	}

 

 

 

🔻 Input Manager에서 Reload button 추가 

 

 

 

🔻  Reload()

- 무기가 있는지, 무기 타입이 맞는지, 총알은 있는지 확인하는 로직 

- rDown 입력을 받고, 장전준비가 되고, 점프 & 착지 & 교환 X 일 때 재장전 로직 실행

- 애니메이션 트리거 doReload 호출, 재장전 실행 중임을 확인, 3초 뒤에 ReloadOut

 

 

 

 

🔻 재장전 중임을 알리는 bool Reloading 선언 

bool Reloading

 

 

 

🔻 애니메이터에 Reload 애니메이션 추가, Trigger 형식으로 doReload 컨디션 부여

 

 

 

🔻 ReloadOut() 

-현재 가지고 있는 총알이 최대 총알개수보다 작으면 장전할 총알 reAmmo은 현재 가지고 있는 총알개수이고, 그렇지 않으면 최대 총알 개수다 

-들어간 탄 만큼 플레이어가 소지하고 있는 탄이 줄어듦 

 

 

 

 

🔻 Weapon HandGun, Weapon SubMachineGun 무기의 전체 탄약, 현재 탄약 수치 설정하기 

 

 

 

🔻 이동함수에 조건 추가 

 


 

4. 마우스 회전

 

✏️  마우스 방향으로 총을 쏠 수 있도록 구현 

 

🔻 Player에 메인카메라 변수를 만들고 할당하기 

public Camera followCamera;

 

마우스로 Player를 회전 시키는 로직 추가

ScreenPointToRay() : 스크린에서 월드로 Ray를 쏘는 함수

 

 

 

 

 

✏️  마우스 클릭 했을 때만 회전하도록 함 

 

📌  RayCastHit

충돌이 발생했는지 감지함, 정보를 저장할 변수 추가 

 

 

📌  Raycast

내가 설정한 방향으로 Ray를 날려 설정거리 이내에 물체가 있는지 없는지 충돌감지를 하는 것

if (Physics.Raycast(transform.position, transform.forward, out hit, MaxDistance))

(Ray 원점, Ray 방향, 충돌감지할 RaycastHit, Ray 거리)

 

 

📌 out 

return처럼 반환값을 주어진 변수에 저장하는 키워드

 

-ray가 어느 오브젝트에 닿았을 때 rayHit에 대한 결과물을 RaycastHit에 저장

-nextVec = ray가 닿았던 지점 - Player의 위치 

-RayCastHit의 마우스 클릭 위치 활용하여 회전을 구현

-RayCastHit의 높이는 무시하도록 Y축 값을 0으로 초기화

 

 

📌  transform.LookAt()

지정된 Vector를 향해서 회전시켜주는 함수