Unity- 자동차 스와이프 예제
2023. 8. 1.

씬으 오브젝트 배치하고 order in layer 설정을 바꿔준다. maincamera의 background color도 바꿨다.

order in layer car:2, flag:1, ground:0

interaction: 스와이프하면

 

 

car controller를 만든다.

swipe한 길이에 따라서 자동차의 이동거리를 정의

자동차가 움직이면 점점 속도가 줄어야한다.> 감쇄계수를 곱해서 적용

 

CarController.cs에서 gameobejct와 this

https://docs.unity3d.com/ScriptReference/Transform.Translate.html

 

Unity - Scripting API: Transform.Translate

Declaration public void Translate(float x, float y, float z); Declaration public void Translate(float x, float y, float z, Space relativeTo = Space.Self);

docs.unity3d.com

World 좌표계: 변하지 않는다. 항상 오른쪽이 +x, 위가 +y, 앞 +z

 

벡터의 뺄셈 - 한 오브젝트에서 다른 오브젝트까지의 거리와 방향을 구하고자 할 때 사용한다.

using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.UIElements;

public class CarController : MonoBehaviour
{
    public float x;
    public float y;
    public float z;
    float dampingCoefficient = 0.96f;//감쇠계수

    Vector3 startPos;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            startPos = Input.mousePosition;
            Debug.LogFormat("Down: {0}", startPos);//A
            //움직이기-위치 정보 변함         
            //원점으로 게임 오브젝트 이동
            Debug.Log(this);//CarController 클래스의 인스턴스
            Debug.Log(this.gameObject);//CarController 컴포넌틑가 붙어있는 게임 오브젝트 Instance
                                       //구조체의 멤버 싱글로 할당 불가
                                       //따라서 Vector3는 구조체이므로 모두 채워줘야함
                                       // x = 0.5f;
                                       // this.gameObject.transform.position += new Vector3 (x,y,z);
            this.x = 0.2f;
        }

        else if (Input.GetMouseButtonUp(0))//B
        {
            Debug.LogFormat("Up: {0}", Input.mousePosition);
            Vector3 endPos = Input.mousePosition;
            float swipeLength = endPos.x - this.startPos.x;//B.x - A.x : x좌표의 거리
            this.x = swipeLength*0.0005f;//world좌표계와 local 좌표계를 맞춰주기 위해서
            //화면 좌표계의 거리에 비례해서 이동(mousPosition은 world이므로)
        }
            this.transform.Translate(this.x, this.y, this.z);
            this.x *= dampingCoefficient;//속도가 점점 느려진다.     
    }
}

 

 

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

public class ShurikenController : MonoBehaviour
{
    float dampingCoefficient = 0.96f;//감쇠계수
    Vector3 startPos;
    float x;
    float y;
    float z;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
        
        
        GetLength();
        Move();
        Rotate();
    }

    void GetLength()//swipe 거리를 구하는 메서드
    {
        if (Input.GetMouseButtonDown(0))
        {
            startPos = Input.mousePosition;
            Debug.LogFormat("Down: {0}", startPos);//A
            
        }
        else if (Input.GetMouseButtonUp(0))
        {
            Vector3 endPos = Input.mousePosition;
            Debug.LogFormat("Up: {0}", endPos);//B
            float swipeLength = endPos.y-startPos.y;
            this.y = swipeLength*0.0005f;
            
        }
    }

    void Rotate()
    {     
            float rotAngle = 3;
            this.transform.Rotate(0, 0, rotAngle);
            rotAngle *= dampingCoefficient;//감쇠계수를 곱해 angle을 줄임
            Debug.Log(rotAngle);       
    }

    void Move()
    {
        this.transform.Translate(this.x, this.y, this.z, Space.World);
        this.y *= dampingCoefficient;//속도가 점점 느려진다.
        
    }
}

myoskin