SwipeCar

dev bourgeois·2023년 11월 21일

Unity VR/AR

목록 보기
3/8
post-thumbnail

SwipeCar 단계별 게임 리소스

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

2단계: 오브젝트를 움직일 수 있는 컨트롤러 스크립트 정함
자동차 → 자동차 컨트롤러

3단계: 오브젝트를 자동으로 생성할 수 있는 제너레이터 스크립트 정함
x

4단계: UI 갱신할 수 있도록 감독 스크립트 준비
→ 자동차와 깃발 사이의 거리를 UI로 표시

5단계: 스크립트를 만드는 흐름 생각
자동차 컨트롤러 → X→ 감독 스크립트(UI 갱신)


컴포넌트

-자동차 오브젝트 좌표 car.transform.position.x → transform 변수 ?

-유니티 오브젝트는 GameObject라는 빈 상자에 ‘컴포넌트를 추가’해서 기능 늘릴 수 있음

  • Rigidbody(물리적으로 움직), AudioSource(소리 내게)
    -자체 기능 늘리고 싶으면 → 스크립트 컴포넌트 추가

  • 컨트롤러 스크립트, 감독 스크립트도 컴포넌트의 일종!

-Transform 컴포넌트 : 오브젝트의 좌표와 회전 관리
⚠️transform 컴포넌트 제외하고 컴포넌트 사용할 때 object.transform 이런식으로 접근x


*컴포넌트 어떻게 접근? → GetComponent 메소드 : ~컴포넌트 내놔

  • GetComponent<AudioSource>()
  • GetComponent<Text>()

*자신 이외의 ‘오브젝트 컴포넌트’에 접근하는 방법

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 설계 간단히 할 수 있음
-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은 값을 문자열로 변환하는 메소드
-인수에는 값을 표시할 형식 지정 가능

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

0개의 댓글