닐리의 2기 애니메이션 제작 #1

6.1

닐리의 컨셉은 가일이다. 어쩌다보니 그렇게 됐다. 필살기 계획은 다음과 같다.

  • 파이어볼(FireBall) : ←모으고 → A, B
  • 섬머솔트킥(RollingJumpKick) : ↓ 모으고 ↑ K
  • 날기(Wing) : 공중상태에서 ↑모으기. 다 모이면 앞으로 날아간다.
  • 메테오(Meteor) : ← 모으고 →←→ B. 초필

마법사를 격투 게임에 녹여내려니 파이어볼 외에는 생각이 안나고, 가일이니까 대공기 하나 쯤 있어야 하니 섬머솔트킥을 넣었다(?)

그 외에도 추가 모션들이 필요하다. 앨리스 때 설정한 것에서 스턴이 빠지고 좀 더 추가됐다.

  • 방어 (Block)
  • 앉아서 방어(CrouchBlock)
  • 소점프킥(SmallJumpKick)
  • 소점프킥 착지(SmallJumpKickLanding)
  • 일직선 날아가기(DamageFlying)
  • 날아가 벽에 부딪히기(DamageFlyingWall)
  • 바닥에 엎드려 떨어지기(KnockDownFront)
  • 공중에서 바닥에 꽂히기(DamageJumpSlam)
  • SlamAir의 넉다운 모션(KnockdownSlam) : DamageSlam에서 짤라쓴다.
  • 회전하며 맞기(DamageScrewCW)
  • 회전하며 맞기(DamageScrewCCW)
  • 맞고 날아가기(DamageKnockback) : DamageJumpHeavy와 같다.

모으기 기술의 특징은 사용이 어려운 대신 발동딜레이가 짧다는 것이다. 앨리스의 기술들이 6~12프레임의 발동딜레이를 가진다면, 닐리는 좀 더 빨라야 한다. 모션을 만들 땐 이 점에 주의해야 한다.

날기를 구현하기 위해선 빗자루가 필요하다. 마법사니까!

아무리 간단한 사물이라도 꼭 러프를 그려보는 편이 좋다.오랫만에 다 까먹었을 것 같은 모델링을 해보자.

블렌더엔 커브챔퍼기능이 없다. 이게 없어서 그동안 애드온을 깔아서 썼었는데, 블렌더가 버전업되며 더 이상 그 애드온을 지원하지 않게 되었다. 혹시 4.0의 커브에 챔퍼 혹은 베벨기능이 추가됐을까? 싶어서 살펴보았지만 보이지 않는다.

그런데 유튜브에 튜토리얼을 찾아보니 Curve가 아닌 Mesh상태에서 베벨을 준 후 커브로 옮겨오는 것이 아닌가…? 그..그러네?! 왜 이 생각을 못했지? 맥스 기준으로 생각하다보니 당연히 있어야 할 것이 없다는 생각이었는데, 블렌더는 엣지 모델링이 가능하므로 이 쪽에 맞추어 생각을 해야 한다. 오늘의 깨달음. 커브의 베벨을 사용하려면 메쉬를 써라.

모델링을 하고

색칠을 하자.

6.2

이제 모션을 러프하게 제작한다. 이 모션들을 기반으로 코드를 짜자.

익스포트를 해서 본격적으로 코드를 짜려고 하니 버그가 말도 안되게 많이 나왔다. 한숨 잔 다음 맑은 정신으로 도전하는 편이 좋겠다.

타격 시 밀리는 양에 따라 먼지를 조절하고 싶어서 파티클의 이미터에 접근해야 하는 코드가 필요했다. 그런데 유니티의 버스트는 구조가 이상하다.

            foreach (ParticleSystem particle in particles)
            {
                ParticleSystem.EmissionModule emmision = particle.emission;

                int burstCount = emmision.burstCount;
                ParticleSystem.Burst[] bursts = new ParticleSystem.Burst[burstCount];
                emmision.GetBursts(bursts);

                for (int i = 0; i < bursts.Length; i++)
                {
                    bursts[i].cycleCount = (int)(Mathf.Abs(pushDistance) / 0.1f);
                }

                emmision.SetBursts(bursts);
            }

GetBurst()는 Burst객체를 리턴하고 GetBursts()는 배열을 리턴해야…. 할 것 같은데 int를 리턴한다.(??) 기존 버스트의 숫자하나를 바꾸고 싶을 뿐인데, 새 인스턴스를 만들어서 갈아끼우는 비효율적인 방식을 쓰고 있다. 알고 보니 GetBurst()로 얻은 객체도 읽기 전용인 듯? Get은되는데 Set이 안된다.

으..모으기 처리도 쉽지 않다. 키가 많이 충돌하는데, 조용한 새벽에 각잡고 봐야할 것 같다.

6.3

키처리 완료. 이제 1초를 모아야 장풍이 나간다. 어우.. 어렵다. 그런데 앉아서 대기군인 하려니 키 충돌이 있다… 세상에! 21세기에 키충돌이라니!

…를 다시 조사해보니 코드에 L,R입력 중 하나만 받게 되어 있었다. 둘 다 누르면 선입력된 것만 적용된다. 그..그럼 그렇지.

섬머솔트 킥! 잘 어울린다. (?)

발사체는 현재 데이터가 없는데, 생각보다 많은 데이터가 필요하다. 이에 대한 시스템을 먼저 구축해야 할 것 같다.

6.4

오늘의 깨달음.

유니티의 c#스크립트에서 그냥 tag를 불러와도 해당 게임오브젝트의 tag를 알아서 리턴한다. 굳이 .gameObject.tag 로 안써도 된다. 원래 이랬나..?!

발사체를 맞았을 때의 밀림처리, 발사체가 화면 밖으로 나갔을 때의 처리등을 구현했다. 풀매니저는 필요없을 거라 생각했는데, 안만들었으면 큰일날 뻔했다.

그냥 게임매니저 아래에 마구잡이로 저장해놓았던 리소스들은 순식간에 늘어난다.

닐리의 기본 콤보. 모으기 커맨드는 정말 어렵다.

댓글 남기기