본문 바로가기
개발자가 되어보자..공부공부/개발 일지

C# 유니티 공부 21 - 3D 쿼터뷰 예제3 (CoRutine코루틴, TrailRenderer, 물리 오류 해결, 원거리 공격, 근접 공격, 몬스터 피격)

by 묭묭이와소담이 2022. 12. 21.
반응형

★ 코루틴

메인루틴 Use() -> 서브루틴 일반함수 -> 메인루딘 use()   -------> 반복.
메인루틴 Use() + 코루틴 -> 서브루틴 일반함수 -> 메인루틴 Use() + 코루틴 ------> 반복

코루틴은 이와 같이 생성.

IEnumerator 함수명(){}

함수 내부에

yield return null 으로 1프레임 대기를 걸 수 있다.

yield return new waitForSeconds(시간/s) 은 시간만큼 대기를 걸 수 있다.

코루틴 함수를 실행하는 방법은

StartCoroutine(함수명()) 혹은 StartCoroutine("함수명")이다.

반대로 StopCoroutine은 멈추는 방법이다.

 

 

* 근접 공격

- 무기의 충돌 오브젝트 범위 생성. (Colider 범위 조절)

- 무기를 휘두를 때 잔상 이펙트 생성. (Trail Renderer)

- 위 2개의 컴포넌트를 비활성화 시켜 놓고, 코루틴을 이용하여 활성화/비활성화를 조건에 맞추어 반복 시킴.

- Attack 함수를 만들어서 Weapon 스크립트에 있는 코루틴 실행 함수가 들어있는 함수를 실행시킴.

(딜레이를 변수로 설정하여 공격간의 딜레이를 발생시킨다.)

 

 

 

* 원거리 공격

- 총알은 빈 오브젝트에 Trail Renderer로 흔적을 남겨주는 방법 이용.

- 총알과 탄피 모두 Rigidbody와 Colider를 설정하여 주고, OnTrigger/OnCollision를 사용하여 벽과 바닥에 충돌하였을 때 사라지도록 해준다.

- 총알과 탄피 모두 프리펩을 만들어 주고 코루틴과 IntantBullet() 이용.

 

 

- 총알 장전 효과 사용.

- 총알 발사는 근접 공격과 동일한 함수로 진행된다.

- 마우스로 공격을 할 때, 마우스가 가리키는 방향으로 플레이어를 회전 시키는 함수 생성. 

(기존 Turn 함수에 포함)

Camera.ScreenPointToRay()와 RayCastHit를 이용 

Camera.ScreenPointToRay() -> 카메라가 보여주는 스크린에서 월드로 Ray를 쏘는 함수. 

Input.mousePosition을 매개변수로 할 경우, 마우스의 위치로 Ray를 쏘게 된다.

 

Raycast로 Ray가 충돌한 부분의 좌표를 out으로 반환 시켜줌. (out은 반환값을 주어진 변수에 저장하는 키워드)

 

그 이후는 메인카메라 플레이어 고정 방식과 동일.

RayHit 벡터와 플레이어의 포지션을 비교하여, 그 차이 벡터값으로 플레이어가 바라보게 함. (Lookat 함수 이용)

 

 

 

* 피격 효과 구현

- Enemy 스크립트 생성하여 로직 작성.

- 넉백효과를 위한 RigidBody와 색상 변경을 위한 Material을 생성.

(★ Material의 경우 MeshRenderer<>().material로 접근이 가능하다.)

- onTriggerEnter로 근접무기와 총알에 충돌하였을 때, Weapon스크립트에 있는 데미지에 의해 체력을 마이너스 시킨다.

총알은 충돌 후 사라지게 해준다.

- 코루틴으로 넉백효과와 색상을 변경하는 로직을 작성한다.

(적의 체력이 0에 도달해 죽었을 경우의 조건문도 코루틴에 포함.)

 

 

 

* 물리 오류 해결

1) 자동회전방지

- 레이어를 사용. (Project Setting - Physics에서 레이어간 충돌효과를 무시하게 할 수 있음.)

- rigidbody.angularVelocity = Vector3.Zero (물리회전속도를 0으로 만듦)

angularVelocity 물리 회전 속도에 관한 키워드

2) 벽관통방지

- 레이어와 Ray를 사용.

- Wall 레이어를 가진 물체와 충돌하게 되면 IsBoder라는 bool값 변수가 True가 되게 함.

- Move 함수에서 IsBorder 조건을 추가 시켜줌.

 

3) 아이템충돌방지

- 아이템들이 플레이어와 충돌이 일어났을 때, 물리적인 효과를 방지해주어야 함. 

- 아이템들이 생성되어 바닥과 충돌하게 되면, rigidbody의 isKinematic 활성화시켜주고, 

Colider를 false로 바꾸어준다.

- 여기서는 Colider가 2개 들어가 있었다. (바닥과 충돌하게 되는 콜라이더와 플레이어와의 트리거 효과를 발생시키는 콜라이더) GetComponent로 컴포넌트를 가져올 경우, Inspector 창에서 가장 위에 있는 컴포넌트를 가져오게 된다. 

 

 

 

 

★ OnTrigger와 OnCollision이 사용될 때의 차이를 느낌상 알겠는데, 구체적으로는 조금 더 익숙해져야 할 듯.


 

 

 

 

 

 

반응형

댓글