적을 만들자
- 택배기사와 할머니의 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 |