Unity의 타겟 표시기
이번 튜토리얼에서는 Unity에 타겟 인디케이터를 만드는 방법을 보여드리겠습니다. Collider의 경계 상자를 사용하여 모서리를 결정합니다.
그럼 시작해보자!
1 단계
- 새 스크립트를 만들고 이름을 SC_TargetIndicator로 지정한 다음 그 안에 아래 코드를 붙여넣습니다.
SC_TargetIndicator.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SC_TargetIndicator : MonoBehaviour
{
public bool allowMultipleTargets = false;
public Texture topLeftBorder;
public Texture bottomLeftBorder;
public Texture topRightBorder;
public Texture bottomRightBorder;
List<Collider> targets = new List<Collider>();
Camera targetCamera;
// Start is called before the first frame update
void Start()
{
targetCamera = GetComponent<Camera>();
}
// Update is called once per frame
void Update()
{
if (Input.GetMouseButtonUp(0))
{
Collider selectedCollider = GetTargetFromMouseClick();
if (selectedCollider)
{
if (targets.Contains(selectedCollider))
{
targets.Remove(selectedCollider);
return;
}
if (!allowMultipleTargets)
{
targets.Clear();
}
targets.Add(selectedCollider);
}
}
}
Collider GetTargetFromMouseClick()
{
RaycastHit hitInfo = new RaycastHit();
Ray ray = targetCamera.ScreenPointToRay(Input.mousePosition);
bool hit = Physics.Raycast(ray, out hitInfo);
if (hit)
{
return hitInfo.collider;
}
return null;
}
void OnGUI()
{
for(int i = 0; i < targets.Count; i++)
{
if (targets[i])
{
Vector3 boundPoint1 = targets[i].bounds.min;
Vector3 boundPoint2 = targets[i].bounds.max;
Vector3 boundPoint3 = new Vector3(boundPoint1.x, boundPoint1.y, boundPoint2.z);
Vector3 boundPoint4 = new Vector3(boundPoint1.x, boundPoint2.y, boundPoint1.z);
Vector3 boundPoint5 = new Vector3(boundPoint2.x, boundPoint1.y, boundPoint1.z);
Vector3 boundPoint6 = new Vector3(boundPoint1.x, boundPoint2.y, boundPoint2.z);
Vector3 boundPoint7 = new Vector3(boundPoint2.x, boundPoint1.y, boundPoint2.z);
Vector3 boundPoint8 = new Vector3(boundPoint2.x, boundPoint2.y, boundPoint1.z);
Vector2[] screenPoints = new Vector2[8];
screenPoints[0] = targetCamera.WorldToScreenPoint(boundPoint1);
screenPoints[1] = targetCamera.WorldToScreenPoint(boundPoint2);
screenPoints[2] = targetCamera.WorldToScreenPoint(boundPoint3);
screenPoints[3] = targetCamera.WorldToScreenPoint(boundPoint4);
screenPoints[4] = targetCamera.WorldToScreenPoint(boundPoint5);
screenPoints[5] = targetCamera.WorldToScreenPoint(boundPoint6);
screenPoints[6] = targetCamera.WorldToScreenPoint(boundPoint7);
screenPoints[7] = targetCamera.WorldToScreenPoint(boundPoint8);
Vector2 topLeftPosition = Vector2.zero;
Vector2 topRightPosition = Vector2.zero;
Vector2 bottomLeftPosition = Vector2.zero;
Vector2 bottomRightPosition = Vector2.zero;
for (int a = 0; a < screenPoints.Length; a++)
{
//Top Left
if(topLeftPosition.x == 0 || topLeftPosition.x > screenPoints[a].x)
{
topLeftPosition.x = screenPoints[a].x;
}
if (topLeftPosition.y == 0 || topLeftPosition.y > Screen.height - screenPoints[a].y)
{
topLeftPosition.y = Screen.height - screenPoints[a].y;
}
//Top Right
if (topRightPosition.x == 0 || topRightPosition.x < screenPoints[a].x)
{
topRightPosition.x = screenPoints[a].x;
}
if (topRightPosition.y == 0 || topRightPosition.y > Screen.height - screenPoints[a].y)
{
topRightPosition.y = Screen.height - screenPoints[a].y;
}
//Bottom Left
if (bottomLeftPosition.x == 0 || bottomLeftPosition.x > screenPoints[a].x)
{
bottomLeftPosition.x = screenPoints[a].x;
}
if (bottomLeftPosition.y == 0 || bottomLeftPosition.y < Screen.height - screenPoints[a].y)
{
bottomLeftPosition.y = Screen.height - screenPoints[a].y;
}
//Bottom Right
if (bottomRightPosition.x == 0 || bottomRightPosition.x < screenPoints[a].x)
{
bottomRightPosition.x = screenPoints[a].x;
}
if (bottomRightPosition.y == 0 || bottomRightPosition.y < Screen.height - screenPoints[a].y)
{
bottomRightPosition.y = Screen.height - screenPoints[a].y;
}
}
GUI.DrawTexture(new Rect(topLeftPosition.x - 16, topLeftPosition.y - 16, 16, 16), topLeftBorder);
GUI.DrawTexture(new Rect(topRightPosition.x, topRightPosition.y - 16, 16, 16), topRightBorder);
GUI.DrawTexture(new Rect(bottomLeftPosition.x - 16, bottomLeftPosition.y, 16, 16), bottomLeftBorder);
GUI.DrawTexture(new Rect(bottomRightPosition.x, bottomRightPosition.y, 16, 16), bottomRightBorder);
}
}
}
}
2 단계
- SC_TargetIndicator 스크립트를 MainCamera에 연결
- 아래의 이미지를 테두리 변수에 할당합니다(가져온 후 텍스처 유형을 'Editor GUI and Legacy GUI'으로 변경해야 합니다)':
두 개의 큐브를 만들어 카메라 앞에 배치한 다음 Play를 눌러 테스트하세요.
큐브를 클릭하여 대상을 할당합니다.