오브젝트를 선택된 상태로 만들기 : (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:
Unity Pro:
Unity 프리미엄 학습:
'개발 > Unity' 카테고리의 다른 글
유니티 - 드래그로 오브젝트 위, 아래로 움직이기 (Drag Object in Y-Axis) (1) | 2022.04.14 |
---|---|
유니티 - 드래그로 땅 위의 오브젝트 움직이기 (Drag and Move on the Ground) (0) | 2022.04.11 |
유니티 - 슬라이더로 안개 조절하기 (Unity Fog Slider) (1) | 2022.03.27 |
유니티 - Light Rotate로 간단히 낮과 밤 구현하기 (0) | 2022.03.24 |
유니티 - 타임 슬라이더 만들기 (Time Slider) (0) | 2022.03.24 |
댓글