EasyCastleUNITY

Swipe Car && 수리검 던지기 본문

유니티 기초

Swipe Car && 수리검 던지기

EasyCastleT 2023. 8. 1. 12:53

Swipe Car

전체적인 SwipeCar의 모습

CarController

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

public class CarController : MonoBehaviour
{
    private float moveSpeed = 0.0f;
    float dampingCoefficient = 0.96f; //감쇠 계수

    private Vector3 startPos; // down 했을 때 위치 
    private Vector3 endPos; //up 했을 때 위치 
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        //왼쪽 마우스 버튼을 눌렀다면
        if (Input.GetMouseButtonDown(0))
        {
            Debug.LogFormat("Down: {0}", Input.mousePosition);
            this.startPos = Input.mousePosition;
        }
        //버튼이 띄어지는 순간
        else if(Input.GetMouseButtonUp(0))
        {
            Debug.LogFormat("Up: {0}", Input.mousePosition);
            this.endPos = Input.mousePosition;
            //Vector3 c = this.endPos - this.startPos;
            float swipeLength=this.endPos.x - this.startPos.x;
            Debug.LogFormat("swipeLength:{0}",swipeLength);
            //화면 좌표계에서의 두점사이의 거리에 비례해서 이동
            //but, 이동 좌표계가 안맞아서 어림잡아 500정도 나눔
            this.moveSpeed = swipeLength / 500f;
            Debug.LogFormat("moveSpeed: {0}", moveSpeed);
            
        }

        this.transform.Translate(this.moveSpeed, 0, 0);
        //감쇠 , 점점 감소 -> 0.00x 0과 비슷해짐 
        this.moveSpeed *= this.dampingCoefficient;

    }
}

유의해야 될 점, 

Input.mousePosition을 통해 swipeLength를 계산한다. 

문제점은 이 메서드는 pixel 좌표계를 통해 계산을 하기에,

이 값을 그대로 누르면 한번 이동시키면, 예를 들어, 880unit 같이 한번에 엄청나게 이동하게 되는 것이다. 

 

즉, 이 값을 사용하기위해, 크기를 줄인다. 500정도를 나누었다. 

이값을 moveSpeed에 저장하고, 계속 움직이는 것을 막기 위해 감쇠 계수를 이용하여 속도를 0 가까이 만들어준다. 

Swipe Car 결과

수리검 던지기

 

수리검 던지기 화면

ShurikenController

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

public class ShurikenController : MonoBehaviour
{
    private float moveSpeed =0.0f;
    private float dampingCoefficient = 0.96f;
    private float rotAngle = 0.0f;

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

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            this.startPos = Input.mousePosition;
            Debug.LogFormat("Down: {0}", this.startPos);
        }
        else if (Input.GetMouseButtonUp(0))
        {
            this.rotAngle = 10; //클릭시 회전 각도 10으로 
            //이동
            this.endPos = Input.mousePosition;
            Debug.LogFormat("Up:{0}", this.endPos);
            float swipeLength = this.endPos.y - this.startPos.y;
            this.moveSpeed = swipeLength / 1000f;
            Debug.LogFormat("moveSpeed: {0}", moveSpeed);
            //회전
        }
        //회전 하면 수리검의 local좌표계의 y방향도 바뀌므로
        //제대로 이동시키려면 이동은 world 좌표계를 기준으로 이동하도록 만들어 준다.
        //회전
        this.transform.Rotate(0, 0, rotAngle);
        this.rotAngle *= dampingCoefficient;
        //이동
        this.transform.Translate(0, this.moveSpeed, 0,Space.World);
        this.moveSpeed *= dampingCoefficient;
        
    }
}

유의해야 될점

회전과 이동이 같이 들어가게 되면서 간단한 문제가 발생한다. 

바로 회전을 하는 순간, 수리검의 local 좌표계의 y도 계속 변하기 때문이다. 

따라서 회전을 하며, 원래대로 날아가게 하려면, 

이동을 local 좌표계가 아닌, world 좌표계를 통해 움직이게 하는 것이 좋다. 

수리검 결과

'유니티 기초' 카테고리의 다른 글

구름 오르기  (0) 2023.08.02
고양이 화살 피하기 게임  (0) 2023.08.02
2023/08/01 복습  (0) 2023.08.01
Swipe car 음향 및 UI 추가  (0) 2023.08.01
간단 룰렛  (0) 2023.08.01