1、本代码只适用于小型场景,物体在地形上自由移动,UI地图可以实时显示物体位置。点击UI,可以查找到对应的物体,从而完成一些逻辑。
代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class MinmapDuo : MonoBehaviour
{
public Collider mapCollider;
public Image playerIcon;
public Image mapImage;
public Material chooseMaterial;
public GameItem[] gameItems;
public List<RectTransform> Icons = new List<RectTransform>();
private RectTransform mapRect; // 地图图像的RectTransform
void Start()
{
mapRect = mapImage.rectTransform;
gameItems = FindObjectsOfType<GameItem>();
InitValue();
}
private void InitValue()
{
for (int i = 0; i < gameItems.Length; i++)
{
int a = i;
GameObject iconTemp = Instantiate(playerIcon.gameObject, playerIcon.transform.parent);
Icons.Add(iconTemp.GetComponent<RectTransform>());
iconTemp.name = gameItems[a].name;
iconTemp.transform.Find("Text").GetComponent<Text>().text = gameItems[a].name;
iconTemp.SetActive(true);
iconTemp.GetComponent<Button>().onClick.AddListener(() =>
{
iconTemp.transform.GetChild(0).gameObject.SetActive(true);
gameItems[a].GetComponent<MeshRenderer>().material = chooseMaterial;
});
}
}
// Update is called once per frame
void Update()
{
if (gameItems != null)
{
for (int i = 0; i < gameItems.Length; i++)
{
// 计算玩家在地图上的相对位置
Vector2 playerMapPosition = WorldToMapPosition(gameItems[i].transform.position, mapRect.rect.size);
// 更新UI显示
UpdateUI(Icons[i], playerMapPosition);
}
}
}
// 将世界坐标转换为地图上的相对位置
private Vector2 WorldToMapPosition(Vector3 worldPosition, Vector2 mapSize)
{
// 计算玩家在场景中的相对位置
float xRatio = (worldPosition.x - mapCollider.bounds.min.x) / mapCollider.bounds.size.x;
float yRatio = (worldPosition.z - mapCollider.bounds.min.z) / mapCollider.bounds.size.z;
// 计算在UI中的像素位置
float posX = mapSize.x * xRatio;
float posY = mapSize.y * yRatio;
return new Vector2(posX, posY);
}
// 更新UI显示
private void UpdateUI(RectTransform rect, Vector2 playerMapPosition)
{
// 设置玩家图标在地图上的位置
rect.anchoredPosition = playerMapPosition;
}
}