ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Vector와 transform 응용, UI 표시, 효과음 삽입
    유니티/유니티 메인 2024. 2. 3. 17:28

    마우스가 스와이프하는만큼 자동차가 움직이고 깃발에 닿는 순간 게임종료

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Carcontroller : MonoBehaviour
    {
        float carspeed;
        void Update()
        {
            if (Input.GetMouseButtonDown(0))
            {
                carspeed = 0.1f;
            }
            transform.Translate(this.carspeed, 0, 0);
            this.carspeed *= 0.99f;
        }
    }

    우선 전 글에서 배운걸 응용하여 클릭한번에 0.1f의 힘만큼 움직이다 서서히 멈추게 한다

     

    carcontroller 스크립트를 만들어 car에 집어넣었다

    하지만 내가 원하는건 클릭할때 움직이는것이 아닌, 마우스가 스와이프되는 거리만큼 힘을 받아 움직이는 자동차이다

    여기서 GetMouseButtonUp과 MousePosition까지 이용하여 스크립트를 짜보았다

     

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Carcontroller : MonoBehaviour
    {
        Vector2 start;
        Vector2 end;
        float speed;
    
        void Update()
        {
            
            if (Input.GetMouseButtonDown(0))
            {
                start = Input.mousePosition;
            }
            else if(Input.GetMouseButtonUp(0))
            {
                end = Input.mousePosition;
                float dir = (end.x - start.x);
                this.speed = dir/500;
            }
            // this.speed = dir/500;
            transform.Translate(this.speed, 0, 0);
            this.speed *= 0.91f;
        }
    }

    1. 클릭했을때와 땠을때 마우스의 위치를 Mouseposition을 이용하여 전달받는다

    2. dir은 눌렀을때와 땠을때의 x 거리를 가지는 변수

    3. speed는 속도 조절을 위해 dir의 값을 500으로 나눠준다

    4. 그 speed로 차를 이동시켜준다

     

    *만약 //this.speed = dir / 500; 을 밑으로 내려버릴시 매 프레임 넘어갈때마다 speed의 값이 초기화되기 때문에 차가 멈추질 않는다

    <UI 생성>

    1. Hierarchy 창에서 UI -> Text - TextMeshPro 선택

    2. 거리를 표현하기 위한 텍스트이므로 이름을 Distance로 변경

     

    *UI는 기본적으로 Canvas라는 오브젝 밑으로 들어간다.

    또 그 밑에 EventSystem이라는 오브젝트도 같이 생성되는데 이건 지워도 된다고 한다. 어따 쓰는지 모르겠음

     

    3. 글꼴과 크기를 맞춰준다. 실제 텍스트는 게임의 Scene뷰에 비해 압도적으로 크니 참고할것

    4. Anchor Presets으로 실제 게임 화면에서 텍스트가 어느 위치에 보일지 조절할수 있다. (Shift와 ctrl 사용)

     

    <UI 갱신>

    새 스크립트를 만들고 GameDirector로 이름을 짓는다

     

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using TMPro;     // using UnityEngine.UI 대신 사용 
    
    public class GameDirector : MonoBehaviour
    {
        GameObject car;
        GameObject flag;
        GameObject distance;
        void Start()
        {
            
            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 = "목표 지점까지 " + length.ToString("F2") + "m";
                                         <Text> 대신사용   
        }
    }

     

    1. class 제일 위에 Gameobject 형식의 car, flag, distance를 Find 메서드로 인식시킨다

     

    Find 메서드 : 오브젝트 이름을 인수로 전달하고 인수 이름이 게임 씬 안에 있으면 해당 오브젝트를 반환

     

    2. length는 깃발이 있는 위치의 x값에서 car가 있는 위치의 x값을 빼준 길이이다

     

    3.      this.distance.GetComponent<TextMeshProUGUI>().text = "목표 지점까지 " + length.ToString("F2") + "m";

       3-1. 우선 텍스트 UI에 컴포넌트를 입힌다           

       3-2. "목표지점까지" + float형 length를 문자형으로 바꾸어 출력(F2는 소수점 자리수를 2자리까지 표시하겠다는뜻) + "m"

     

    4. 빈 오브젝트 GameDirector를 만들고 스크립트 삽입

     

    실행전 - 실행후

    5. 결과가 잘 나오는것을 확인

     

    사실 이 결과를 보기까지 꽤 오랜 시간이 걸렸는데, 분명 코드를 맞게 작성을 해도 시작시 New Text에서 변하질 않았다

     

    이것저것 다 뒤져보다가 결국 알게 된 것인데 이유는 책에서 알려준 Text가 아닌 TextMeshPro를 사용했기 때문

     

    using UnityEngine.UI;  (X)
    using TMPro;               (O)

     

    처음 선언이 잘못되었고

     

    this.distance.GetComponent<TextMeshProUGUI>().text

     

    이것도 잘못되었었다

     

    <효과음 설정>

    1. car를 선택후 Audio - Audio Source 컴포넌트를 추가해준다

     

    2. Audio 클립에 미리 받아둔 사운드 소스를 집어넣고 Play On Awake 체크를 해제한다

    (체크했을시 게임이 시작한 시점에서 자동으로 소리가 재생된다)

     

    public class Carcontroll : MonoBehaviour
    {
        Vector2 start;
        Vector2 end;
        float speed = 0;
        void Update()
        {
            if (Input.GetMouseButtonDown(0))
            {
                this.start = Input.mousePosition;
            }
            else if (Input.GetMouseButtonUp(0))
            {
                this.end = Input.mousePosition;
                float dir = this.end.x - this.start.x;
                this.speed = dir / 500;
    
                GetComponent<AudioSource>().Play();   //컴포넌트 추가
            }
            transform.Translate(this.speed, 0, 0);
            this.speed *= 0.98f;
        }
    }

    3. car에 들어간 스크립트에서 수정

     

                                                     GetComponent<AudioSource>().Play();

     

    - GetComponent<AudioSource>()로 AudioSource 컴포넌트를 구하고, AudioSource의 Play 메서드를 호출한다

     

    4. 소리가 나오는것을 확인한다

Designed by Tistory.