개발/유니티(UNITY)

5-5 유니티로 화살 피하기 게임 만들기(심화1)

새벽감성개발자 2023. 10. 29. 15:00
반응형

이전 단계에서 화살에 맞으면 HP가 닳는 것 까지 구현을 했는데, 에셋 스토어에서 무료 에셋을 다운로드하고, 게임에 추가하는 과정을 추가할 예정이다.

에셋 스토어로 가서 필요로 하는 이미지를 다운받는다

나의 경우 HP up 에 사용될 하트를 구하기 위해서 픽셀로 된 무료 에셋을 찾았다.

보기

 

내 에셋에 추가한 다음

Package Manager에서
다운로드를 해주고
하트 이미지 딱 한개를 갖고 왔다.

 

별첨 1. 하트 에셋을 추가하고 하트를 먹으면 hp가 차는 것 구현하기

  • 어떻게 해야 할지 감이 안온다면, 이전 글을 다시 읽어보기 바랍니다.

heartGenerator까지 구현해서 자동으로 인스턴스를 생성하게끔 한다.

  • GameDirector에 IncreaseHP() 메서드를 생성해서 하트를 먹으면 HPGauge의 fillAmount의 값을 증가하게끔 구현
  • 게임이 너무 단순하면 재미가 없기 때문에, 하트가 생성되는 속도는 0.7f, 하트가 내려오는 속도는 0.3f, 범위는 0.3f로 설정해서 사용자가 하트를 먹기 어렵게 구현하였다.

하트를 먹으면 HP가 증가한다

 

 

별첨 2. 고양이 캐릭터의 이동 값을 변경해보기

  • 게임에 디테일을 입히기 위해서, 사용자가 캐릭터를 움직일때 더 섬세한 조작을 할 수 있도록, 이동 값을 줄인다.

피하는게 더 어렵고, 하트를 먹기까지도 더 어려워진 모습이다.

  • 프레임이 끊어지는 것을 막기 위해서 GetKeyDown() 을 GetKey()로 변경해서, 사용자가 키보드를 누르고 있을때도 동작하게끔 작업한다.

참고 코드

더보기

<< PlayerController >>

// 왼쪽 화살표가 눌린 경우
if (Input.GetKey(KeyCode.LeftArrow))
{
    transform.Translate((float)-0.3, 0, 0); // 왼쪽으로 0.3 움직인다.
}
if (Input.GetKey(KeyCode.RightArrow)) {
    transform.Translate((float)0.3, 0, 0); // 오른쪽으로 0.3 움직인다.
}

위의 과정에 비해 좀 더 스무스해진 느낌이다.

 

별첨 3. 게임의 시작과 끝 구현하기

  • 현재는 HP가 0이 되어도 게임이 끝나지 않는다. 
  • HP가 0이 되면, 화면의 인스턴스를 모두 삭제하고, 게임을 종료시키는 것을 구현할 필요성이 있다.
  • 서적에서는 6장에서 설명하지만, 필요한 부분만 미리 가져와서 구현할 예정이다.

새로운 Scene을 추가하고 background도 동일하게 세팅해준다

GameDirector

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

public class GameDirector : MonoBehaviour
{
    GameObject hpGauge;
    void Start()
    {
        this.hpGauge = GameObject.Find("HPGauge"); 
        // Find() 를 사용해서 Scene에서 HPGauge 오브젝트를 찾는다.
    }

    public void DecreaseHp()
    {
        this.hpGauge.GetComponent<Image>().fillAmount -= 0.1f; 
        // image의 옵션값 fillAmount의 값을 변경시킨다.
    }

    public void IncreaseHp()
    {
        this.hpGauge.GetComponent<Image>().fillAmount += 0.2f; 
        // image의 옵션값 fillAmount의 값을 변경시킨다.
    }

	// 추가 **
    private void Update()
    {
    	// hp가 0이 되면 ClearScene으로 전환한다.
        if (this.hpGauge.GetComponent<Image>().fillAmount <= 0)
        {
            SceneManager.LoadScene("ClearScene");
        }
    }
    // ** 추가
}

ClearDirector

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

public class ClearDirector : MonoBehaviour
{
    void Update()
    {
        if (Input.GetKeyUp(KeyCode.Space))
        {
            SceneManager.LoadScene("GameScene");
        }
    }
}

 

clearScene이 더 앞에 있도록 세팅해서 게임이 끝나면 clearScene이 보이게 한다
씬의 전환은 완벽하지만, 문제가 있다면, 하트가 떨어지는게 보이지 않는다.

버그 발생 : 해결 필요

  1. 하트가 보이지 않음
  2. space바를 누르면 게임이 그냥 다시 시작되어 버림
  3. 원래 계획한 취지를 벗어난 오류가 발생함

해결

더보기
하트Prefab의 OrderLayer이 0으로 되어 있어서 안보였던것.

 

2. space바를 누르면 게임이 다시 시작되는것은 scene이 제대로 인식되지 않아서 잡버그였다.. 바로 해결됨

하트도 잘 보이게 떨어진다. 재시작도 잘 된다.

 

별첨 4. 캐릭터가 맵 밖으로 나가지 않도록 구현

  • 캐릭터가 맵 밖으로 나가면 무적으로 점수를 얻을 수 있기 때문에, 맵 밖으로 나가지 않도록 구현하는게 중요했다.
  • 맵의 크기를 얻고, 캐릭터의 좌표값을 따서, 확인했다.

PlayerController

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

public class PlayerController : MonoBehaviour
{
    GameObject player;
    // Start is called before the first frame update
    void Start()
    {
        Application.targetFrameRate = 60;
        this.player = GameObject.Find("player");
    }

    // Update is called once per frame
    void Update()
    {
        // 왼쪽 화살표가 눌린 경우
        if (Input.GetKey(KeyCode.LeftArrow) && transform.position.x >= -12.5)
        {
            transform.Translate((float)-0.3, 0, 0); // 왼쪽으로 0.3 움직인다.
        }
        if (Input.GetKey(KeyCode.RightArrow) && transform.position.x <= 12.5) 
        {
            transform.Translate((float)0.3, 0, 0); // 오른쪽으로 0.3 움직인다.
        }
    }
}

더이상 맵 밖으로 나가지 않는 것을 확인할 수 있다.

※ 여기서 문제는 화살표나 하트가 떨어지는 범위 값이 -6~6이지만, 캐릭터가 이동할 수 있는 범위는 -12.5 ~ 12.5 이므로 떨어지는 오브젝트의 x범위값을 변경해줘야 했다.

더이상 구석에 있어도 화살표를 피할 수 있는게 아니라, 사용자가 계속 조작해야 하는 난이도가 되었다.

 

반응형