Đánh dấu trên bản đồ (Map Marker)
C# Code
using UnityEngine;
using UnityEngine.UI;
public class MapMarker : MonoBehaviour
{
public Transform target; // Mục tiêu cần đánh dấu
public Image markerImage; // Image UI của marker
public Camera uiCamera; // Camera của Canvas (nếu dùng Screen Space - Camera)
private RectTransform canvasRect;
void Start()
{
canvasRect = markerImage.canvas.GetComponent<RectTransform>();
}
void LateUpdate()
{
if (target == null || markerImage == null) {
if (markerImage != null) markerImage.enabled = false;
return;
}
Vector3 targetScreenPos = Camera.main.WorldToScreenPoint(target.position);
// Kiểm tra xem mục tiêu có ở phía trước camera không
bool isTargetVisible = targetScreenPos.z > 0 &&
targetScreenPos.x > 0 && targetScreenPos.x < Screen.width &&
targetScreenPos.y > 0 && targetScreenPos.y < Screen.height;
if (isTargetVisible)
{
markerImage.enabled = true;
markerImage.rectTransform.position = targetScreenPos;
}
else // Nếu mục tiêu ở ngoài màn hình
{
markerImage.enabled = true;
// Đảo ngược vị trí nếu mục tiêu ở sau lưng
if (targetScreenPos.z < 0) {
targetScreenPos *= -1;
}
// Tính toán vị trí ghim vào cạnh màn hình
Vector3 center = new Vector3(Screen.width / 2, Screen.height / 2, 0);
targetScreenPos -= center;
float angle = Mathf.Atan2(targetScreenPos.y, targetScreenPos.x);
angle -= 90 * Mathf.Deg2Rad;
float cos = Mathf.Cos(angle);
float sin = -Mathf.Sin(angle);
targetScreenPos = center + new Vector3(sin * 150, cos * 150, 0);
float m = cos / sin;
Vector3 screenBounds = center * 0.9f;
if (cos > 0) {
targetScreenPos = new Vector3(screenBounds.y / m, screenBounds.y, 0);
} else {
targetScreenPos = new Vector3(-screenBounds.y / m, -screenBounds.y, 0);
}
if (targetScreenPos.x > screenBounds.x) {
targetScreenPos = new Vector3(screenBounds.x, screenBounds.x * m, 0);
} else if (targetScreenPos.x < -screenBounds.x) {
targetScreenPos = new Vector3(-screenBounds.x, -screenBounds.x * m, 0);
}
markerImage.rectTransform.position = center + targetScreenPos;
}
}
}Một script để quản lý một điểm đánh dấu trên UI (ví dụ: icon nhiệm vụ), đảm bảo nó luôn chỉ đúng hướng tới mục tiêu trong không gian 3D và ghim vào cạnh màn hình khi mục tiêu ở ngoài tầm nhìn.