Chỉ báo mục tiêu trong Unity
Trong hướng dẫn này, tôi sẽ hướng dẫn cách tạo chỉ báo mục tiêu trong Unity. Nó sẽ sử dụng hộp giới hạn của Collider để xác định các góc.
Vì vậy, hãy bắt đầu!
Bước 1
- Tạo một tập lệnh mới, đặt tên là SC_TargetIndicator rồi dán đoạn mã bên dưới vào trong tập lệnh đó:
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);
}
}
}
}
Bước 2
- Đính kèm tập lệnh SC_TargetIndicator vào MainCamera
- Gán image bên dưới cho các biến đường viền (Đảm bảo thay đổi Loại họa tiết của chúng thành 'Editor GUI and Legacy GUI' sau khi nhập)':
Tạo một vài Khối và đặt chúng ở phía trước Camera sau đó nhấn Play để kiểm tra.
Bấm vào các khối để gán mục tiêu.