반응형
두번째 개발중인 무한의 계단을 도전하고 있습니다.
효과음향을 구하지 못해 전혀 다른 음향을 삽입시켰는데, 그나마 어울리는 것 같아 마음은 가볍습니다.
아뭍튼 맨땅에서 시작하는 일이 쉬운일은 아니지만 끝까지 좋은 결과를 보여 드리도록 하겠습니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using static UnityEngine.RuleTile.TilingRuleOutput;
public class Player : MonoBehaviour
{
private Animator anim;
private SpriteRenderer spriteRenderer;
private Vector3 startPosition;
private Vector3 oldPosition;
private bool isTurn = false;
private int moveCnt = 0;
private int turnCnt = 0;
private int spawnCnt = 0;
private bool isDia = false;
private AudioSource sound;
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
anim = GetComponent<Animator>();
spriteRenderer = GetComponent<SpriteRenderer>();
sound = GetComponent<AudioSource>();
startPosition = transform.position;
Init();
}
private void Init()
{
anim.SetBool("Die", false);
transform.position = startPosition;
oldPosition = startPosition;
moveCnt = 0;
spawnCnt = 0;
turnCnt = 0;
isTurn = false;
spriteRenderer.flipX = isTurn;
isDia = false;
}
public void charTurn()
{
isTurn = isTurn == true ? false : true;
spriteRenderer.flipX = isTurn;
}
public void CharMove()
{
if (isDia)
return;
sound.Play();
moveCnt++;
MoveDirection();
if(isFailTurn()) //�߸��� �������� ���� ���
{
CharDia();
return;
}
if(moveCnt > 5)
{
RespawnStair();
}
GameManager.Instance.AddScore();
}
private void MoveDirection()
{
if (isTurn) //left
{
oldPosition += new Vector3(-0.75f, 0.5f, 0);
}
else
{
oldPosition += new Vector3(0.75f, 0.5f, 0);
}
transform.position = oldPosition;
anim.SetTrigger("Move");
}
private bool isFailTurn()
{
bool resurt = false;
if (GameManager.Instance.isTurn[turnCnt] != isTurn)
{
resurt = true;
}
turnCnt++;
if(turnCnt > GameManager.Instance.Stairs.Length - 1) //0~19 Length == 20
{
turnCnt = 0;
}
return resurt;
}
private void RespawnStair()
{
GameManager.Instance.SpawnStair(spawnCnt);
spawnCnt++;
if(spawnCnt > GameManager.Instance.Stairs.Length - 1)
{
spawnCnt = 0;
}
}
private void CharDia()
{
GameManager.Instance.GameOver();
anim.SetBool("Die", true);
isDia = true;
}
public void ButtonRestart()
{
Init();
GameManager.Instance.Init();
GameManager.Instance.InitStairs();
}
}
GameManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
public class GameManager : MonoBehaviour
{
public static GameManager Instance;
[Header("계단")]
[Space(10)]
public GameObject[] Stairs;
public bool[] isTurn;
private enum State {Start,Left,Right };
private State state;
private Vector3 oldPosition;
[Header("UI")]
[Space(10)]
public GameObject UI_GameOver;
public TextMeshProUGUI textMaxScore;
public TextMeshProUGUI textNowScore;
public TextMeshProUGUI textShowScore;
private int maxScore = 0;
private int nowScore = 0;
[Header("Audio")]
[Space(10)]
private AudioSource sound;
public AudioClip bgmSound;
public AudioClip dieSound;
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
Instance = this;
sound = GetComponent<AudioSource>();
Init();
InitStairs();
}
public void Init()
{
state = State.Start;
oldPosition = Vector3.zero;
isTurn = new bool[Stairs.Length];
for (int i = 0; i < Stairs.Length; i++)
{
Stairs[i].transform.position = Vector3.zero;
isTurn[i] = false;
}
nowScore = 0;
textShowScore.text = nowScore.ToString();
UI_GameOver.SetActive(false);
sound.clip = bgmSound;
sound.Play();
sound.loop = true;
}
public void InitStairs()
{
for (int i = 0; i < Stairs.Length; i++)
{
switch (state)
{
case State.Start:
Stairs[i].transform.position = new Vector3(0.75f, -0.1f, 0);
state = State.Right;
break;
case State.Left:
Stairs[i].transform.position = oldPosition + new Vector3(-0.75f, 0.5f, 0);
isTurn[i] = true;
break;
case State.Right:
Stairs[i].transform.position = oldPosition + new Vector3(0.75f, 0.5f, 0);
isTurn[i] = false;
break;
}
oldPosition = Stairs[i].transform.position;
if (i != 0)
{
int ran = Random.Range(0, 5);
if (ran < 2 && i < Stairs.Length - 1)
{
state = state == State.Left ? State.Right : State.Left;
}
}
}
}
public void SpawnStair(int cnt)
{
int ran = Random.Range(0, 5);
if (ran < 2)
{
state = state == State.Left ? State.Right : State.Left;
}
switch (state)
{
case State.Left:
Stairs[cnt].transform.position = oldPosition + new Vector3(-0.75f, 0.5f, 0);
isTurn[cnt] = true;
break;
case State.Right:
Stairs[cnt].transform.position = oldPosition + new Vector3(0.75f, 0.5f, 0);
isTurn[cnt] = false;
break;
}
oldPosition = Stairs[cnt].transform.position;
}
public void GameOver()
{
sound.loop = false;
sound.Stop();
sound.clip = dieSound;
sound.Play();
StartCoroutine(ShowGameOver()); // ���ϸ��̼��� ������ Ÿ�̹�
}
IEnumerator ShowGameOver()
{
yield return new WaitForSeconds(1f);
UI_GameOver.SetActive(true);
if(nowScore > maxScore)
{
maxScore = nowScore;
}
textMaxScore.text = maxScore.ToString();
textNowScore.text = nowScore.ToString();
}
public void AddScore()
{
nowScore++;
textShowScore.text = nowScore.ToString();
}
}






반응형
'1인 게임 개발자 나령윤기도[Unity, Flutter]' 카테고리의 다른 글
| Flutter 기본교육 - 부트캠프 - 1 (0) | 2025.10.14 |
|---|---|
| Unity 인기많은 무료 에셋 검색 및 목록추가 (3) | 2025.08.11 |
| 누구나 Unity 프로그램으로 게임 개발을 할 수 있도록 지원을 아끼지 않겠습니다. (3) | 2025.08.11 |
| 무한의 계단 나만의 색깔로 게임을 개발하고 있습니다. (2) | 2025.07.21 |
| Words Game 오픈이 드디어 얼마 남지가 않았다. (0) | 2025.06.05 |