NGUI实现小地图,人物图标不动,地图移动

/* 脚本功能:动态小地图
 * 脚本说明:
 * 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

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值