[Cyphers] 클레어 구현내용 1차 점검
2023. 10. 12.

일정

                           : 구현완료

0923~0930 

0923 카메라 컨트롤 / 캐릭터 이동(New Input System) ,애니메이션

0924 카메라 컨트롤/ 논타겟팅 에임

0925 클레어 평타(LC) 오브젝트 생성/ 충돌처리 및 효과연출

0926 클레어 클렌징 빔(LCRC) / 충돌처리 및 효과연출

0927 클레어 프리즘(RC) 기능 -오전: 프리즘 평타 /오후: 프리즘 클렌징 빔

0928 프리즘 충돌처리 및 효과 연출

0929 23~28 작업 내용 점검 + 구현내용 사운드 작업

0930~1006 

0930 스킬 UI + 쿨타임 표시

1001 평타, 클렌징 빔 애니메이션 정리 / 충돌처리시 데미지 텍스트

1002  클레어 글래머러스빔(궁극기- E + LC 연타) 오브젝트/ 충돌처리

1003  엔젤 프레스 (Shift+LC)

1004  블링크(SPACE) 

1005 클레어 프랑켄 슈타이너(잡기- F) 

1006 평타,클렌징 빔,글래머러스 빔에 경직 효과 

 

1007~1011

1007 ~1011 구현 내용 점검 

 

구현 내용

 

플레이어 조작(이동,스킬), 카메라 컨트롤

new input system으로 action 구현

-W,A,S,D키로 앞, 뒤, 대각선으로 이동을 할 수 있다. 키 입력은 New Input System으로 받는다.

-마우스로 시점을 전환한다. 즉, 회전한다. 플레이어가 왼쪽으로 움직이고 싶다면 왼쪽으로 드래그, 오른쪽으로 움직이고 싶다면 오른쪽으로 드래그를 하면된다. Mouse.current.position.ReadValue를 사용해 마우스의 위치를 받아 처리했다. 이전의 마우스 위치와 현재 마우스의 위치를 비교하면 왼쪽으로 움직였는지 오른쪽으로 움직였는지 알 수 있다.

-스킬은 마우스와 키보드를 사용한다. 마찬가지로 New Input System을 사용하였으며, 동시 키 입력을 받는 경우 PlayerInput.actions["액션명"].Enbale과 Disable을 사용하여 다른 스킬의 중복을 막았다.

마우스 드래그에 따른 회전 및 플레이어 이동

애니메이션

애니메이션 구조

 

에임 조준

-플레이어에게 타격가능한 대상임을 알려주는 역할을 하며, 평타의 사거리이다. 에임이 조준되면 푸른색으로 변하며 사이즈가 줄어든다. 이는 애니메이션으로 구현하였으며, canvas에서 카메라의 forward 방향으로 ray를 쏘아 앞을 인식하도록 하였다.

-커서 UI 변경 : 플레이 시 커서가 보이지 않고 에임만 보이게 하기 위해서 Cursor.SetCursor를 사용해 texture를 변경해 커서가 보이지 않도록 해주었다. 에임의 이동도 마우스에서 한 것과 같이 마우스의 현재 위치를 받아 구현하였다.

에임 애니메이션

스킬구현: 스킬 오브젝트 생성, 타격 처리, 쿨타임 UI 구현

 

평타(LC)

좌클릭 허공/ 오브젝트 충돌 시 충돌처리 및 효과

-마우스 좌클릭시, 에임의 위치에 따라 앞으로 레이저를 발생시킨다. 단발성으로 나가는 레이저로 쿨타임이 존재하지 않아 계속 쏠 수 있다. 오브젝트를 맞추지 못하면 충돌 이펙트도 생기지 않는다.

 

프리즘(RC)

프리즘 생성

 

-마우스 우클릭시, 에임의 위치에 따라 프리즘을 특정 위치에 생성한다. 생성된 프리즘은 일정 시간동안만 존재하다가 사라진다.

 

클렌징빔(LCRC)

클렌징 빔

-마우스의 좌클릭과 우클릭을 동시에 하면, 클릭을 하는 시간 동안 앞으로 레이저를 발생시킨다. 평타는 손에서 발생하지만 클렌징빔은 눈에서 발사된다. new Input system에서 액션의 interaction 중 Hold와 Press를 사용해 홀드 되는 중에는 while문이 들어간 코루틴을 불러오고 Press되면 StopCoroutine하도록했다. 이를 이용해 LCRC시 LC가 발사되는 것도 막아주었다. 또한 평타(LC)의 충돌처리는 Physics.Raycast를 사용했지만 클렌징빔의 경우에는 Physics.SphereCast를 사용하여 범위를 설정하였다.

 

프리즘 평타/ 프리즘 클렌징빔

프리즘 평타/ 프리즘 클렌징 빔

-RC로 생성된 프리즘 오브젝트에 평타와 클렌징빔을 사용하면 프리즘의 범위 내에 있는 오브젝트 중 "적"을 타격할 수 있다. 프리즘에 반사되어 생성되는 평타와 클렌징빔은 프리즘의 중앙에서 생성되어 발사된다.

=> 평타와 클렌징빔의 충돌처리 부분에서 프리즘인지 CompareTag을 사용해 구분했다. 

=>프리즘은 범위내에 있는 개체들을 인식하고 구분해야 하므로 OverlapSphere를 사용하였다. 

=> 프리즘에 반사되어 생성되는 평타와 클렌징빔의 오브젝트는 오브젝트 풀링을 사용해 미리 생성해두고 SetActive(true), SetActive(false)를 해주었다.

 

쿨타임 UI 및 기능

-스킬을 사용하고 쿨타임 동안에는 해당 스킬의 키입력이 들어와도 스킬이 발동하지 않는다.while문에서 쿨타임 시간을 측정해 while문 내에서만 UI가 표시되도고 이 시간동안 fillamount를 조절한다. fillamount는 남은시간/전체 쿨타임 시간으로 표시해주었다.또한  이 때에는 bool변수를 사용해 쿨타임이므로 스킬을 사용할 수 없도록 코드를 추가했다.

 

https://youtu.be/JT9Z3KVJVos

클레어 1차 구현 영상

 

구현 시 어려웠던 부분

1. 카메라 컨트롤

>> 예상보다 생각해야할 것이 많아 오래걸렸다. 에임에 따라 자연스럽게 움직이게 해야했기 때문이다. cinemachine을 활용하려 했지만, 오히려 추가적으로 처리해줘야할 것이 많아 기본 카메라를 코드로 컨트롤하도록 했다. 카메라는 플레이어의 뒤에서 플레이어가 바라보는 방향을 따라 움직인다. 플레이어가 마우스의 위치를 받아 회전하므로, 그 회전값을 받아 같이 회전한다.

 

2. 캐릭터 스킬 입력 시 중복 키 처리

>> New Input System을 사용하다 보니 (비교적 정보가 적어) 구글링에 어려움이 있었고, 처음에는 액션의 우선순위를 정하는 방법을 구하려 했으나 찾지 못하였다. 결국 액션에 직접 접근하여, 특정 액션을 disable되도록 하고, 키 입력이 끝나면 enable하도록 처리했다. 이 부분에서도 액션에 직접 접근하려면 어떤 API를 써야하는지 알아내는데 꽤 시간이 소요됐다.

 

3. 클렌징 빔의 while 문 처리

-일반적으로 대부분의 스킬은 한번 누르는 순간에 실행되어버리지만, 클렌징빔(LCRC), 즉 쌍클릭 스킬의 경우 누른 상태에서 홀드되는 부분이 있었다. 1차적으로 홀드되는 부분에 대한 키입력을 new Input System 의 interaction으로 구현하는데 시간이 추가적으로 필요했고, 2차적으로는 이 클렌징 빔이 지속되게 하는 동안 while문을 작성하면서 생각해줘야 할 부분이 여러가지로 발생했다. 예를 들어, 충돌 이펙트를 추가하거나 할 때 while문 내에서 함수를 한번만 호출해야 하는데 여러번 호출 된다거나 하는 문제가 있었다. 또한 애니메이션을 추가해야할 때도 while문을 생각해야했다. 이런 경우에는 애니메이션을 두개로 분리하여 while문 실행 동안에는 기존 애니메이션의 상태를 유지하는 애니메이션을 실행하도록 구현했다.

 

 

느낀점

-구현 시 코루틴을 정말 많이 사용하게 된다는 것을 느끼는 프로젝트였다. 처음 코루틴을 접할때 어떻게 쓰게 될지 감이 잡히지 않았었는데, 직접 사용하게 되니 유용하기도 하고 필요한 부분 자체가 많다고 생각되었다.

-단계적으로 새로운 걸 만들어나가면서 성취감을 느꼈다. 처음에는 어떻게 만들어야할까 막막했는데, 일단 첫 단계를 단순(ray를 쏜다면 어디서 생성되어야할까부터 생각하는 식으로)하게 만들고 하나씩 응용해가면서 구현하였다. 

-추석에 생각보다 개발을 많이 못해서 일정이 꼬여 아쉬움이 많이 남는다. 애니메이션도 아쉽다. 클렌징빔의 경우 눈에서 나가는 걸 강조하기 위해 손은 허리에 얹고 앞으로 고개를 숙이는 동작이 포인트인데 적절한 것을 아직 찾지 못했다. 찾게 되면 수정할 예정이다.

 

myoskin