와챠의 우당탕탕 코딩 일기장

[Unity] 게임 규칙 만들기 본문

코딩 일기장/Unity

[Unity] 게임 규칙 만들기

minWachya 2021. 10. 31. 17:41
반응형

<규칙들>

1, 캐릭터 떨어지면 시작 위치로 되돌려 놓기

2, 목표 지점 만들기

3, 타이머 기능 만들기

4, 게임 종료 후 보일 화면 만들기

 

1, 캐릭터 떨어지면 시작 위치로 되돌려 놓기

1-1, 큐브 오브젝트 하나 추가하고 이름 OutArea로 변경

1-2, 위치, 크기 설정

1-3, 투명하게 만들어주기

-Mesh Render의 빨간 동그라미 부분 클릭

-Remove Component 클릭

1-4, 충돌 판정 위해 is Trigger 체크하기

1-5, C# 충동 처리를 위한 스크립트 생성하기 (이름 : Out)

1-6, 스크립트 작성

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// 씬 관리 클래스(씬 생성, 씬 로드, 씬 합치기, 여러 씬 중 현재 active 되어있는 씬이 무엇인지 설정)
using UnityEngine.SceneManagement; 
 
// Player가 떨어질 때 시작 위치로 돌려놓기
public class Out : MonoBehaviour
{
    // OutArea에 물체 닿았을 때 자동 호출
    void OnTriggerEnter(Collider col)
    {
        // 충돌된 물체가 Player면
        if (col.gameObject.tag == "Player")
        {
            // 현재 씬 다시 로드하기(처음부터 다시 시작하기)
            SceneManager.LoadScene(SceneManager.GetActiveScene().name);
        }
    }
}

1-7, 스크립트 적용

 

(+) 새로 시작 시 조명 어두워지는 현상 해결하기

-Window > Rendering > lighting  클릭

-Generate Lighting 클릭


!!하이어라키 창 정리하기!!

1, +클릭하고  Create Empty 클릭

2, 이름 Stage로 변경

3, Stage 관련 오브젝트 넣어주기

4, 다른 오브젝트도 같은 방법으로 정리해주기


2, 목표 지점 만들기

2-1, 목표 지점 영역 만들기

-Cube 생성 후 이름 설정(GoalArea)

2-2, 적절히 위치 지정

2-3, 투명하게 하기

-Mesh Render의 빨간 동그라미 부분 클릭

-Remove Component 클릭

2-4, 충돌 체크 위해 is Trigger 체크해주기

2-5. 충돌 처리 위해 C# 스크립트 생성(이름 : Goal)

2-6, 스크립트 작성

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


// 플레이어가 목표 지점 도착할 때 처리
public class Goal : MonoBehaviour
{
    public static bool goal;

    void Start()
    {
        goal = false;
    }


    void OnTriggerEnter(Collider col)
    {
        // 플레이어와 충돌이 일어났다면(플레이어가 목표 지점에 도착했다면)
        if (col.gameObject.tag == "Player")
        {
            goal = true;
        }
    }
}

2-7, GoalArea에 Goal 스크립트 붙이기


3, 타이머 기능 만들기

3-1, 시간 보여주는 텍스트 추가

-UI > Text 클릭

3-2, 위치, 글씨 크기, 글씨 색상 지정

3-3, 타이머 기능 구현 위해 C# 스크립트 생성(이름 : Timer)

3-4, 스크립트 작성

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

// 타이머
public class Timer : MonoBehaviour
{
    
    public static float time;

    // 시작 시 시간은 0
    void Start()
    {
        time = 0;
    }

    // 프레임 변경 때마다 시간 차 더해주기
    void Update()
    {
        // 게임이 종료되지 않을 때만 시간 업데이트
        if (Goal.goal == false)
        {
            time += Time.deltaTime;
        }
        // 시간 정수형으로 해주기(반내림)
        int t = Mathf.FloorToInt(time);
        // TimerText 컴포넌트 가져와서 설정해주기
        Text uiText = GetComponent<Text>();
        uiText.text = "Time : " + t;
    }
}

3-5, TimerText에 Timer 스크립트 붙이기


4, 게임 종료 후 보일 화면 만들기

4-1, Text 추가하기(이름 : ResultText)

4-2, Text 내용, 글씨 크기, 글씨 색상, 위치 등 지정

4-3, 게임 종료를 위한 텍스트 생성(이름 : ResultTimerText)

4-4, 텍스트 이름, 크기, 색상, 위치 등 설정

4-5, 최고 기록 출력을 위한 텍스트 추가(이름 : BaseTimerText)

4-6, 텍스트 이름, 크기, 색상, 위치 등 설정

4-7, 게임 다시 시작하기 위한 버튼 추가(이름 : RetryButton)

4-8, 텍스트, 위치, 색상 등 설정...

4-9, Canvers 안에 Create Empty 클릭 후 게임 종료 후에"만" 보일 오브젝트 넣어주기

4-10, Result 앞의 체크버튼을 해제하여 UI들 숨기기

4-11, 게임 종료 후 결과 화면을 보이기 위한 스크립트 생성

4-12, 스크립트 작성

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

// 게임 종료 후 UI들 보이게 하기
// 지금까지의 결과 출력
public class GameResult : MonoBehaviour
{
    public GameObject resultUI;
    public Text resultTime; // 게임 종료에 걸린 시간 텍스트
    public Text baseTime;   // 최고 기록 텍스트

    private int highScore;  // 최고 기록 변수

    // 게임 시작 시 최고 기록 초기화
    void Start()
    {
        // 저장된 최고 기록이 있다면
        if (PlayerPrefs.HasKey("HighScore"))
        {
            // 최고 기록을 저장된 값으로 초기화
            highScore = PlayerPrefs.GetInt("HighScore");
        }
        // 없으면 999로 하기
        else
        {
            highScore = 999;
        }
        
        
    }

    // 게임이 종료됐는지 매 프레임마다 확인
    void Update()
    {
        // 게임이 종료됐으면
        if (Goal.goal == true)
        {
            // Result 안의 UI들 보이게 하기
            resultUI.SetActive(true);
            // 경과 시간 보이기
            // 정수로 변경
            int result = Mathf.FloorToInt(Timer.time);
            resultTime.text = "Result Time : " + result;
            // 최고 기록 보이기
            baseTime.text = "Base Time : " + highScore;

            // 현재 기록이 이전 최고 기록보다 더 짧다면 최고 기록 변경
            if (highScore > result)
            {
                PlayerPrefs.SetInt("HighScore", result);
            }
        }
    }
}

4-13, Canvers에 스크립트 붙이기

4-14, resultUI에 컴포넌트 할당

결과 ㅎㅎ

반응형
Comments