초고교급 희망

[수학레인저] 개발 일지 5화 (23년 7월 2주차) 본문

Game/개발 일지

[수학레인저] 개발 일지 5화 (23년 7월 2주차)

연모링 2023. 7. 9. 16:06
728x90

1. 미니언 FSM 시스템

 

이번엔 보스 몬스터의 공격 패턴 중 하나인 미니언을 구현하였습니다.

ej님이 이전에 구현해두신 유한상태기계(FSM) 클래스들을 상속받아서 사용했습니다.

FSM에 대한 설명은 여기로...

https://ymthebest.tistory.com/30

 

미니언의 상태는 idle, move, dead, behit 4가지가 있습니다

근데 지금 behit는 구현이 안 되어서 공격 당하면 상태가 dead로 설정되고 바로 죽어버립니다.ㅠㅠ

dead로 가기전에 behit 상태를 추가해서 이펙트가 출력될 수 있도록 앞으로 수정해야합니당...

 

보스의 상태가 미니언을 불러내는 공격이 되었을 때

오브젝트 풀링으로 미니언 프리팹들을 생성 합니다.

그럼 생성된 미니언 클래스에서 미니언 스테이트 머신을 생성해서 각각 동작하기 시작합니다

 

미니언의 숫자는 최소 5개에서 최대 15개까지 입니다.

아래는 미니언을 랜덤 갯수만큼 생성하는 부분입니다.

int randomIndex = Random.Range(5, 15);

for (int i = 0; i < randomIndex; i++)
{
    GameObject minionObj = minionPool.GetObject();

    minionObj.transform.position = boss.transform.position + minionTransformArr[i].position;
}

처음 생성된 미니언의 상태는 Idle입니다.

spawn되고 1초 뒤 Move로 상태가 변합니다.

(근데 그 전에 공격당하면 바로 dead로 갑니다)

 

미니언은 플레이어를 추격합니다.

그러다가 플레이어와 충돌하면 튕겨나갑니다.

튕겨나가는 각도를 어떻게할지 생각해봤습니다.

유니티에 Vector3.Reflect라는 함수가 있더라구요. 그래서 사용해봤습니다.

Vector3.Reflect

이렇게 입사각과 충돌한 면의 법선을 넣으면 반사각을 반환합니다.

참고: https://docs.unity3d.com/kr/530/ScriptReference/Vector3.Reflect.html

근데 문제점이... 플레이어라는 울퉁불퉁한 선에 충돌하니까 그 때 마다 법선을 어떻게 처리해야할지...

일단은 플레이어가 평평한 것처럼 넣어뒀습니다.

그랬더니 튕겨나가는 모습이 예쁘지가 않아서 (당연함) 이 부분도 고민을 좀 더 해봐야할 것 같습니다.

개발일지인데 왜 점점 해명문, 사과문 같을까요...

 

그리고 버그가 엄청나게 많았는데...

EJ님이 도와주셔서 수정했습니다 🥹

 

일단은 Dead 상태에서는 사용한 미니언을 오브젝트 풀에 반환합니다.

이 때 다음에 오브젝트 풀에서 꺼냈을때 정상적으로 사용할 수 있도록 미리 Idle로 상태를 설정하고, hp도 초기화 해둡니다.

이 초기화를 안 해둬서 미니언을 꺼내쓰고 반납하는 부분에서 이상하게 작동했었는데 이제 괜찮아졌습니다.

그리고 시작하자마자 공격에 맞아서 죽을수도 있으니까

idle에서도 바로 dead로 갈 수 있게 수정했었습니다.

그 밖에 FSM 하기로 했는데 지금 FSM 스럽게 상태가 동작하지 않아서 리팩토링을 해야합니다. (+behit 추가 필요)

 

2. 게임 일시정지, 종료

https://docs.unity3d.com/kr/530/ScriptReference/Time-timeScale.html

 

Time-timeScale - Unity 스크립팅 API

The scale at which the time is passing. This can be used for slow motion effects.

docs.unity3d.com

 Time.timeScale = 0F;

타임 스케일을 0으로 설정하면 게임에 관련한 모든 것이 정지됩니다.

 Time.timeScale = 1.0F;

1.0으로 설정하면 다시 원래대로 돌아옵니다.

 

이 부분도 조심히 써야겠다고 느꼈습니다.

timeScale이 0이 되는 순간 게임의 모든 것이 멈추기 때문에

어떤 경우에서도 꼭 원래대로 잘 돌아올 수 있게 주의 해야합니다...

처음 쓸 때 주의 안해서 또 엉망진창 됐었다는 뜻

 

3. 안드로이드 빌드 세팅

주의할 점! 꼬옥 64비트로 빌드해주어야 합니다

안 그러면 정상적으로 실행이 안되더라구요

 

"2019년 8월 1일부터 Google Play에 게시되는 앱에서는 64비트 아키텍처를 지원해야 합니다."

출처: https://developer.android.com/distribute/best-practices/develop/64-bit?hl=ko

 

build settings - player settings - player - other settings - configuration

에서 

Scripting Backend를 IL2CPP로 설정하고

Api Compatibility Level도 .Net Standard 2.1로 설정했습니다.

그리고 Target Architectures에서 Arm v7,  Arm 64 모두 체크 해줍니다.

IL2CPP만 선택하면 64비트로 해야한다고 주의 표시가 뜨는데 Arm 64로 선택하면 64비트에서 동작합니다.

 

이렇게 마무리해서 중간 평가용 빌드가 완성되었습니다

함께 고생해준 팀원들 모두에게 너무너무 감사합니다 ㅠㅠ 

얼레벌레 돌아가는 저의 개발인생...

 

이번 주차의 교훈

1. 좀 더 꼼꼼한 사람이 되자

2. 변수, 메소드, 클래스 등... 처음부터 이름 잘 짓자...

나중에 기능 확장될 것도 생각해서 깔끔하게 짓자... 중간에 개명시켜주려고 하면 일이 복잡해지니까 태어날 때부터 이쁜 이름을 지어줍시다. 

728x90