전투 게임 3일차

2024. 1. 16. 23:43GAME/Unity

일단 '공격속도' 라는것을 구현해야 하는데, 일단 처음에 생각한것은 AI측에서 State제어를 걸어주는것. 하지만 이것은 AI가 또 스텟 참조를 해야한다. 그리고 공격속도라는것은 모든 캐릭터에 적용되는 사항이라서 다른 방법이 필요할 것 같다.

 

그렇다면, 공격속도를 제어해주는 것은 결국 캐릭터측에서 존재해야 할 것 같다. 

 

다시 말하지만 공격속도는 모든 캐릭터에서 존재하여야 한다.

그리고 공격속도는 추상적인게 아니라 어떠한 실체가 제어를 해 주어야 한다.

근데 지금은 모든 캐릭터가 인터페이스만 상속받고있다. 

 

따라서 캐릭터를 관리하는 상위 클래스가 존재하여야 한다.

 

갑자기 Knight is a Char 와 Char has a Knight 와 조금 헷갈렸다.

 

Char has a Knight는 애초에 뭔가 말이 안되긴한데 

 

그렇게 하려면 또 Char에 캐릭터 동작들을 생성해야 하기 때문에 이상함 

 

일단 대충 이렇게 코루틴을 이용해서 공격속도를 구현할 수 있고

 

이제 캐릭터에 해당하는 아이들은 모두 이 클래스를 상속받으면 된다!

 

자 그렇다면 이제 상속을 진행하고

이런식으로 부모의 대기시간 함수를 호출하고 부모의 변수를 체크하여서 상속을 통한 대기시간을 구현할 수 있다.

 

하지만 여기서 좀 맘에 안드는 부분이 있는데 

 

동일하게 계속 체크를 해 주어야 한다는것... (base.WaitAttack과 IsAttack을 계속 체크 해 주어야 한다.)

 

또 여기서 생각나는 방법은 2가지인데 하나는 부모가 자식을 알고있는것, 하나는 델리게이트를 이용한 방법

 

일단 델리게이트를 해 보자면..

 

이렇게 할 수 있을 것 같은데, 이것도 뭔가 이상함.

 

계속 호출해줘야 한다는것이 마음에 들지 않는다. 따라서

 

프로세스상 공격을 할때 기본으로 대기시간이 먼저 호출이 된 다음에, 공격이 호출이 되어야 한다....

 

그렇다면? 역순으로 진행되는 과정이니

 

이거는 부모가 자식을 알고있는것이 맞지 않을까?

 

 

그래서 이런 구조로 만들었고..

 

자식 awake에서 부모에 넣고

 

애니메이터와 스텟같은것들도 결국 모든 캐릭터에 존재해야 하기에 부모 클래스에 넣겠음.

 

이제 그러면 인터페이스에 Get Set 메서드는 없어도 될 것 같으니 지우고

 

.. 근데 사실 인터페이스 자체를 없애도 될것같긴한데... 뭔가 행동의 분리를 하고싶어서? 일단 이렇게 하겠음.

 

자 이제 AI에서 Character를 받고. 수정을 마무리 하면 된다.

 

 

근데 좀  더 생각해보니까 그냥 Character도 인터페이스를 상속받는게 맞지 않나 싶긴한데. 이것도 일단 해보고 결정.

 

적용을 시켜보면?

서로 공격속도를 다르게 하니 잘 적용된 모습!!

 

이제 공격속도를 적용한 애니메이션을 해야하는데, 그 전에 공격속도 수치에 대해서 생각해보자면,..,.

 

초당 공격이 좋을 것 같다. 초당 공격을 적용하면 예를들어서 공격속도가 3이면 초당 공격을 3번한다. 따라서 1/3 초마다 공격을 하면 된다.

 

하지만 문제점이 하나 발생한다. 바로 애니메이션이다. 캐릭터마다 애니메이션이 다르고, 공격속도에 따라서 애니메이션의 스피드를 조절해야 하기 때문이다.

 

예를 들어서 공격속도가 3이고 애니메이션의 속도가 0.5초라고 가정해보자.

 

1초에 공격을 3번 해야하지만, 애니메이션 속도가 0.5이기에 1.5초에 3번이된다. 이로서 애니메이션 스피드를 조절해야만 한다.  유니티는 애니메이션 스피드를 배율로 조절할 수 있다..

 

1/3은 0.33....초이다. 0.5초가 0.33초가 되기 위해서 몇배가 곱해졌는지 알아야 한다. 따라서

 

0.5 * X = 0.33이라는 식을 세우고,

X = 0.33 / 0.5

X = 0.66이라는 값을 얻을 수 있다.

 

즉 0.5초가 0.33초가 되기 위해서는 0.66배가 되면 된다. 즉 1.66배로 애니메이션을 설정하면 된다!

 

는 나의 착각이였고..ㅎㅎ 실수였다.

 

다시 생각해보면? 애니매이션의 배수가 높아질수록 애니메이션 실행은 빨라진다. 즉 초가 줄어든다는 사실.

 

그러므로 식을 다시 만들어본다면 

 

애니메이션 초 / X배율 = 초

 

즉 0.5초 / X = 0.33 

 

그러면? X = 1.5..... 1.5배 빨라지면 0.33초마다 공격을 할 수 있다는 결론!

 

아우 오랜만에 산수를 하니까 헷갈리네; 

 

이제 공식을 새웠으니 적용을 하러 가보자!

 

자 그럼 또다른 문제가 있는데! 특정 애니메이션 클립을 알아야 한다는것! 일단 캐릭터 클래스에서 받아오자.

 

이런식으로 계산을 진행하고...

 

 

애니메이터의 파라미터로 애니메이션의 배율을 조절할 수 있따.

 

Multiplier에 파라미터를 넣어주면 됨!

일단 대충 되는것같으니 이만하고, 코루틴 수정과 공격 콜라이더 스크립트로 관리하고 등등을 마저 하면 될듯. 이만

 

'GAME > Unity' 카테고리의 다른 글

전투 게임 4일차  (0) 2024.01.17
InputManager  (0) 2024.01.15
전투 게임 2일차  (0) 2024.01.14