/* 脚本功能:动态小地图
* 脚本说明:
* 1.需要拍照地图的左下角世界坐标以及右上角世界坐标 给到BL_Pos和TR_Pos
* 调用初始化方法 InitPos(Vector3 pos_BL, Vector3 pos_TR)
* 2.设置目标点调用SetTarget() 关闭目标点CloseTarget()
*/
using UnityEngine;
using System.Collections;
public class SmallMap02 : MonoBehaviour, ISmallMap
{
#region 数据信息
/// <summary> 角色 </summary>
public Transform role;
/// <summary> 角色图标 </summary>
private GameObject roleIcon;
/// <summary> 目标点位置 </summary>
private Vector3 targetPos;
/// <summary> 目标点图标 </summary>
private GameObject targetIcon;
/// <summary> 拍照地图的左下角坐标 </summary>
private Vector3 BL_Pos;
/// <summary> 拍照地图的右上角坐标 </summary>
private Vector3 TR_Pos;
/// <summary> 地图图片宽度 </summary>
private float width;
/// <summary> 地图图片高度 </summary>
private float hight;
/// <summary> 背景图片 </summary>
private GameObject back;
/// <summary> 背景左下角坐标 </summary>
private Vector3 back_BL;
/// <summary> 背景右上角坐标 </summary>
private Vector3 back_TR;
/// <summary> 地图左下角坐标 </summary>
private Vector3 map_BL;
/// <summary> 地图右上角坐标 </summary>
private Vector3 map_TR;
/// <summary> 是否设置了地图的坐标点 </summary>
private bool isSetPos = false;
/// <summary> 图片路径 </summary>
public string imagePath= string.Empty;
/// <summary> 图片 </summary>
private UITexture mapTexture;
#endregion
#region Start&&Update
void Start()
{
//初始化角色图标和目标点图标
mapTexture = GetComponent<UITexture>();
width = transform.GetComponent<UITexture>().GetComponent<UIWidget>().localSize.x;
hight = transform.GetComponent<UITexture>().GetComponent<UIWidget>().localSize.y;
roleIcon = this.transform.parent.FindChild("RoleIcon").gameObject;
targetIcon = this.transform.parent.FindChild("TargetIcon").gameObject;
back = transform.parent.FindChild("Back").gameObject;
back_BL = new Vector3(back.transform.position.x - back.GetComponent<UISprite>().width / 2,
back.transform.position.y - back.GetComponent<UISprite>().height / 2, 0);
back_TR = new Vector3(back.transform.position.x + back.GetComponent<UISprite>().width / 2,
back.transform.position.y + back.GetComponent<UISprite>().height / 2, 0);
map_BL = new Vector3(transform.position.x - width / 2, transform.position.y - hight / 2, 0);
map_TR = new Vector3(transform.position.x + width / 2, transform.position.y + hight / 2, 0);
}
void Update()
{
if (role != null && roleIcon != null && isSetPos)
MapMove();
if (isSetTarget && isSetPos)
SetTargetInMap(targetPos);
}
#endregion
#region 地图目标点位置 设置及取消
bool isSetTarget = false;
/// <summary> 设置目标点图标到地图上 </summary>
private void SetTargetInMap(Vector3 pos)
{
if (targetIcon != null)
{
targetIcon.SetActive(true);
targetIcon.transform.localPosition = WorldToMapPos(pos);
PosLimit();
}
}
/// <summary> 取消地图上目标点 </summary>
private void SetTargetInMapFalse()
{
targetIcon.SetActive(false);
}
#endregion
#region 世界坐标转换地图坐标
/// <summary>
/// 世界左边转成小地图上位置
/// </summary>
/// <param name="pos">需要转换的物体坐标</param>
/// <returns>图标出现的位置坐标</returns>
private Vector3 WorldToMapPos(Vector3 pos)
{
//距左侧百分比
float percentX = 0;
//距上侧百分比
float percentZ = 0;
percentX = (pos.x - BL_Pos.x) / (TR_Pos.x - BL_Pos.x);
percentZ = (TR_Pos.z - pos.z) / (TR_Pos.z - BL_Pos.z);
var x = width * percentX + transform.localPosition.x - width / 2;
var y = -hight * percentZ + transform.localPosition.y + hight / 2;
return new Vector3(x, y, 0);
}
//目的图标限制在小地图内
private void PosLimit()
{
if (targetIcon.transform.localPosition.x > back_TR.x)
targetIcon.transform.localPosition = new Vector3(back_TR.x, targetIcon.transform.localPosition.y, 0);
if (targetIcon.transform.localPosition.x < back_BL.x)
targetIcon.transform.localPosition = new Vector3(back_BL.x, targetIcon.transform.localPosition.y, 0);
if (targetIcon.transform.localPosition.y > back_TR.y)
targetIcon.transform.localPosition = new Vector3(targetIcon.transform.localPosition.x, back_TR.y, 0);
if (targetIcon.transform.localPosition.y < back_BL.y)
targetIcon.transform.localPosition = new Vector3(targetIcon.transform.localPosition.x, back_BL.y, 0);
}
#endregion
#region 小地图偏移
private void MapMove()
{
var skew = role.position - (BL_Pos + TR_Pos) / 2;
transform.localPosition = new Vector3(skew.x / (TR_Pos.x - BL_Pos.x) * (map_BL.x - map_TR.x),
skew.z / (TR_Pos.z - BL_Pos.z) * (map_BL.y - map_TR.y), 0) + roleIcon.transform.position;
}
#endregion
#region 接口实现,外部调用
/// <summary>
/// 开启目标点位置
/// </summary>
public void SetTarget(Vector3 pos)
{
targetPos = pos;
isSetTarget = true;
}
/// <summary>
/// 关闭目标点位置
/// </summary>
public void CloseTarget()
{
isSetTarget = false;
SetTargetInMapFalse();
}
/// <summary>
/// 初始化两点坐标
/// </summary>
/// <param name="pos_BL">左下角坐标</param>
/// <param name="pos_TR">右上角坐标</param>
public void InitPos(string path, Vector3 pos_BL, Vector3 pos_TR)
{
BL_Pos = pos_BL;
TR_Pos = pos_TR;
imagePath = path;
isSetPos = true;
StartCoroutine(ReadImage());
}
#endregion
#region 读取地图图片
private IEnumerator ReadImage()
{
WWW www = new WWW("file://" + imagePath);
yield return www;
if (www != null && string.IsNullOrEmpty(www.error))
{
mapTexture.mainTexture = www.texture;
}
}
#endregion
#region 测试
void OnGUI()
{
if (GUI.Button(new Rect(0, 0, 120, 20), "初始化坐标点"))
InitPos("C:\\Users\\Administrator\\Desktop\\test.jpg", new Vector3(-5, 0, -5), new Vector3(5, 0, 5));
if (GUI.Button(new Rect(0, 25, 120, 20), "设置目标点"))
SetTarget(new Vector3(1, 0, 2));
if (GUI.Button(new Rect(0, 50, 120, 20), "取消目标点"))
CloseTarget();
}
#endregion
}
NGUI实现小地图,人物图标不动,地图移动
最新推荐文章于 2023-08-12 11:04:52 发布