유니티 방치형 프로젝트 - 크리티컬 로직, UI, 확률 구현

반응형

구현할 내용 

플레이어가 몬스터를 공격할 때 크리티컬 확률에 의해 크리티컬 데미지가 적용되면서 크리티컬 적용 UI를 타겟몬스터 위에 표시.

커밋 4c5528961460470fdea4d74b28cc6435e8205912

공부하면서 배운 것  

구현 자체는 어렵지 않았지만, 캐릭터 등급에 따라 크리티컬 데미지 증가율을 조정하려다 보니 등급 정보를 어디서 관리할지, 계산은 어디서 할지 등 여러 가지를 고려해야 해서 각 역할을 깔끔하게 나누는 게 조금 헷갈렸다.

구현할 것 단계적으로 나누기 

1. 플레이어가 몬스터를 공격할 때  

✅ 몬스터를 공격할 때

플레이어가 몬스터를 공격할 때 애니메이션 이벤트로 Attack 메서드를 호출하며 로직은 부모 스크립트인 Character.cs의 Attack()에서 동작한다 따라서, base.Attack() 메서드를 실행한다.

player.cs

✅ 상속 관계 이해하기

내 코드는 몬스터와 플레이어가 Character.cs를 상속받았다 그 이유는 몬스터도 플레이어를 공격하고 플레이어도 몬스터를 공격하기 때문이다. 그래서 서로 타겟하고 공격하는 공통 로직은 Character.cs 의 Attack 메서드에 작성해 두었다.

위에서 base.attack 했기 때문에 아래 로직이 실행 되며 AttackInit 매게변수로 몬스터 Transform과 공격력을 넘긴다.

Player의 부모 Character.cs

 

✅ 데미지 처리 어디서?

데미지 받게 하는 메서드는 Player.cs 와 Monster.cs 둘다 가지고 있다. 다만 둘다 Character를 상속 받았기 때문에

지금은 캐릭터가 몬스터를 때리는 경우이기에 _target은 몬스터이며 몬스터 측에서 GetDamage를 입히도록 한다.

 

Bullet.cs

 

2. 크리티컬 메서드 실행

Critical 메서드 실행 (데미지 ref로 넘기는 이유는 Critical안에서 크리티컬 적용된 데미지를 GetDamage안에서 바로 사용할 수 있도록 하기 위해)

Monster.cs

3. 크리티컬 실행 여부 결정

플레이어의 정보를 가지고 있는 모델 개념의 Player_Mng.cs 로 접근해서 criticalPercent를 받아와 즉석에서 만든 랜덤값과 비교하여 크리티컬 실행 여부를 결정한다. 

 

만약 true면 기존 데미지에 크리티컬 데미지를 더한다.

 

참고로 ref로 받은 dmg라서 참조된 값을 수정한다. 즉, 호출했던 곳에서도 반영된다는 것이다.

Monster.cs

위에서 말한 Player_Mng 클래스는 보면 레벨업 공격력 크리티컲 확률등에 대한 데이터를 가지고 있다.

Player_Mng

 

 

✅크리티컬 실행 

bool 값이 true라면 init 메서드 마지막이 true로 들어갈 것이다.

Monster.cs

 

아무튼 critical이 터지면 bool이 true가 되어 반환되는데 Hit_Text 스크립트의 init 메서드 호출할때 마지막 인자로 같이 넘겨주면 거기서 아래와 같이 크리티컬이 true면 그에 따른 UI 를 보여주고 색상도 바꿔주고 ... 이렇게 하면 된다.

반응형