본문 바로가기

Unity

2025년1월 2주

 

적을 만들자

 

 

  • 택배기사와 할머니의 Sprite를 Hirearchy로 드래그 하여 애니메이션을 생성한다.
  • 각각의 객체에 Mover, Destroyer, Collider를 넣은후에 Project로 드래그 하여 프리팹으로 생성한다.

 

 

 

 

 

  • Enemy Spawner를 생성하고, Spawner.cs를 추가하여, 할머니와 배달부의 Prefab을 넣는다. 

 

 

  • Item을 추가한다. 4가지 아이템을 Hirearchy로 드래그해서 추가하여, Mover, Destroyer스크립트를 넣고, Prefab로 생성한다.

 

 

  • Food Spawner, Golden Spawner을 추가한다. 각각에 맞는 prefab을 넣는다. 
    • Food 는 생명력을 1 올려주는 아이템이고,
    • Goldbaechu는 일정시간 무적이 되는 아이템이다. 

 

Game Manager

  • Game Manager를 생성한다. 

 

  • GameManager Script는 아래와 같다.
using UnityEngine;
using UnityEngine.SceneManagement;

// 게임의 상태를 표시한다. (인트로 , 게임중, 게임오버)
public enum GameState
{
    Intro,
    Playing,
    Dead
}

public class GameManager : MonoBehaviour
{
    // GameManager는 어디서나 접근할수있다.
    public static GameManager Instance;

    // 게임상태값 (Default : 인트로)
    public GameState State = GameState.Intro;

	// 플레이어의 HP
    public int Lives = 3;

    [Header("Reference")]
    public GameObject IntroUI;
    public GameObject EnemySpawner;
    public GameObject FoodSpawner;
    public GameObject GoldenSpawner;
    public Player PlayerScripts;


    private void Awake()
    {
        if(Instance == null)
        {
            Instance = this;
        }
    }

    // Start is called once before the first execution of Update after the MonoBehaviour is created
    void Start()
    {
    	// 게임 시작 UI를 보여준다.
        IntroUI.SetActive(true);
    }

    // Update is called once per frame
    void Update()
    {
    	// Space를 누르면 게임 플레이상태로 변경된다.
        if(State == GameState.Intro && Input.GetKeyDown(KeyCode.Space)) {
            State = GameState.Playing;
            // 시작UI를 Hide시킨다. 
            // 적,아이템 생성 객체를 Show시킨다. 
            IntroUI.SetActive(false);
            EnemySpawner.SetActive(true);
            FoodSpawner.SetActive(true);
            GoldenSpawner.SetActive(true);
        }

        if(State == GameState.Playing && Lives == 0)
        {
            // 플레이어의 생명력이 0이되면 플레이어를 Kill 시킨다.
            PlayerScripts.KillPlayer();

            EnemySpawner.SetActive(false);
            FoodSpawner.SetActive(false);
            GoldenSpawner.SetActive(false);

            State = GameState.Dead;
        }

        if(State == GameState.Dead && Input.GetKeyDown(KeyCode.Space))
        { 
        	// 게임오버상태에서 Space를 누르면 다시 Scene을 로드한다.
            SceneManager.LoadScene("main");
        }
    }
}

 

 

 

 

 

UI (점수표시)

 

  • 생명력 UI를 아래와 같이 표시한다. 

 

using UnityEngine;

public class Heart : MonoBehaviour
{
    public Sprite OnHeart;
    public Sprite OffHeart;

    public SpriteRenderer spriteRenderer;

    public int LineNumber; 

    // Update is called once per frame
    void Update()
    {
        if(GameManager.Instance.Lives >= LineNumber)
        {
            spriteRenderer.sprite = OnHeart;
        }
        else
        {
            spriteRenderer.sprite = OffHeart;
        }
    }
}

 

 

 

 

  • 점수 표시를 위하여 Text UI를 추가한다.

 

  • GameManager에 Lives변수를 생성한다.

 

 

  • Player스크립트에서 충돌이 일어났을때 Tag가 Enemy라면 Hit()를 호출시켜 HP를 1감소시킨다.
using UnityEngine;

public class Player : MonoBehaviour
{

.
.
.
    public void KillPlayer()
    {
        PlayerCollider.enabled = false;
        PlayerAnimator.enabled = false;
        PlayerRigidBody.AddForceY(JumpForce, ForceMode2D.Impulse);

    }
    
    void Hit()
    {
        GameManager.Instance.Lives -= 1;
        if (GameManager.Instance.Lives == 0)
        {
            KillPlayer();
        }
    }
.
.
.
    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.gameObject.tag == "Enemy")
        {
            if(!isInvincible)
            {
                Destroy(collision.gameObject);
                Hit();
            }
        }
        else if (collision.gameObject.tag == "Food")
        {
            Destroy(collision.gameObject);
            Heal();
        }
        else if (collision.gameObject.tag == "Golden")
        {
            Destroy(collision.gameObject);
            StartInvinclble();
        }
    }
}

 

  • GameManager에서는 Lives가 0이 되면 종료처리를 수행하고 최고점수를 기록한다. 
        if (State == GameState.Playing && Lives == 0)
        {
            PlayerScripts.KillPlayer();

            EnemySpawner.SetActive(false);
            FoodSpawner.SetActive(false);
            GoldenSpawner.SetActive(false);
            DeadUI.SetActive(true);
            State = GameState.Dead;

            SaveHighScore();
        }

 

 

 

  • GameManager에서 PlayerPrefs를 사용하여 highScore를 읽어서 지금 획득한 점수가 더 높으면 최고점수로 저장한다.
    float CalculateScore()
    {
        return Time.time - PlayStartTime;
    }

    void SaveHighScore()
    {
        int score = Mathf.FloorToInt(CalculateScore());
        int currentHighScore = PlayerPrefs.GetInt("highScore");
        if(score > currentHighScore)
        {
            PlayerPrefs.SetInt("highScore", score);
            PlayerPrefs.Save();
        }
    }

    int GetHighScore()
    {
        return PlayerPrefs.GetInt("highScore");
    }

 

 

 

  • GameManager의 Update에서는 지금 게임중이라면 UI Text에 현재 점수를 보여주고, 게임오버라면 최고점수를 보여준다.
    void Update()
    {
        if(State == GameState.Playing)
        {
            scoreText.text = "Score : " + Mathf.FloorToInt(CalculateScore());
        }
        else if(State == GameState.Dead)
        {
            scoreText.text = "High Score : " + GetHighScore();
        }
   
   .
   .
   .
   
   }

 

 

 

 

Publishing (퍼블리싱)

 

 

  • [File] 의 [Build profiles]에서 Web build로 전환한다.

 

 

 

  • Package Manager에서 WebGL Publisher를 설치한다.

 

 

 

  • Publish의 WebGL Project를 선택하여 빌드를 진행한다.

 

 

 

 

https://play.unity.com/en/games/fd127d3f-28b7-4b27-903a-c3894743cc97/kimchi-run-by-scm

 

Kimchi Run by scm on Unity Play

Make Kimchi never die

play.unity.com

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'Unity' 카테고리의 다른 글

블랜더  (0) 2024.12.24
2025년2월2주  (0) 2024.12.24
2025년2월1주(2/3~2/9) 무료 서버 구축하기  (0) 2024.12.24
2025년1월5주(1/27~2/2)  (0) 2024.12.24
2025년1월1주(12/30~1/5) (김치런 Game)  (0) 2024.12.24