유니티 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 실행
🔻 이전에 public으로 보여줬던 권총과 기관총 변수 설정하기
✏️ 총알이 발사되는 위치, 탄피가 배출되는 위치 필요
🔻 Weapon 로직 에서 변수 생성
public Transform bulletPos; //bullet 위치
public GameObject bullet; //bullet을 저장할 장소
public Transform bulletCasePos;
public GameObject bulletCase;
- Player에 총알 발사 위치가 될 빈 오브젝트 추가 (Bullet Pos)
- 각 총마다 탄피 배출 위치가 될 빈 오브젝트 추가 (Case pos)
🔻 발사 위치, 총알, 탄피위치, 탄피를 변수에 할당
✏️ 총알 발사 / 탄피 배출 로직
Weapon 로직
🔻 무기에서 타입으로 조건을 주어 다른 코루틴 실행하기 (원거리 타입 Range)
📌 Instantiate()
오브젝트 인스턴스화, 게임 중에 오브젝트가 필요할 때마다 실시간으로 만드는 함수
📍 보통 총알이나 몬스터를 찍어낼 때 사용함
Instantiate(GameObject original, Vector3 position, Quaternion rotation)
• GameObject original : 생성하고자 하는 게임오브젝트명, 현재 씬에 있는 게임오브젝트나 Prefab으로 선언된 객체를 의미
• Vector3 position : Vector3으로 생성될 위치를 설정
• Quaternion rotation : 생성될 게임오브젝트의 회전값을 지정
- bullet 총알 생성 (인스턴스화)
- 인스턴스화된 총알에 속도 적용하기
- bulletCase 탄피 생성 (인스턴스화)
- 인스턴스화된 탄피에 가해지는 힘의 방향 설정, Random.Range(시작값, 끝값) 랜덤한 힘 가하기
- AddTorque()으로 탄피 회전
- 총알이 벽에 닿으면 사라지고, 탄피가 바닥에 닿으면 사라지기 때문에 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를 향해서 회전시켜주는 함수
'유니티' 카테고리의 다른 글
유니티 3D 쿼터뷰 액션게임 - 피격 테스터 만들기 (0) | 2022.04.24 |
---|---|
유니티 3D 쿼터뷰 액션게임 - Player 물리문제 고치기 / 벽 관통 방지 / 아이템 고정 (0) | 2022.04.23 |
유니티 3D 쿼터뷰 액션 게임 - 근접공격 구현하기 / Trail Renderer / 코루틴 (0) | 2022.04.22 |
유니티 3D 쿼터뷰 액션 게임 - 아이템 먹기 / 공전 물체 만들기 / RotateRound() (0) | 2022.04.21 |
유니티 3D 쿼터뷰 액션게임 - 드랍 무기 입수와 교체 (0) | 2022.04.20 |