11.30
그레텔은 이제 초필만이 남았지만, 초필의 구성이 제법 복잡하다. 캐릭터를 하나 만들 때마다 거의 시스템을 개편하는 느낌인데, 솔직히 말해서 오로라 이후에 코드 건들 일이 없을 줄 알았다. 하지만 게임제작이 그리 녹록치가 않구나…

그레텔은 공중에서 초필이 발동되어야 한다. 이건 문제가 아닌데, 이로 인해 몇가지 예외사항이 생긴다. 어쨌거나 초필자체는 정해진 콤보 연출 방식이므로 잡기로 구현할텐데, 공중에서 맞았을 때는 어떻게 할까? 달래나 벨도 콤보방식이지만 지상에서 발동되기 때문에 상대가 공중에 있을 경우 강제로 끌어내린다. 이는 크게 어색하지 않다. 하지만 상대와 그레텔이 둘 다 공중에 있을 경우, 바로 아래로 내려오면 모양이 이상하다. 때문에 지상까지 끌고 내려가는 모션이 필요해진다. 또한 마무리 공격을 공중에서 할 때 바닥을 향해 발차기를 하고 싶으므로 이에 따른 추락모션도 필요하다.
그리고 무엇보다도…이 모든 게 예측이 안되므로 모션은 더미로 만들고 구현부터 해야 한다. 시작해보자.
12.2
벌써 12월이다. 최근 들어 유니티가 자주 멈춰서 울며 겨자먹기로 유니티 6로 업데이트했다. 회사측 말로는 가장 완벽한 유니티라는데… 어디 한 번 보자.

난장판이고, 멈춤 현상은 켜자마자 일어났다.

TMPro의 HDR처리가 좀 바뀐듯? 해서 셰이더 코드를 보니 HDR처리가 안되고 있었다. UI라서 안쓸 거라고 생각했나?
여전히 자주 멈춘다. 원인이 뭘까…
12.3
멈춤의 원인은 다름아닌 다이나믹 본이었다. 이 플러그인이 어떤 문제를 일으키는 지는 몰라도 패키지 매니저에서 새로 임포트를 하니 문제가 사라진 것처럼 보인다. 속단할 수는 없지만 지금으로선 멈추지 않고 잘 돌아간다. 외국의 포럼에서 깃 플러그인때문에 멈춘다는 이야기를 본 적이 있는데, 정식으로 받지 않은 플러그인에 대해서 멈춤현상이 있는 것 같다. 확실한 것은 작업을 더 해보아야겠지만… 지금은 너무 졸립다. 일단은 잠
12.4
멈춤의 원인이 다이나믹본은 맞는 것 같은데, 패키지 매니저에서 새로 임포트를 하니 해결된 것 같은 현상은 섣부른 판단이었다. 게임은 여전히 멈춘다. 하지만 왜 갑자기 이런 현상이 일어난 걸까… 그레텔의 작업을 하며 심해진 현상인데, 그레텔의 본 설정에 문제가 있는 것일까? 챗GPT는 시스템 과부하에 대해 이야기하지만, 그건 아니라고 장담할 수 있다. 그레텔은 닐리의 절반도 안되는 본을 사용 중이다. 디버깅을 해본 결과로는 게임이 멈추어도 코드는 돌아간다.
혹시 PauseBone이 문제가 된 것은 아닐까 생각해본다. 지금은 본을 리셋하기 위해 컴포넌트를 온오프 하는 다소 무리한 방법을 사용하고 있다. 일단 Pause부분의 코드를 주석처리해서 동향을 살피는 편이 좋겠다. 며칠 째 진전이 없다. 야근해서 기운이 없기도 하지만, 프로그램은 이런 큰 문제가 한 번 터지면 언제 끝날 지 기약이 없다는 것이 더 큰 문제다… 부디 예상이 맞았으면 좋겠다. 제발 멈추지 마!
12.5
계엄령으로 시끄러운 하루였다. 세상에! 내가 살면서 계엄을 맞아보는구나! 거지같은 추장때문에 내가 고생이 많다.
게임 중 멈추는 문제는 드디어 해결한 것처럼 보인다. 제법 오랜시간동안 테스트를 했는데도 멎지 않는다. 아마도 다이나믹본의 컴포넌트 enable을 지나치게 자주 on/off한 것이 문제인 것처럼 보인다. 하지만 이건 이미 alpha버전에도 적용되어 있었는데, 어째서 지금와서 문제가 됐던 걸까 .

그래서 이제 드디어 본게임 구현! 사실 멈춤 이슈외에도 이 구현자체가 꽤 어려웠던 편이다. 구현하고 나니 타이밍이 형편없다. 이제 본격적으로 수정해보자.
12.6

일단 애니메이션 완료. 의외로 맞는 쪽의 애니가 더 어려웠다.
12.7
유니티6로 바꾼 후 좋은 점 하나는 로딩이 빨라졌다는 점이다. 이것이 캐시가 리셋되며 불필요한 데이터를 정리한 덕인지, 아니면 실제로 로딩시간이 개선되었는지는 알 수 없지만 어쨌거나 좋다.
12.8

쉽지 않은 작업이다. 코드를 오랫만에 짜서 그런 것 같지는 않고 이제는 무언가 기능을 추가할 때 앞선 기능과 많이 충돌한다. 나름대로는 최대한 정리를 하며 짠 것인데도! 그래도 결국 끝은 온다. 며칠동안 계속 리팩토링을 한 결과 이제 예외처리만 좀 남은 상태다. 멈추는 문제 또한 완전히 사라진 것 같다. 결국 다이나믹 본의 잘못된 사용이 문제였다. 이 문제 때문에 스트레스를 많이 받아서 그만둘까 생각했었는데, 해결돼서 참 다행이다.

이제 남은 이슈 중 가장 큰 문제. 초필의 동시타에 문제가 발생한다. 이럴 경우는 정말정말 드물지만 처리를 해두어야 한다.

요래되어야 정상이다. 머리 아프겠다.
이제 남은 것들은
- 지그재그로 사용할 일자 검기
- 워프할 때 사용할 컷아웃(셰이더)처리
- 워프할 때 가시 방향처리
- 제자리 점프킥 애니메이션 수정
12.9

일자 검기는 처리했고, 잔상 셰이더를 만들자.

잔상 셰이더는 솔리드에 부착해야 한다. 이걸 하려고 보니 스크린UV가 필요한데, 스크린UV는 Hclip좌표가 필요하다. 그러니 이걸 구한 후에 화면기준으로 왜곡을 일으키고 또다시 HClip변환을 해주어야 한다. 아휴. 이게 무슨 낭비야.

낭비는 제쳐두고, 그냥 잘 안되는 중… 어떻게 짜야하지?


아….ScreenUV는 버텍스 셰이더에서 계산하면 계산값이 정확하지 않다. 픽셀셰이더에서 계산해야 한다. 하지만 버텍스 offset은 버텍스 셰이더에서 써야 하는데..?!
오늘의 깨달음. 유니티에선 정확한 화면비를 계산하려면 _ScreenParams를 사용하면 된다.
half r = _ScreenParams.x / _ScreenParams.y;

오늘은 타임오버. 내일 다시 고민해보자.
12.10
지금까지 내가 ScreenUV를 다루는 방식은 이것을 계산해서 다시 UV에 적용하는 것이었다. 이는 주로 포스트프로세싱이나 디졸브같은 효과에 사용했었기 때문인데, 이번에는 경우가 좀 다르다. UV가 아니라 메쉬에 적용해야 하는 것이다.
그렇다면 생각을 좀 달리 해야 한다. 회전벡터에 강도를 곱하는 형태여야 하지 않을까.
일단 회전벡터를 구하자. Z는 필요없으므로 2차원 계산으로 충분하다.
angle = half2(cos(angle), sin(angle));
이제 여기에 사인파동을 곱해줄 것이다. 수직이라면 단순히 ScreenUV를 적용하면 좋겠으나 회전이 필요하다. 회전행렬 계산법은 다음과 같다.
float s = sin(Rotation);
float c = cos(Rotation);
float2x2 rMatrix = float2x2(c, -s, s, c);
UV.xy = mul(UV.xy, rMatrix);
하지만 이 중, v만 필요하다. 행렬곱을 풀어쓰면 u*c-s*v, u*s+v*c가 되므로 뒤의 수식만 취하면 최적화가 될 것이다.
float v = uv.x * s + uv.y * c;
이제 이를 주기적인 사인파동으로 만들어주고
v = sin(v * 3.14 * 50);
다시 이를 회전벡터와 곱한다.
positionOffset.xy += angle * v * _SmearScale;
그러면

만세!
이걸 이제 코드에 적용하면

이렇게 된다. 야호!
이제 힘든 건 끝났고, 내일은 이걸 여기저기 붙여보자.
12.11
초필도 끝났다. 하지만 애니메이션 작업은 남아있다. 세컨더리 해야 한다. 아이고..
12.12

세컨더리 작업 중. 이렇게 몸을 관통하는 본들을 일일이 잡아주어야 한다. 허드렛일에 속하지만 또 대충 하면 완성도가 많이 떨어져 보인다. 머리를 비우고 차근차근 진행해 보자.
12.13

여전히 세컨더리 작업. 새삼 느끼는 것인데, 데미지 모션이 정말 많구나.
12.15

세컨더리 작업 완료 + 벽점프 구현. 아휴. 손 마이 간다.
원래 오늘 이펙트 들어가려고 했는데 세컨더리가 생각보다 오래 걸렸다. 그레텔의 코트자락은 세컨더리가 그나마 쉬운 편인데도, 캐릭터가 추가될때마다 처리해야 하는 잡기 모션의 양이 점점 커지기 때문에 오래걸린다. (게다가 그레텔은 잡기가 2개나 추가되었다!)
개발 볼륨이 달라졌으므로 마음가짐도 달리 먹어야 한다. 모든 상황이 이전과 같지 않은데, 생각이 이전에 머물러 있으면 그 차이가 스트레스로 다가오기 쉽상이다.
하지만 어쨌거나 그레텔의 애니메이션은 진짜로! 끝난 것처럼 보인다. 이펙트로 넘어가자.
서비스 스샷이 없어서 그런가 댓글이 휑하군…orz
요즘 야근하느라 기운이 없어서
I’m glad you fixed the freezing issue. As someone who has coded before, I can relate to the absolute struggle of a minor issue messing everything else up. I hope work hasn’t been too stressful on you.
문제는 언제나 있었고, 언제나 해결되어 왔어요. 이번에도 그럴 겁니다. 걱정해 줘서 고마워요.
접수액션이 좋으면 몰입감이 올라가더라.
오늘 스파6 마이 티저가 떴는데 이번주는 아주그냥 도파민 파티구만…
테리는 엄청 멋지게 나온 걸 봤는데. 마이가 나왔구나. 보러 가야겠네… 라고 생각하고 있는참에 알고리즘이 알아서 보여줌. 역시 캡콤이야
교수님 오랜만에왔더니 더욱진보하셨군요 대학원열어주세요
네. 이거 완성해서 100억 재단이 만들어지면요.(?)
농담이 아니고 가능하시면 개인강의 듣고싶습니다 우선 스팀출시해주시면 바로 구매하겠습니다 교수님 충성충성
ㅎㅎ감사합니다. 게임을 다 만든 후에 강의쪽으로 방향을 잡고 있기는 합니다. 어쨌거나 빨리 완성했으면 좋겠어요.
Hello master! I’m really excited about your game. I’m doing my part by spreading the word. Tell me. When will we have an update so we can play and promote this incredible project of yours even more?!
메일로 답을 드렸어요. 의도치 않게 그렇게 됐네요.ㅎㅎ
잔상 이펙트가 훌륭하군!
감사합니다. 덕분이지요!