본문 바로가기
개발/Unity

유니티 - 선택한 블럭 이동하기

by 피로물든딸기 2022. 2. 28.
반응형

Unity 전체 링크

 

선택된 블록(select == true)만, 화면의 왼쪽을 누르면 왼쪽으로, 오른쪽을 누르면 오른쪽으로 움직이도록 해보자.

 

화면의 오른쪽과 왼쪽을 구분하고 select == true인 경우만 움직이도록 코드를 추가한다.

    void Update()
    {
        Debug.DrawRay(transform.position, blockDown * rayLength, Color.red);

        if (down) transform.Translate(0, -Time.deltaTime * speed, 0);

        if(Input.GetMouseButtonDown(0) && move == false && selected == true)
        {
            Vector3 mousePoint = Camera.main.ScreenToViewportPoint(Input.mousePosition);
            Vector3 moveDir = (mousePoint.x < 0.5) ? Vector3.left : Vector3.right;

            StartCoroutine(moveBlockTime(moveDir));
        }
    }

 

하지만 블럭을 선택함과 동시에 옆으로 움직이는 부자연스러움이 발생하였다.

 

아래와 같이 checkSelected flag를 추가하면 위와 같은 현상을 막을 수 있다.

checkSelected의 위치를 반드시 지켜야 한다.

    public bool checkSelected = false;

    void Update()
    {
        if (selected == false) checkSelected = false;

        if(Input.GetMouseButtonDown(0) && move == false && checkSelected == true)
        {
            Vector3 mousePoint = Camera.main.ScreenToViewportPoint(Input.mousePosition);
            Vector3 moveDir = (mousePoint.x < 0.5) ? Vector3.left : Vector3.right;

            StartCoroutine(moveBlockTime(moveDir));
        }

        if (selected == true) checkSelected = true;
    }

 

selected와 checkSelected가 동시에 바뀌지만, 실제로는 Update의 프레임 단위마다 순서대로 실행된다.

 

마우스 Input이 들어올 때는 checkSelected는 false이기 때문에 블럭이 움직이지 않는다.

이후 selected가 true가 되어 checkSelected가 true가 된다.

 

블럭 선택을 해제할 때도 마찬가지로 먼저 selected가 false가 된 후,

checkSelected를 false로 만들어야 블럭이 움직이지 않게 된다.

 

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

public class BlockMove : MonoBehaviour
{
    public bool move = false;
    private float blockMoveTime = GlobalManager.BLOCK_MOVE_TIME;
    private float blockMoveSpeed = GlobalManager.BLOCK_MOVE_SPEED;
    
    public bool selected = false;
    public bool checkSelected = false;

    void Update()
    {
        if (selected == false) checkSelected = false;

        if(Input.GetMouseButtonDown(0) && move == false && checkSelected == true)
        {
            Vector3 mousePoint = Camera.main.ScreenToViewportPoint(Input.mousePosition);
            Vector3 moveDir = (mousePoint.x < 0.5) ? Vector3.left : Vector3.right;

            StartCoroutine(moveBlockTime(moveDir));
        }

        if (selected == true) checkSelected = true;
    }

    private IEnumerator moveBlockTime(Vector3 dir)
    {
        move = true;

        float elapsedTime = 0.0f;

        Vector3 currentPosition = transform.position;
        Vector3 targetPosition = currentPosition + dir;

        while(elapsedTime < blockMoveTime)
        {
            transform.position = Vector3.Lerp(currentPosition, targetPosition, elapsedTime / blockMoveTime);
            elapsedTime += Time.deltaTime;
            yield return null;
        }
        
        transform.position = targetPosition;

        move = false;
    }
}

블럭을 움직일 때, 화면의 절반을 기준으로 움직일 수 있지만,

마우스 포인트가 선택된 블럭(유일하다고 가정)을 기준으로 왼쪽이냐 오른쪽이냐에 따라 움직이게 할 수도 있다.

 

마우스를 Screen -> Viewport로 변환하였으니, block도 World -> Viewport로 변환하여 비교하면 된다.

        if(Input.GetMouseButtonDown(0) && move == false && checkSelected == true)
        {
            Vector3 mousePoint = Camera.main.ScreenToViewportPoint(Input.mousePosition);
            Vector3 blockPoint = Camera.main.WorldToViewportPoint(transform.position);

            Vector3 moveDir = (mousePoint.x < blockPoint.x) ? Vector3.left : Vector3.right;

            StartCoroutine(moveBlockTime(moveDir));
        }

 

Unity Plus:

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Unity Pro:

 

Unity Pro

The complete solutions for professionals to create and operate.

unity.com

 

Unity 프리미엄 학습:

 

Unity Learn

Advance your Unity skills with live sessions and over 750 hours of on-demand learning content designed for creators at every skill level.

unity.com

반응형

댓글