히요코 게임

jiyoon·2023년 4월 2일
0

유니티

목록 보기
2/5
post-thumbnail

점수, 게임오버 만들기

UI 생성

Hierarchy -> 오른쪽 마우스 -> UI -> legacy -> text
Canvas 오브젝트가 자동 생성되고 그 안에 Text 오브젝트가 생김.

+ Game 뷰에서 Full HD로 변경하면 1920*1080으로 조절 됨.

Canvas : 보고 있는 게임 뷰와 동일. 사용자가 보는 화면인 모니터와 동일.
Render Mode : 모드에 따라서 설정값을 변경할 수 있는 범위가 달라짐.

  • Canvas 오브젝트는 다른 오브젝트들과 달리 Rect Transform이다.
  • 모든 UI 오브젝트들은 이 Canvas 오브젝트의 자식 오브젝트다.
    • UI를 만드는 순간 알아서 캔버스의 자식 오브젝트로 배치된다.

UI 속성

width와 Height는 텍스트 박스의 크기이다. 이 크기보다 폰트 크기가 커지면 글자가 사라진다.

앵커 ★★★

  • 앵커는 닻과 같다. 이 고정된 앵커를 기준으로 posX,Y,Z 값을 변경준다. -> 화질이 바껴도 돛이 그대로라서 따라서 잘 움직인다.
  • Alt : Also set position. Alt를 누른 상태에서 이 앵커의 위치를 누르면 텍스트가 알아서 포지션 값이 같이 바뀐다. Alt를 누르지 않으면 pivot이 그대로라서 텍스트도 그 자리 그대로이다.
  • Shift : Also set pivot. pivot은 이 텍스트 박스의 중심점이다. pivot이 같이 움직인다.

Overflow

텍스트 박스 크기와 관계없이 글자 폰트 크기를 조절하더라도 화면에 나오게 할 수 있다.
Horizontal Overflow와 Vertical Overflow의 값을 Overflow로 바꿔주면 됨

스코어 스크립트 작성

이 스코어 스크립트는 스코어 텍스트오브젝트에 붙어있고, 이 스코어 텍스트에는 텍스트라는 컴포넌트가 있고, 이 안에는 텍스트라는 속성이 또 있다.
속성 = property = 변수와 비슷

scoreText.text 변수는 이 테스트'속성'과 동일하다.

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

public class Score : MonoBehaviour
{
    public static int score; //스코어 점수 : 자동으로 0으로 초기화 됨 
    Text scoreText;     //스코어 점수 텍스트

    // Start is called before the first frame update
    void Start()
    {
        scoreText = GetComponent<Text>();   //텍스트 컴포넌트 정보 얻어오기 
    }

    // Update is called once per frame
    void Update()
    {
        scoreText.text = "Score : " + score.ToString(); /* string + int -> String 자동형변환
                                                        연산자 오버로링에 의함 -> 궁금하면 각자 공부!  */
    }
}

지난 시간 배운 히요코 크리에이터 스크립트

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

//HiyokoCreator 오브젝트는 단순히 이 스크립트를 가동시키기 위한 텅 빈 오브젝트이다 

public class HiyokoCreater : MonoBehaviour
{
    public GameObject obj;      //히요코 오브젝트 프리팹 
    public float interval = 3f; //히요코 생성 간격 
    private float time;         //시간을 재기 위한 변수 

    /* 업데이트 함수는 게임의 루프 역할. 사용자 입력을 감시 or 어떤 오브젝트의 이동 시행 
     */
    // Update is called once per frame
    void Update()
    {
        if (DeathZone.dead) return;

        /* deltaTime : 이전 업데이트 함수호출 시간과 현재 업데이트 함수호출 시간의 간격 
         컴퓨터 성능과 관계없이 최종적으로 동일한 값을 나타나게 된다 => 시간을 잴 수 있음
        ex) 1초에 30번 업데이트 * 간격(0.01) = 1초에 15분 업데이트 * 간격(0.02) */ 

        time += Time.deltaTime; //시간을 잰다.
        if (time >= interval)   //3초 이상이 되었다면 히요코 생성 
        {
            time = 0;   //시간 초기화 

            GameObject hiyoko = Instantiate(obj);   //히요코 동적 생성.
                                                    //Instantiate : 동적 생성 시키는 아주아주 중요한 함수. C : 메모리얼, C++ : new 
            //히요코의 위치를 X,Y,Z 랜덤하게 배치  
            hiyoko.transform.localPosition = new Vector3(Random.Range(-3.0f, 3.0f),
                Random.Range(1.0f, 5.0f), Random.Range(17.0f, 20.0f));  // m 단위로 생각하기~
            Score.score++;  //Score 클래스의 score 정적변수 score를 1씩 증가 시킨다 = 히요코가 생성될 때마다 score 1씩 증가 
        }

    }
}

UIController 스크립트 작성

게임오버 했을 시에만 text가 뜨게 함.

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

public class UIController : MonoBehaviour
{
    public Text text;   //GameOver 텍스트 오브젝트의 Text 컴포넌트 
    public static bool gameOver;    //Game이 종료 되었는지 여부 


    // Start is called before the first frame update
    void Start()
    {
        text.enabled = false;   //GameOver Text를 비활성화 
    }

    // Update is called once per frame
    void Update()
    {
        //gameOver 변수가 True라면 GameOver 텍스트를 활성화
        if(gameOver) { text.enabled = true; } 
    }
}

DeathZone 스크립트 작성

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

public class DeathZone : MonoBehaviour
{
    public static bool dead;    //게임오버되었을 때 히요코 생성을 멈추게 할 변수 

    // Start is called before the first frame update
    void Start()
    {
        dead = false;
    }

    //부딪힌 상대방에 대한 정보가 other로 전달받음
    //부딪혔는지 여부만 판단하는 함수 
    private void OnTriggerEnter(Collider other)
    {
        //DeathZone과 히요코가 충돌되었다면.. 
        if(other.gameObject.tag == "Hiyoko")
        {
            UIController.gameOver = true;   //GameOver 텍스트가 화면에 표시 
            dead = true;    //히요코 생성을 멈춤 
        }
    }
}

상세 변경 및 확인


히요코의 태그를 히요코로 해준다.


DeathZone -> Box Collider -> Is Trigger 체크!
충돌검사를 트리거 방식으로 검사할 때 체크해줌.
두 오브젝트가 만날 때 둘 중 하나라도 트리거가 체크 되어있을 때는 충돌하면 자동으로 트리거 방식으로 검사 됨.


텍스트 속성 비활성화 시켜주기!




리스타트, 나가기 버튼 만들기

UI 생성

Hierarchy -> Canvas -> 오른쪽 마우스 -> UI -> legacy -> Button

  • Source Image를 이용해 버튼 이미지 사용 가능

UIController 스크립트 변경


LoadGame 스크립트 작성


상세 변경 및 확인


OnClick() -> add -> 자기자신(ReStart 오브젝트) 끌어다 넣기 -> LoadGame의 ReStartGame() 함수 선택

ReStart 오브젝트를 넣는 이유?
사용하고 싶은 함수를 정의해놓은 스크립트를 가진 오브젝트이기 때문. 이렇게 되면 오브젝트의 스크립트가 뜨게 되고 그 안의 함수를 사용할 수 있게 됨.

유니티에서 다른 스크립트의 변수 or 함수를 사용할 때

1. static (정적 변수)

: 멤버 변수와 달리 해당 클래스에 하나만 생성되고 모든 인스턴스에서 공동으로 접근할 수 있는 변수.

  • 클래스 변수
  • 공유 변수

2. GetComponent

스크립트는 항상 오브젝트에 붙어있다. 스크립트도 컴포넌트다. 다른 오브젝트에 있는 스크립트 정보를 불러오고 싶다면 이 함수를 쓰면 된다.

3. 싱글톤 패턴

profile
주니어 개발자

0개의 댓글