[타워디펜스게임] #17. 중간 수정사항

치치·2025년 2월 20일
0

타워디펜스게임

목록 보기
17/18
post-thumbnail

1. 유닛 카운팅 고치기 (유닛이 죽으면 유닛 카운팅 감소)

  • 현재 상태는 유닛이 죽으면 몬스터의 카운팅이 감소한다
    -> 함수를 잘못 호출한듯 (MonsterCount스크립트의 함수를 호출하고있다)

UnitStat 스크립트

  • 유닛이 죽으면 호출되는 Die() 함수에 MonsterCount 스크립트의 함수가 호출되었다 -> 그냥 실수함

문제점

  • 유닛이 죽으면 카운팅을 감소시키는 DelCounting()함수를 각각의 UnitStat 스크립트에 호출해야한다

  • 각 유닛의 스탯 스크립트에 Die()함수가 있기 때문

  • Die()함수가 호출되면 유닛의 카운트도 감소되야함

  • 각각의 UnitStat스크립트들은 추상클래스의 자식들이다
    -> Die()함수 자체는 추상클래스의 부모에 정의되어있고, 자식들의 Die()함수도 부모와 동일하기 때문에, 부모의 Die()를 호출하는 방식으로 작성했다

-> 근데 부모의 UnitCount컴포넌트를 사용하기 위해서는 스크립트를 참조해야하는데,
추상클래스여서 게임 오브젝트에 할당할 수 없다

추상클래스로 만든 게 너무 까다로운 작업이 되버린 거 같았다. 오브젝트 참조가 안되는 경우가 많아서 계속 Null Reference Exception 오류가 떠버렸다

내가 사용한 방법

부모 추상클래스에 스크립트를 가져와서 사용할 수 없다.

  • 그럼 UnitCount를 부모가 아닌 자식에게만 스크립트를 가져오자!
    -> Die()함수는 자식에게서 재정의 할 수 있다! -> override

  • 에디터에서 직접 할당해도 되지만, 나는 스크립트 내에서 작성하여 안의 멤버 함수를 사용할 것이다

FindObjectOfType<T>() : 씬에서 해당 스크립트가 포함된 게임 오브젝트를 찾아서 가져오는 함수



메인 캐릭터에 데미지 적용

메인 캐릭터 조건

  1. 메인 캐릭터는 공격할 수 없다 (나중에 스킬 추가 예정. 현재로써는 석상)
  2. 메인 캐릭터가 죽으면 애니메이션 실행 후 Lose 팝업창 활성화

과정

  1. 캐릭터의 콜라이더 설정
    -> 몬스터는 NotMonsterTile에 닿으면 이동을 멈춘다
    -> 메인 캐릭터를 공격한다

  2. MonsterAttackGizmo는 태그가 유닛인 애들만 공격하니까 태그를 유닛으로 지정

[메인 캐릭터 콜라이더 범위]

  • UnitStat 추상클래스를 상속받은 자식 클래스로 MainUnit 스크립트 생성
    -> 다른 유닛들과 마찬가지로, 속성값을 지정 (체력)

  • MonsterAttackGizmo 스크립트들에게 메인 캐릭터에게 데미지 함수 적용

  • 데미지가 제대로 적용된다


메인 캐릭터 애니메이션 적용

유닛들과 동일하게 메인 유닛도 죽으면 애니메이션 호출한다
메인 유닛의 애니메이션 지정 Die trigger만 설정한다

다른 유닛들과 코드가 조금 다르다

이유

  • 다른 유닛들은 Die()함수가 호출되면 애니메이션을 1.5초 실행한 후 게임 오브젝트가 파괴된다
  • 메인 캐릭터는 Die()함수가 호출되어도 게임 오브젝트가 파괴되지 않는다
    -> 메인 캐릭터가 죽으면 바로 스테이지 종료이기 때문이다

과정

  1. 메인 캐릭터가 죽으면 Die() 함수가 호출된다.

  2. 죽음 애니메이션을 실행한 후, 게임오브젝트는 파괴되지 않는다.

  3. 2~3초 후에 스테이지 종료창이 뜬다.


  • 다른 유닛들은 부모의 Die()함수를 그대로 가져와서 사용했지만(base.Die()), 메인 캐릭터는 따로 재정의를 해줘야함
    -> 부모의 Die()에는 게임 오브젝트 파괴도 들어있기 때문

  • MainUnit스크립트에서 죽음 애니메이션 실행 함수만 재정의하였다 -> 애니메이션만 나오게함
    -> 게임 오브젝트가 파괴되지 않는다

원래 애니메이션만 적용할 스크립트를 만드려고 했는데, 이미 추상클래스의 부모에서 애니메이터를 다 가져오게 되있더라,,, 나중에 애니메이션만 분리해보자

메인 캐릭터 스크립트에서 재정의한 Die()함수



몬스터3 거북이 추가 - 애니메이션

  • 유닛1과 유닛2에 처리한 것과 동일하게 애니메이션 적용

  • 몬스터의 공격 애니메이션 확인용 스크립트는 따로 생성한다

  • 몬스터가 죽는 애니메이션과 조건은 MonsterStat 스크립트에서 정의



몬스터4 거북이 크기 수정

  • 실행해보니까 크기가 너무 큼 -> 수정완료 scale 1.3 -> 1.0


몬스터 생성 카운트 수정

기존에 level1 5개, level2 4개, 보스몬스터 1개 였는데
level1 5개, level2 3, level3 3, level4 3마리로 수정

  • 몬스터의 종류가 늘어나면 에디터에서 배열에 할당해주기

몬스터4와 유닛의 데미지 적용이 안됨문제

  • Monster4Anime 스크립트를 할당안해줬었음
    -> 스크립트 할당 주의.... 확인 잘 하자



UnitSlot 스크립트에서 버튼 활성화가 잘못댐

  • UnitCount 스크립트에 TileManager 스크립트 할당하기

TileManager에 UnitCount스크립트를 할당하고
UnitCount스크립트에 TileManager 스크립트를 할당하는 경우가 발생,,
서로서로 참조된 상황

  • UnitOver()함수를 Update()문에 넣었다 -> 정상작동은 되긴함

-> 해결되었는데, 유닛을 타일에 배치하면 HP바가 이상한 점이 생긴다
-> 뭐지?? 인스펙터창에서는 currentHealth에 문제는 없음

타일 매니저 스크립트에 작성한 함수

UnitOver() 함수 : 현재 유닛의 카운트가 전체 카운트 수와 같다면 더이상 생성 불가
-> 유닛 구매창 버튼 상호작용을 비활성화

타일 매니저 스크립트의 Update()에서 호출


-> 아무래도 Update문에서 많은걸 작성하면 비효율적이고 메모리적으로 안좋을 거 같아
-> 이것도 나중에 수정해야해



코스트 감소 문제

  • 기존에 코스트는 유닛 목록창에서 구매가 되자마자 바로 코스트가 차감되었다.
    -> 바꿔서 타일에 배치되면 코스트가 차감되게 하자
    (이렇게 해야지 구매 누른 상태로 바로 유닛을 버리게 되면 코스트가 차감되지 않는다)

  • 기존에는 구매버튼을 누르면 (타일매니저) -> 유닛 슬롯창에 그 함수를 호출하고 코스트를 차감했다

  • 구매버튼은 구매버튼대로 호출하고 , 따로 함수를 만들어보자

방법1

  1. 유닛 슬롯쪽에 구매 함수를 만들기
  1. 타일매니저에 함수를 호출하는 방식으로 함

  2. 차감되는 코스트 수가 이상함 -> 누적되어 차감되는듯


방법2

  • Cost 스크립트에서 코스트를 감소하는 함수 구현했다

  • 매개변수로 구매하는 유닛의 코스트의 값이 들어올 거임

  • 타일 매니저에 유닛을 배치하면 함수 호출 & 매개변수 넣기

  • 각각의 유닛 코스트들을 스크립트를 따로 만들어서 할당해줬다
    -> 각 유닛들의 코스트 정보가 UnitStat의 자식에 정의되어 있는데, 추상클래스이기 때문에 Cost가 직접 참조할 수 없음

  • 유닛 게임 오브젝트에 이 스크립트 넣어주기

이제 유닛을 구매하자마자 코스트가 감소하지 않고, 유닛을 타일에 배치해야만 코스트가 감소한다



코스트 감소 문제2

  • 타일에 배치할때마다 코스트가 감소된다

  • 최초로 타일에 배치할때만 코스트가 감소되야하고, 타일 내에서의 이동은 코스트 변동x

  • 타일에 최초로 배치되었는지를 확인하는 bool 변수 추가

  • 타일 매니저 쪽에 코드 추가
    -> 배치되었으면 무조건 생성된 게임오브젝트isPlacedtrue
    -> 타일 내에서 이동하면 코스트가 차감되지 않는다


profile
뉴비 개발자

0개의 댓글