반응형
오브젝트를 더블 클릭하면, 색상을 선택할 수 있도록 구현해보자.
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:
Unity Pro:
Unity 프리미엄 학습:
반응형
'개발 > Unity' 카테고리의 다른 글
유니티 - 타임 슬라이더 만들기 (Time Slider) (0) | 2022.03.24 |
---|---|
유니티 - 자식 오브젝트를 원형으로 배치하기 (Circular Arrangement) (0) | 2022.03.23 |
유니티 색상 변경 에디터 만들기 (Circle Color Picker) (0) | 2022.03.20 |
유니티 C# Dictionary와 delegate를 이용한 함수 포인터 (0) | 2022.03.18 |
유니티 - 변수 변경시 이벤트 발생 (Simple Event Handler) (0) | 2022.03.18 |
댓글