Bomb Kirby Running
Cat Life - GT-K
퍼즐게임 개발일지 - 18

2024. 3. 8. 06:27Game Develop

퍼즐게임 개발일지 18편

애니메이션을 timeline으로 전환시켜보자

 

애니메이션 전환?!

 

그렇다 드디어 Idle 애니메이션을 만들었다

사실 엄청 단순한데

걍 너무 그리기 귀찮았다

 

 

일단 signal을 2개 만들었다

 

???

애니메이션은 2개인데

왜 굳이 signal을 2개 만든겨!

 

 

timeline을 사용하지 않을 경우(튜토리얼 봄)

기본 애니메이션을 Idle 애니메이션으로

유지시키고 싶기 때문이다!

timeline 니가 좀 고생하도록

 

암튼 이미지처럼 trigger 2개를 만들어주고

transition에 위와 같이 연결해주었다

 

 

그리고 방금 만든 signal에 reaction을 추가했다

이름 그래도 IdleToWalk signal은

걷는 애니메이션으로 전환

WalkToIdle signal은 그 반대다

 

SetTrigger int, string형 둘 다 가능한데

난 그냥 알아보기 쉽게 string으로 넣었다

 

 

캐릭터의 전 후 위치가 좀 달라서 이거 찍고 따로 맞춰줬다

 

 

애니메이션이 아주 잘 바뀌었다

프롤로그를 본 이후의 모습도

아주 자연스럽다 핫핫

 

 

그리고 오랜만에 다시 나온

picture builder

판다 머리 위에 게이지바가 있는데

이번에는 그걸 구현해볼거다

 

아 근데 왜케 배고프냐

요즘은 5시 반에 너무 배고바

 

 

일단 Slider를 하나 만들어준다

난 그냥 Gauge Bar라고 이름 붙였다

 

 

난 위에서 아래로 내려가는 gaugeBar를 만들었다

원래 slider는 가로 방향인데

저걸 선택하면 세로 방향으로 돌아간다

내가 굳이 안돌려도 된다 후후

 

Max Value는 180으로 설정했다

Gauge는 1분에 하나씩 차오르게 해주었다

 

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

public class GaugeManager : MonoBehaviour
{
    public Slider gaugeSlider; 
    public float increaseInterval = 60f; 
    public int increaseAmount = 1; 
    private float timer = 0f;

    public static GaugeManager Instance => instance;
    private static GaugeManager instance;
    
    void Awake()
    {
        if (null == instance)
        {
            instance = this;
        }
        gaugeSlider=GetComponent<Slider>();
    }

    void Start()
    {
        LoadGauge(); 
    }

    void Update()
    {
        timer += Time.deltaTime;

        if (timer >= increaseInterval)
        {
            gaugeSlider.value = Mathf.Min(gaugeSlider.value + increaseAmount, gaugeSlider.maxValue);
            timer = 0f;
        }
    }

    void OnApplicationFocus(bool hasFocus)
    {
        if (!hasFocus)
        {
            SaveExitTime();
        }

        else
        {
            LoadGauge();
        }
    }

    void OnApplicationPause(bool pauseStatus)
    {
        if (pauseStatus)
        {
            SaveExitTime();
        }
        else
        {
            LoadGauge();
        }
    }

    void OnApplicationQuit()
    {
        SaveExitTime();
    }

    void SaveExitTime()
    {
        PlayerPrefs.SetString("LastExitTime", System.DateTime.UtcNow.ToString());
        PlayerPrefs.SetFloat("CurrentGaugeValue", gaugeSlider.value);
        PlayerPrefs.Save();
    }

    public void UpdateGauge()
    {
        gaugeSlider.value = Mathf.Max(0, gaugeSlider.value - 1);
    }

    public bool IsAvailable()
    {
        return gaugeSlider.value > 0;
    }


    void LoadGauge()
    {
        string lastExitTimeStr = PlayerPrefs.GetString("LastExitTime", string.Empty);

        if (!string.IsNullOrEmpty(lastExitTimeStr))
        {
            System.DateTime lastExitTime = System.DateTime.Parse(lastExitTimeStr);
            System.TimeSpan timeSinceExit = System.DateTime.UtcNow - lastExitTime;

            int incrementsSinceLastExit = (int)(timeSinceExit.TotalSeconds / increaseInterval) * increaseAmount;
            float currentGaugeValue = PlayerPrefs.GetFloat("CurrentGaugeValue", 0f) + incrementsSinceLastExit;

            gaugeSlider.value = Mathf.Min(currentGaugeValue, gaugeSlider.maxValue);
        }
    }
}

 

만약에 게임 플레이 중이면 gauge의 maxValue(180)

이하로 1분에 한번씩 증가한다(update)

 

어제 본 OnApplicationPause,Pause,Quit이 나왔다

만약에 유저가 게임을 종료하거나

백그라운드로 보내버릴 경우 그 시간을 저장한다

그리고 다시 돌아올 경우 그 시간부터 지금까지

얼마의 시간이 지났는지 확인하고

그 값에 60을 나눠서 gauge에 넣어준다

 

UpdateGauge는 value를 1씩 감소 시키지만

0 미만으로 감소시키지 않게 보장한다

 

그리고 IsAvailable()을 이용해

0보다 큰가요? 작나요를 물어보고

 

 

0보다 커용!

아 그럼 퍼즐 맞추기 가능

맞췄어용!

1 깎을게용!

 

이렇게 된다

 

 

코드를 저장하고 임의의 퍼즐 2개를 맞춰봤다

1분이 지나니 Gauge Value가 1 증가했다

 

 

 

 

혹시 몰라서 딱! 1분 짜리 영상을 준비했다

맨 마지막에 진짜 짧게 나오니까

숫자를 집중해서 보길 바람

 

아 배고팡!!!!!

 

'Game Develop' 카테고리의 다른 글

3월 15일까지 포트폴리오 정리합니다!  (0) 2024.03.12
퍼즐게임 디자인일지 - 13  (0) 2024.03.11
퍼즐게임 개발일지 - 17  (0) 2024.03.07
퍼즐게임 디자인일지 - 12  (0) 2024.03.07
퍼즐게임 개발일지 - 16  (0) 2024.03.05