
1단계: 화면에 놓일 오브젝트를 모두 나열

2단계: 오브젝트를 움직일 수 있는 컨트롤러 스크립트 정함
자동차 → 자동차 컨트롤러
3단계: 오브젝트를 자동으로 생성할 수 있는 제너레이터 스크립트 정함
x
4단계: UI 갱신할 수 있도록 감독 스크립트 준비
→ 자동차와 깃발 사이의 거리를 UI로 표시
5단계: 스크립트를 만드는 흐름 생각
자동차 컨트롤러 → X→ 감독 스크립트(UI 갱신)



-자동차 오브젝트 좌표 car.transform.position.x → transform 변수 ?
-유니티 오브젝트는 GameObject라는 빈 상자에 ‘컴포넌트를 추가’해서 기능 늘릴 수 있음
-Transform 컴포넌트 : 오브젝트의 좌표와 회전 관리
⚠️transform 컴포넌트 제외하고 컴포넌트 사용할 때 object.transform 이런식으로 접근x
*컴포넌트 어떻게 접근? → GetComponent 메소드 : ~컴포넌트 내놔
*자신 이외의 ‘오브젝트 컴포넌트’에 접근하는 방법
1) Find 메소드로 오브젝트 찾음
2) GetComponent 메소드로 오브젝트의 컴포넌트를 구함
3) 컴포넌트를 가진 데이터 접근
*AudioSource 컴포넌트 적용 (자동차 효과음)
-효과음 재생: 스크립트에서 AudioSource 컴포넌트의 Play 메소드 호출
using System.Collections;
using Sytem.Collectons.Generic;
using UnityEngine;
public class CarController : MonoBehaviour
{
// 자동차 속도 / 게임을 시작할 때는 0이여서 자동차 움직x
// 클릭하면 speed에 값이 설정되어 자동차 움직임
float speed = 0;
Vector2 startPos;
void Start()
{
// 게임 실행 속도가 pc에 성능에 영향x
Application.targetFrameRate = 60;
}
void Update()
{
if (Input.GetMouseButtonDown(0))
{
// 마우스를 클릭 시작지점
this.startPos = Input.mousePosition;
}
else if (Input.GetMouseButtonUp(0))
{
// 끝 지점
Vector2 endPos = Input.mousePosition;
// 스와이프 길이
float swipeLength = endPos.x - this.startPos.x;
// 스와이프 길이를 speed에 대입 / 처음 속도
this.speed = swipeLength / 500f;
// 스크립트 열리면 효과음 내는 처리
GetComponent<AudioSource>().Play();
}
// Translate 메소드 : this.speed만큼 x축으로 이동
transform.Translate(this.speed, 0, 0);
// 감속
this.speed *= 0.98f;
}
}
*Translate 메소드
-게임 오브젝트를 현재 좌표에서 인수 값만큼 이동시키는 메소드
-인수가 현재 좌표값을 직접 나타내는 것x
→ Translate(0, 3, 0) 은 (0, 3, 0)의 좌표로 이동하는 것x
현재 지점에서 y축 방향으로 3만큼 이동한다는 의미!
*스와이프로 자동차 움직이기!!
-스와이프 길이에 따라 자동차 이동 거리 바꾸기
-마우스 드래그 동작 = 스마트폰의 스와이프 동작
-스와이프 길이(드래그 길이)에 따라 자동차 이동 거리를 바꾸려면?
➡️ 스와이프 길이를 자동차의 초기 속도로 설정하는 것이 좋음
- 스와이프 길이가 짧으면 → 처음 속도 값이 줄어 짧은 거리만 달려
- 길면 → 처음 속도 값이 늘어 긴 거리를 달림
*스와이프 길이
-클릭을 시작한 좌표, 클릭을 끝난 좌표의 차이
-GetMouseButtonDown, GetMouseButtonUp
-각 지점의 마우스 좌표(Input.mousePosition)를 구하고 두 좌표의 차이가 스와이프 길이
*월드 좌표계
-오브젝트가 게임판 어디에 있는 지를 나타냄
-지금까지 Inspector 창에서 설정한 좌표
*로컬 좌표계
-게임 오브젝트가 개별적으로 갖는 좌표계
-Translate 메소드를 사용하면 이동방향은 로컬 좌표계로 계산
-오브젝트가 회전하면 방향이 회전한 좌표계로 계산
⚠️오브젝트가 회전하면서 동시에 이동할 때 주의!

*UI 설계 방침
-UI는 게임의 상태, 진행 상황을 표시하는 것 → 게임 재밌게 할 수 있도록 함
-유니티에서 UI 부품 패키지 제공해서 UI 설계 간단히 할 수 있음
-UI 부품 라이브러리를 사용해 <자동차와 깃발 사이의 거리>를 표시
-TextMeshPro(텍스트 표시용 패키지)의 Text를 사용
-Text를 배치하면 Text 표시를 갱신하는 감독 스크립트를 작성해 감독 오브젝트에 적용
*UI 만드는 방법
1) UI 부품을 Scene 뷰에 배치
2) UI를 갱신하는 감독 스크립트를 작성
3) 빈 오브젝트를 만들고 작성한 스크립트를 적용
*Text를 사용해 거리 표시
- 자동차와 깃발의 거리를 표시하는 글자 UI를 만듦
-EventSystem
- 사용자 입력과 UI 부품 중간에서 이어주는 오브젝트
-Distance의 위치, 크기 조정 - Rect Transform
- UI에서는 부품의 좌표를 표시할 때 Transform이 아닌 Rect Transform 사용
Transform : 위치, 회전, 크기 변경 가능
Rect Transform : 위치, 회전, 크기 + 피벗(확대, 축소), 앵커(기준이 되는 위치) 변경 가능
*UI를 갱신하는 감독(스크립트) 만들기 → GameDirector
using System.Collections;
using Sytem.Collectons.Generic;
using UnityEngine;
using TMPro;
// UI 사용하려면 TMPro를 임포트 해야함!!
public class GameDirector : MonoBehaviour
{
// object 위치를 저장할 변수 선언
GameObject car;
GameObject flag;
GameObject distance;
void Start()
{
// 씬 안에서 오브젝트 찾아 GameObject 변수에 넣기 -> Find 메소드
this.car = GameObject.Find("car");
this.flag = GameObject.Find("flag");
this.distance = GameObject.Find("Distance");
}
void Update()
{ // 컴포넌트
float length = this.flag.transform.position.x - this.car.transform.position.x;
this.distance.GetComponent<TextMeshProUGUI>().text
= "Distance: " + length.ToString("F2") + "m";
//.distance -> distance 오브젝트의
// .GetComponent<TextMeshProUGUI>() -> 거리 사용하는 UI 요소
// .text -> 텍스트 내 변경
// TextMeshProUGUI 컴포넌트를 가진 UI 요소에 "Distance: "와
// 소수점 이하 2자리까지의 거리 값과 "m"을 표시하는 텍스트를 설정
}
}
*감독 스크립트는 자동차와 깃발 위치를 조사하고 둘 사이의 거리를 계산한 후 계산한 거리를 UI에 표시한다
-스크립트에서 자동차, 깃발, UI 오브젝트를 다루어야 함
-위 3가지에 대응하는 GameObject형 변수를 준비
-각 GameObject형 변수에 대응하는 오브젝트를 씬 안에서 찾아 넣어야 함
// 씬 안에서 오브젝트를 찾아 넣기 → Find 메소드
-오브젝트 이름을 인수로 전달, 인수 이름이 게임 씬에 있으면 해당 오브젝트를 반환
*오브젝트 각각의 x 좌표
car.transform.position.x
*distance 오브젝트의 TextMeshProUGUI 컴포넌트에 앞서 구한 거리를 대입
-ToString은 값을 문자열로 변환하는 메소드
-인수에는 값을 표시할 형식 지정 가능

*스크립트를 감독 오브젝트에 적용
-완전히 빈 오브젝트 만들고 거기에 스크립트 전달
-완전히 빈 오브젝트는 감독 오브젝트로 변신해 감독 역할