본문 바로가기
개발/Unity

유니티 - 오브젝트를 선택된 상태로 만들기 : (2) 이미지로 만들기

by 피로물든딸기 2022. 4. 9.
반응형

Unity 전체 링크

 

오브젝트를 선택된 상태로 만들기 : (1) bool
오브젝트를 선택된 상태로 만들기 : (2) 이미지로 만들기
오브젝트를 선택된 상태로 만들기 : (3) Shader Outline
오브젝트를 선택된 상태로 만들기 : (4) 오브젝트를 하나만 선택하기


오브젝트를 클릭하였을 때, selected가 변경되었으므로, 큐브에 outline을 이미지 texture로 만들어보자.

(Unity Cube Outline 만들기 / Edge Detection Outline)

 

적당한 outline을 찾는다.

 

그림판 3D를 이용해 적절히 자른다.

 

아래는 적절히 자른 이미지다.


Outline Material을 만들어서 큐브에 추가한다.

 

Shader → Text Shader로 변경한다.

 

outline을 추가한다.

 

Color를 원하는 값으로 변경하면 아래의 모습을 볼 수 있다.

 

Outline 큐브 아래에 다시 큐브를 추가한다.

Material을 추가하여 TransParent 큐브에 추가한다.

 

Shader → UI/Unlit/Transparent를 선택하고 원하는 Color와 alpha 값을 설정한다.

 

이제 완성된 Outline을 큐브의 자식에 추가한다.

 

script에서 selectOutline 오브젝트를 추가한 후, select 된 경우에 보이도록 코드를 수정한다.

    GameObject selectOutline;

    private void Start()
    {
        rayLength = 1.414f / 2.0f * transform.localScale.y + 0.5f;

        selectOutline = transform.Find("Outline").gameObject;
        selectOutline.SetActive(false);
    }
    
    void Update()
    {
		...

        if (selected == false) selectOutline.SetActive(checkSelected = false);

		...

        if (selected == true) selectOutline.SetActive(checkSelected = true);
    }

 

선택된 오브젝트는 아래와 같이 outline이 생기게 된다.

 

최종 코드는 아래와 같다.

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;

    public bool down = true;
    public float speed = GlobalManager.BLOCK_DOWN_SPEED; //Block의 이동 속도

    private RaycastHit hit;
    Vector3 blockDown = Vector3.down;
    Vector3 blockUp = Vector3.up;

    public float rayLength;

    GameObject selectOutline;

    private void Start()
    {
        rayLength = 1.414f / 2.0f * transform.localScale.y + 0.5f;

        selectOutline = transform.Find("Outline").gameObject;
        selectOutline.SetActive(false);
    }

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

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

        if(selected)
        {
            Debug.DrawLine(transform.position, Input.mousePosition * 1000, Color.red);
        }

        if (selected == false) selectOutline.SetActive(checkSelected = false);

        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));
        }

        if (selected == true) selectOutline.SetActive(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;
    }

    private void OnTriggerEnter(Collider col)
    {
        if (Physics.Raycast(transform.position, blockDown, out hit, rayLength))
        {
            down = false;

            float height = hit.transform.position.y + hit.transform.localScale.y / 2.0f + transform.localScale.y / 2.0f;
            transform.position = new Vector3(transform.position.x, height, transform.position.z);

            Debug.Log("point " + hit.point + "/ distance " + hit.distance + "/ name " + hit.collider.name);
        }
    }
}

이미지를 사용하는 방법 말고 shader를 이용해 outline을 주고 싶다면 링크를 참고하자.

 

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

반응형

댓글