본문 바로가기
개발/Unity

유니티 Color Picker로 오브젝트 색깔 변경하기

by 피로물든딸기 2022. 3. 20.
반응형

Unity 전체 링크

 

오브젝트를 더블 클릭하면, 색상을 선택할 수 있도록 구현해보자.

 

color picker에 연결할 오브젝트를 추가한다.

public GameObject linkedObject;

 

color picker는 유일하도록 싱글턴으로 만든다.

    private static CircleColorPicker instance = null;
    public static CircleColorPicker Instance
    {
        get
        {
            if (null == instance) instance = FindObjectOfType<CircleColorPicker>();
            return instance;
        }
    }

    private void Awake()
    {
        if (null == instance) instance = this;
    }

 

게임이 시작되면 color picker는 꺼두도록 한다.

    void Start()
    {
        this.gameObject.SetActive(false);
		...
    }

 

연결된 오브젝트의 Mesh Renderer에 접근하여 색을 변경한다.

    private void selectColor()
    {
		...
        
        selectedColor = getColor();

        linkedObject.GetComponent<MeshRenderer>().materials[0].color = selectedColor;
    }

 


색을 변경하고 싶은 오브젝트를 만들고 스크립트를 추가한다.

 

double click 이벤트가 들어오는 경우

 

color picker가 꺼졌다면

 - color picker를 켜고, color picker의 linkedObject에 현재 오브젝트를 연결한다. 

 

color picker가 켜졌다면

 - color picker가 켜진 상태인데, 다른 오브젝트를 클릭하는 경우무시한다.

 - 현재 오브젝트를 다시 더블클릭한 경우이므로 color picker를 끄고 연결된 오브젝트를 제거한다.

 

color picker의 활성화 여부는 activeSelf로 알 수 있다.

    if (CircleColorPicker.Instance.gameObject.activeSelf == false)
    {
        pickerOnOff = true;
        CircleColorPicker.Instance.gameObject.SetActive(true);

        CircleColorPicker.Instance.linkedObject = this.gameObject;
    }
    else
    {
        /* 현재 연결된 오브젝트가 아닌 경우는 끌 수 없음 */
        if (CircleColorPicker.Instance.linkedObject.name != this.gameObject.name) return;

        pickerOnOff = false;
        CircleColorPicker.Instance.gameObject.SetActive(false);
        CircleColorPicker.Instance.linkedObject = null;
    }

 

Update에서 현재 오브젝트가 움직이는 경우 같이 움직이도록 설정하면 된다.

    private void Update()
    {
        if(pickerOnOff)
        {
            CircleColorPicker.Instance.gameObject.transform.position
                = Camera.main.WorldToScreenPoint(transform.position + Vector3.up * 2);
        }     
    }

 

오브젝트를 더블클릭하면 오브젝트의 색상을 변경하는 것을 볼 수 있다.


최종 코드는 아래와 같다.

 

CircleColorPicker.cs

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

public class CircleColorPicker : MonoBehaviour
{
    public Image circlePalette;
    public Image picker;
    public Color selectedColor;
    public GameObject linkedObject;

    private Vector2 sizeOfPalette;
    private CircleCollider2D paletteCollider;

    private static CircleColorPicker instance = null;
    public static CircleColorPicker Instance
    {
        get
        {
            if (null == instance) instance = FindObjectOfType<CircleColorPicker>();
            return instance;
        }
    }

    private void Awake()
    {
        if (null == instance) instance = this;
    }

    void Start()
    {
        this.gameObject.SetActive(false);

        paletteCollider = circlePalette.GetComponent<CircleCollider2D>();

        sizeOfPalette = new Vector2(
            circlePalette.GetComponent<RectTransform>().rect.width, 
            circlePalette.GetComponent<RectTransform>().rect.height);
    }

    public void mousePointerDown()
    {
        selectColor();
    }

    public void mouseDrag()
    {
        selectColor();
    }

    private Color getColor()
    {
        Vector2 circlePalettePosition = circlePalette.transform.position;
        Vector2 pickerPosition = picker.transform.position;

        Vector2 position = pickerPosition - circlePalettePosition + sizeOfPalette * 0.5f;
        Vector2 normalized = new Vector2(
            (position.x / (circlePalette.GetComponent<RectTransform>().rect.width)),
            (position.y / (circlePalette.GetComponent<RectTransform>().rect.height)));

        Texture2D texture = circlePalette.mainTexture as Texture2D;
        Color circularSelectedColor = texture.GetPixelBilinear(normalized.x, normalized.y);

        return circularSelectedColor;
    }

    private void selectColor()
    {
        Vector3 offset = Input.mousePosition - transform.position;
        Vector3 diff = Vector3.ClampMagnitude(offset, paletteCollider.radius);

        picker.transform.position = transform.position + diff;

        selectedColor = getColor();

        linkedObject.GetComponent<MeshRenderer>().materials[0].color = selectedColor;
    }
}

 

DoubleClickTest.cs

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

public class DoubleClickTest : MonoBehaviour
{
    float interval = 0.25f;
    float doubleClickedTime = -1.0f;
    bool pickerOnOff = false;

    private void OnMouseUp()
    {
        if((Time.time - doubleClickedTime) < interval)
        {
            doubleClickedTime = -1.0f;

            if (CircleColorPicker.Instance.gameObject.activeSelf == false)
            {
                pickerOnOff = true;
                CircleColorPicker.Instance.gameObject.SetActive(true);

                CircleColorPicker.Instance.linkedObject = this.gameObject;
            }
            else
            {
                /* 현재 연결된 오브젝트가 아닌 경우는 끌 수 없음 */
                if (CircleColorPicker.Instance.linkedObject.name != this.gameObject.name) return;

                pickerOnOff = false;
                CircleColorPicker.Instance.gameObject.SetActive(false);
                CircleColorPicker.Instance.linkedObject = null;
            }
        }
        else
        {
            doubleClickedTime = Time.time;
        }
    }

    private void Update()
    {
        if(pickerOnOff)
        {
            CircleColorPicker.Instance.gameObject.transform.position
                = Camera.main.WorldToScreenPoint(transform.position + Vector3.up * 2);
        }     
    }
}

 

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

반응형

댓글