호우동의 개발일지

Today :

article thumbnail

학교 과제랑 스터디, 알바 등 여러 가지에 치려 다니느라
게임 프로젝트가 우선순위에서 밀리다 보니 일주일정도 손을 못 댔다.

오랜만에 살짝 여유시간이 생겨서 프로젝트를 할 수 있게 됐다.

곧 있으면 중간고사라 지금이라도 짬짬이 하지 않으면
진짜 못할 거 같아서 조금이라도 하려고 한다.


구현 목표


구현 목표
구현 목표

구현하려는 것은 간단하다. 게임에서 흔히 말하는
보스 체력이 떨어지면 나오는 발악 패턴, 즉 광폭화이다.

보스가 일정 체력 이하로 떨어지면
보스 크기가 점점 줄어드는 효과를 주고,
패턴이 나오는 속도가 올라가도록 구현할 것이다.

 

 


구현 과정

1. 애니메이션 생성 및 구현

광폭화 이후,
그러니까 사이즈가 작아지고 난 후에 쓸 애니메이션이 따로 필요하다.

왜냐하면 사이즈를 줄이는 것은 Scale을 줄이는 것인데,
애니메이션이 Scale 기반으로 동작한다.

따라서 광폭화 이후에는 똑같은 애니메이션인데,
사이즈가 절반인 게 필요하다
.

애니메이션 스크린샷

름을 Knight_rage_Idle이라고 짓고,
Knight_Idle에 Scale이 절반인 애니메이션을 만들었다.

 

애니메이터 스크린샷
애니메이터 스크린샷

파라미터에 'Rage'라는 Bool 형 변수를 새로 추가해 주어,
Rage 상태를 확인해 Idle 상태와
Rage_Idle 상태 애니메이션을 구분하였다.

그리고 Knight_Die 애니메이션은
항상 광폭화 이후에 발생하므로 연결을 바꿔주었다.

 

 


2. 코루틴을 활용한 Scale 줄이기


Boss_Knight.cs

protected override void Enraged()
    {
        base.Enraged();
        StartCoroutine(Smallize(new Vector3(2, 2, 2)));
        rushDelay /= 2;
        actionDelay /= 2;
    }
    private IEnumerator Smallize(Vector3 size)
    {
        anim.enabled = false;
        Debug.Log("광폭");
        while (transform.lossyScale.x >= size.x)
        {
            Debug.Log("작아짐");
            yield return null;
            transform.localScale *= 0.9f;
        }

        anim.enabled = true;
        anim.SetBool("Rage", true);
        bossState = BossState.idle;
        Invoke("OnAction", actionDelay);
    }

Boss_Knight.cs는 추상 클래스인 Boss.cs를 상속받는 클래스이다. 
거기에 있는 Enraged를 오버라이드하는데 그 스크립트 함수는 

CancelInvoke("OnAction");
bossState = BossState.attack;

이것뿐이라서 따로 스크립트로 빼진 않았다.

그냥 앞으로 만들 모든 보스에 대해 광폭화를 만들 것이어서
구조적으로 추상클래스로 넣은 것이다.

실질적으로 작아지게 하는 것은 Smallize로 작성된 코루틴이다.
매개변수로 Vector3을 받는다.

일단 시작하자마자 애니메이션을 멈추는데,
애니메이션이 Scale을 건드리고 있으므로 영향을 주기 때문이다.
그래서 애니메이션을 비활성화해 둔다.

보스의 lossyScale 즉, 절대크기(월드크기)가 size.x(2) 보다 작을 때 반복을 종료하게 해 놨다.
이는 보스 크기를 (4,4,4)로 설정해 놔서 그 절반인 (2,2,2)까지만 줄이기 위해서이다.

2보다 작아질 때까지 현재 크기의 0.9를 계속 곱해서
조금씩 줄이는 것을 반복한다.

사이즈가 다 줄어들었으면 애니메이션을 다시 실행하고
Rage 파라미터를 true로 바꿔 Knight_Idle 애니메이션에서
Kngiht_Rage_Idle 애니메이션으로 바꿔준다.

그리고 취소했던 OnAction을 actionDelay 이후 실행하도록 Invoke 해준다.

 

 


구현 결과

구현 결과

일단은 밟으면 무조건 광폭화가 발동되게 해 놨으니,
정상적으로 작아지는 것을 확인할 수 있다.


구현이 아주 잘됐다. 작아지는 속도는 조절하면 되고
광폭화 애니메이션도 나중에 만들자