공부/Unity

[Unity] 커비 7일차 생명 UI, 상태 패턴, 일시정지중에 애니메이션 작동

굴러다니다니 2023. 4. 19. 17:49
728x90

1. life UI 생성

커비 폰트는 따로 텍스트로 넣자니 적용이 이상하게 돼서, 그냥 font 이미지를 잘라서 넣고

gamemanager에 선언한 life를 받아서 숫자에 따라 앞자리 수, 뒷자리 수를 setactive true / false 하게 만들었다

 

2. gamemanager -> 기본 life 3개로 시작, hp가 다 닳면 life 감소

체력이 적으면, Die함수를 들어가는데 이를 한번 처리했으면 isDie를 true로 바꾸고 커비가 높이 한번 찍고 떨어져야 하기 때문에 높게 올라가는 위치를 destination으로 잡아주었다.

destination까지 도달을 못했으면 올라가게, 도달했으면 내려가게 만들어준다. 

하지만 deltaTime을 곱하면, 죽을때 일시정지 되게 Time.timeScale = 0으로 만들었기 때문에, 실행이 안되기 때문에 unscaledDeltaTimed 으로 곱해준다

* 일시정지 : Time.timeScale = 0; -> Fixed update는 실행안되고, Update만 실행된다

이 와중에 애니메이션을 실행하고 싶다면 animator에서 unscaled Time에도 실행되게 바꾸면 된다

원래대로 돌아오려면 timescale = 1로 바꾼다.

 

죽으면 새로 loadscene, 생명 받아서 ui에 잇기 

 

3. 죽는 애니메이션 + 효과

빙글빙글 돌아가고 위에 찍고오게

위에 식에 같이넣어둠 ~

 

4. 디디디 보스룸 전 준비하는 배경 만들기

이 애셋이 없어서,,

캡쳐하고 없는부분 이어붙이고,, 해서 만들기 성공 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

자세히보면 다름 -> whatever

근데 화면 비율이 덜차서 좌우를 그냥 기둥이랑 바닥 이어붙였다

디디디 보스전 방도 마찬가지

대충 쭉쭉 늘려줬다

 

5. 디디디 애니메이션 만들기

-> 디디디 어떻게 동작하는지 유튜브로 보고있었는데,,, 알고보니깐 커비가 변신할 때 세상이 멈추더라고요?!

그래서 디디디 애니메이션 필요한거 추가한 후 저 기능만들기

만들긴했는데, 중심을 안옮겨서 몸통 collider가 따로노네 이건 추후 수정하기

 

6. 커비 변신할 때 온 세상 일시정지 + 커비빼고 어두워지기

-> 애니메이션 오류 고치기 돌입,,,

offPause를 따로 만들어 Invoke 하려고하니깐 invoke도 time deltatime으로 하는거라 안돼서 그냥 timer를 따로 만들어서 1초후에 알아서 일시정지 그만두게 만들었다. 

카메라 자식object로 네모난 sprite를 만들어서 그게 그냥 작동 되게 / 안되게 하는 식이다

 

7. 디자인패턴 - 상태패턴을 사용해 디디디 상태 만들어주기

-> 기본 틀은 다 짰지만 컨디션 난조로 인해 여기ㅓㅅ 마무리,, 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class dedede : MonoBehaviour
{
    //[SerializeField] int hp = 20;
    //private int change = 7; //7 -> hammar
    //private int stage = 2;
    //private bool onGround = true;
    //private Rigidbody2D rigid;
    //[SerializeField] float speed = 1f;
    [SerializeField] private int nextMove = 0; //행동 패턴
    [SerializeField] private Vector3 AttackRange;
    [SerializeField] private Vector2 size;
    [SerializeField] private LayerMask whatIsLayer;
    private float time = 0;

    public enum State
    {
        WALK,
        FLY,
        DIE,
        IDLE    
    }

    public State state;

    private void Start()
    {
        state = State.IDLE;
        ChangeState(state);
    }

    private void Update()
    {
        switch (state)
        {
            case State.WALK:
                Walk();
                break;
            case State.FLY:
                Fly();
                break;
            case State.DIE:
                Die();
                break;
            case State.IDLE:
                Idle();
                break;
        }
    }

    private void OnTriggerStay(Collider other)
    {
        if (state == State.WALK)
        {
            WalkTriggerStay(other);
        }
    }

    private void OnTriggerEnter(Collider other)
    {
        switch (state)
        {
            case State.WALK:
                WalkTrigger(other);
                break;
        }
    }

    private void ChangeState(State state) //전환하기 전 마지막으로 실행되는 Exit 함수
    {
        Debug.Log("Change State");
        switch (this.state)
        {
            case State.WALK:
                WalkExit();
                break;
        }
        this.state = state;

        //state에서 들어가고 나서 처음으로 실행되는 Enter 함수
        switch (state)
        {
            case State.WALK:
                WalkEnter();
                break;
        }
    }

    private void WalkEnter()
    {
        Debug.Log("Walk Enter");
    }
    private void Walk()
    {
        Debug.Log("Walk");
    }
    private void WalkTrigger(Collider other)
    {
        Debug.Log("Walk Trigger");
    }
    private void WalkTriggerStay(Collider other)
    {
        Debug.Log("Walk Trigger Stay");
    }
    private void WalkExit()
    {
        Debug.Log("Walk Exit");
    }

    private void Fly()
    {
        Debug.Log("Fly");
    }

    private void Die()
    {
        Debug.Log("Die");
    }

    private void Idle()
    {
        Debug.Log("Idle");
        time += Time.deltaTime;
        Collider2D hitColliders = Physics2D.OverlapBox(transform.position + AttackRange, size, 0, whatIsLayer);
        if (time > 2f)
        {
            think();
            time = 0;
        }
        if (hitColliders != null)
        {
            Debug.Log("커비 찾음");
            ChangeState(State.DIE);
        }
        else
        {
            
        }
    }

    private void OnDrawGizmos() //공격 범위 눈으로 보이게
    {
        Gizmos.color = Color.red;
        Gizmos.DrawWireCube(transform.position + AttackRange, size);
    }
    private void think()
    {
        nextMove = Random.Range(-1, 2); //-1 0 1
        if (nextMove == -1)
        {
            //왼쪽
        }
        else if (nextMove == 0)
        {
            //공격
        }
        else if (nextMove == 1)
        {
            //뛰어서 공격
        }
    }
}

내용을 좀더 정리하고 코드를 써야될 거 같다

728x90