✔ 일반적인 오브젝트 = Transform : GameObject의 상대 위치, 회전 및 크기를 정의하기 위한 구성 요소를 가짐
✔ UI = Rect Tansform : Transform이지만 개체를 UI 요소로 관리하기 위한 추가 정보를 가지고 있음 아래 보면 Anchors / Pivot 이 추가되있는데, 각각의 정의는 아래와 같다 즉, 큰화면 / 작은화면 상관없이 동일하게 제작하기 위해 기준점을 가지고 포지션을 정한다고 할 수 있음
앵커와 피벗의 정의 (공식문서) 출처 : https://answers.unity.com/questions/1626018/what-is-the-difference-between-transform-and-rectt.html
b. ScoreText에서 Text(UI) 생성하고 Anchor 등 설정하기
0) Text를 생성하기
1) Anchor을 맞추기
min 0, 0.8 / max 1, 1
2) 크기 및 설정하기
left, top, right, bottom, position Z 0
🧡 Anchor / Anchor에 따른 Stretch 이해하기
캔버스 전체 맞추기 = 최소값 0, 최대값 1
위와같이 최소값 0, 최대값 1로 맞춘다면 캔버스 가득 앵커가 맞춰지게 됨 위의 상태에서 객체의 크기를 0으로 맞춰줘서 앵커와 동일하게 하면 아래와 같이 앵커와 크기가 동일해짐!
C. Text에 Score 스크립트 만들기
🧡 static의 개념
간단하게만 적자면, static 을 클래스 밖에서도 클래스에 접근해서 조작할 수 있음
[코드설명]
a) 제어가능한 숫자 score을 선언해 주기
b) 업데이트 함수에 score을 텍스트로 받기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Score : MonoBehaviour
{
public static int score = 0; // a)
void Start()
{
}
// Update is called once per frame
void Update()
{
GetComponent<Text>().text = score.ToString(); // b) 스코어의 텍스트를 받기
}
}
d. 파이프를 지나갈 때 점수 올려주는 기능 구현하기
1) 파이프 프리팹 안에 CreateEmpty(ScoreUp) 생성하기
삭제해서 Hierarchy에 없다면 프리팹에서 끌어다 가져오면 됨
2) 충돌을 감지할 Box Collider 2D를 생성하고 위치를 잡아주기
Is Trigger 체크하기
🧡 Collision, Trigger 차이점
✔ Collision 충돌해서 지나가지 못함 ✔ Trigger 관통 가능
3) 변경된 프리팹을 Apply 하고 Hierarchy에서 삭제하기
4) ScoreUp에 ScoreUp 스크립트 생성하기
[코드설명]
a) OnTriggerEnter2D: 트리거에 진입 했을 떄 발동
b) 위에서 Text에 Score스크립트에서 전역으로 선언한 score 변수를 1점씩 올림
public class ScoreUp : MonoBehaviour
{
private void OnTriggerEnter2D(Collider2D other) { // a)
Score.score++; // b)
}
}
5) 여기까지의 결과물
파이프가 중간부터 나오는건 이후에 수정했다 (왜 몰랐지..)
8. GameOver Scene 만들기
a. SampleScene 을 PlayScene으로 rename
b. File -> New Scene (Basic 2D) 으로 새로운 씬 생성
이름 : GameOverScene
폴더 경로 : PlayScene
c. GameOverScene 설정하기
0) Canvas 추가하기
1) Canvas -> Panel 생성하고 Panel 에 배경이미지 넣어주기
2) Color로 살짝 어둡게 설정
3) Panel안에 Image 추가해서 GameOver 생성하기
Preserve Aspect 로 비율 맞춰주기
4) Anchor로 크기 맞추기
Anchor : min 0.1, 0.8 / max 0.9, 1
Left, Top , posX 등 모두 0으로 맞추기
5) Score(text) 생성 후 Anchor, 크기 맞추기
Anchor : min 0.1, 0.7 / max 1, 0.8
Left, Top , posX 등 모두 0으로 맞추기
색상, 내용, 크기, 정렬 맞춰주기
6) 위 Score 복사 후 BestScore 생성하기
Anchor 알맞게 조절해주기
7) Button(UI) 생성하기
Anchor : min 0, 0.4 / max 1, 0.5
Left, Top , posX 등 모두 0으로 맞추기
안에 자동으로 생성되는 Text는 삭제하기
위까지 했으면 잘 저장하고 PlayScene으로 넘어가기
9. Scene 전환하기
a. Scene 전환 타이밍 알기
기본적으로, 파이프와 새가 부딪혔을때 게임이 종료되어야 함으로, 새가 가지고 있는 스크립트에 충돌 함수를 넣어주면 됨!
b. BirdJump 충돌 구현하기
public class BirdJump : MonoBehaviour
{
...
private void OnCollisionEnter2D(Collision2D other) {
SceneManager.LoadScene("GameOverScene");
}
}
c. Build Setting 에 추가되어있지 않은 GameOverScene을 추가해주기
여기까지 진행상황
Text에 Score 스크립트가 빠져서 점수가 안올라감 (수정완료)
10. GameOverScene 기능 구현하기
a. Button 기능 구현하기
0) createEmpty로 Replay 객체 생성
1) Replay 객체에 Replay Script 생성하기
2) Replay Script 작성하기
버튼을 누르면 플레이 씬이 로드되게 하기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class Replay : MonoBehaviour
{
public void ReplayGame(){
SceneManager.LoadScene("PlayScene");
}
}
3) Button에 있는 On Click()에 위에서 작성한 Replay 객체를 넣어주기
4) Replay 객체가 가지고 있는 속성 ReplayGame()을 설정하기
b. CurrentScore스크립트 만들기
1) Score에 CurrentScore Script를 생성함
2) CurrentScore 작성
[코드설명]
a) 현재 사용하고 있는 텍스트를 올라가고 잇는 점수로 넣어줌
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class CurrentScore : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
GetComponent<Text>().text = "Score : " + Score.score.ToString(); // a)
}
}
c. Score 초기화, Best Score 생성하기
1) 시작할 때 점수가 유지되어서 실행되니, Start() 함수에 점수를 초기화 하는 코드를 넣어줌
2) bestScore 변수를 생성해줌
public class Score : MonoBehaviour
{
public static int score = 0;
public static int bestScore = 0; // 2)
void Start()
{
score = 0; // 1)
}
...
}
d. Best Score 갱신하기
새가 부딪히는 순간 게임이 끝나고, 거기서 점수를 비교해야 하니 BirdJump.cs에서 구현
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class BestScore : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
GetComponent<Text>().text = "BestScore : " + Score.bestScore.ToString(); // a)
}
}