유니티

유니티 3D 쿼터뷰 액션 게임 - 근접공격 구현하기 / Trail Renderer / 코루틴

nock_ji 2022. 4. 22. 04:05

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

 

 

👾  메인 액션 - 근접공격 구현하기  👾

 

 

 


 

1.  변수 생성

무기 정보가 있는 새로운 스크립트 생성

Player 손에 있는 무기 컴포넌트에 무기 스크립트 추가

 

 

근접 공격과 원거리 공격이 있기 때문에 해당 타입을 정해줄 열거형을 사용

무기 타입, 데미지, 공속, 범위, 효과 변수 생성 

 

 


 

2. 근접 공격 범위

 

- 공격 범위가 될 Collider의 위치, 크기 조정 

- Weapon 스크립트의 Melee Area (Box Collider)은 미리 만들어둔 공격범위 변수에 할당

- 근접공격 태그를 새로 생성하고 지정 (Melee)

- Is Trigger 체크 활성화 

 


3. 근접 공격 효과

 

Trail Renderer

잔상을 그려주는 컴포넌트 

 

- Material 설정하기

- 꼬리모양을 내도록 Width Curve 설정 

- Time 값을 줄여서 잔상 길이를 짧게 조절 

- Min Vertex Distance로 잔상 꺾임을 설정 (값이 클수록 각진 모양이 나옴) 

- Color로 잔상 색상을 설정 

- 완성된 Trail Renderer를 변수에 할당 

 

 

 

- 우선! Effect의 Trail Renderer와 Weapon Hammer의 BoxCollider는 비활성화

 

 


 

4.  공격 로직 - 코루틴

 

✏️  Player가 무기를 사용하는 로직

- 코루틴 함수를 이용한 컴포넌트 활성화/비활성화 반복

- 꺼둔 Trail Renderer를 킴 

- Trail Renderer와 BoxCollider를 시간차로 활성화 컨트롤 

 

 

👾  일반 함수 

메인 루틴 ➡️ 서브루틴 ➡️ 메인루틴 (교차실행)


👾  코루틴 함수 Co-Routione 

메인루틴 + 코루틴 (동시실행)

 

 

📌  IEnumerator

열거형 함수 클래스

 

📌  yield

결과를 전달하는 키워드 (코루틴 함수에서 꼭 한개이상 있어야 함 )
yield 키워드를 여러 개 사용하여 시간 차 로직 작성 가능

 

 

📌  WaitForSeconds()

주어진 수치만큼 기다리는 함수

Trail Renderer와 BoxCollider를 시간차로 활성화 컨트롤 

yield return new WaitForSeconds(0.1f);
meleeArea.enabled = true;
trailEffect.enabled = true;

yield return new WaitForSeconds(0.3f);
meleeArea.enabled = false;

yield return new WaitForSeconds(0.3f);
trailEffect.enabled = false;

0.1초 대기하고 collider meleeArea 활성화, trailEffect 활성화 

0.3초 대기하고 collider meleeAra 비활성화

0.3초 대기하고 trailEffect 비활성화

 


📌  yield break

코루틴 탈출 가능


📌  StartCoroutine("문자열") 

코루틴 실행 함수


📌  StopCoroutine("문자열")

코루틴 정지 함수 

 

 


 

5. 공격 실행

 

 

🔻 Player 로직에서 키입력, 공격딜레이, 공격준비 변수 선언 

bool fDown; //키입력
bool FireReady; //딜레이
float fireDelay; //준비완료

 

 

 

🔻 기존에 지정해둔 현재장비 변수를 Weapon 타입으로 변경 

Weapon equipWeapon;

 

 

 

🔻 공격함수 및 입력버튼 추가

void Update()
{
	Attack();
}

void GetInput()
{
	fDown = Input.GetButtonDown("Fire1");
}

 

 

 

🔻 공격 중에는 이동 불가되도록 설정 

bool FireReady = true;