前言:在开始之前,建议大家先了解一下Unity的原生点击事件以及UGUI的基础知识(旁白:少废话,谢谢)

我们知道,Game窗口左下角坐标为(0,0),右上角为自己设置分辨率的值,比如我分辨率是1920*1080,那么我Game窗口的右上角就是(1920,1080)

然后我们注意到上篇的UI和实体地图都是正方形(这里可以根据需求自由变化,只需要注意比例即可),那么,我们就可以依据比例来反射小地图上的点到实体地图上。

我们先给多边形碰撞体添上点击事件,注意继承接口IPointerDownHandler。

    public void OnPointerDown(PointerEventData eventData){if (!polygonCollider2D.OverlapPoint(eventData.position)){return; }OrPoint.position = eventData.position;Debug.Log("点击了地图,点击的点为"+eventData.position.ToString());Debug.Log("OrPoint的本地坐标为" + OrPoint.localPosition.ToString());
}

比如我点击这个英雄的头像,就会把那个深渊权杖移动到点击位置,说明还是发生在UI(屏幕)层的点击事件,OrPoint.localPosition就是深渊权杖的本地坐标(相当于父物体MapMask位置而言),那么,我们依据等比例换算就能得到物体在实体地图的位置。

完整代码

MapResponse.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;public class MapResponse : MonoBehaviour,IPointerDownHandler
{private PolygonCollider2D polygonCollider2D;private Transform OrPoint;private Vector3 mapSize;private Vector2 miniMapSize;private void Awake(){polygonCollider2D = GetComponent<PolygonCollider2D>();OrPoint = transform.Find("OrPoint");mapSize = new Vector3(200f, 0.01f, 200f);//地图实体大小miniMapSize = new Vector2(GetComponent<RectTransform>().rect.width,GetComponent<RectTransform>().rect.height);//小地图大小}public void OnPointerDown(PointerEventData eventData){if (!polygonCollider2D.OverlapPoint(eventData.position)){return; }OrPoint.position = eventData.position;Debug.Log("点击了地图,点击的点为"+eventData.position.ToString());Debug.Log("OrPoint的本地坐标为" + OrPoint.localPosition.ToString());SetTargetPosition(OrPoint.localPosition);}void SetTargetPosition(Vector2 vector2 ){Vector3 target = new Vector3(vector2.x *mapSize.x/miniMapSize.x,0,vector2.y*mapSize.z/miniMapSize.y);//等比例求点击点在实体地图中的位置Move.Instance.suc = true;Move.Instance.MapMove(target);//传递到Move类进行移动}
}

Move.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Move : MonoBehaviour
{private RaycastHit hit;private Ray ray;public bool suc;private Animator animator;private GameObject Hero;private static Move instance;public static Move Instance{get{return instance;}set { }}private bool startToRun;float t = 0, w = 0;private void Awake(){instance = this;Hero = transform.Find("juggment").gameObject;animator = Hero.GetComponent<Animator>();}void FixedUpdate(){if (Input.GetMouseButtonDown(1)){TargetMove();}CheckPerFrame();}public void TargetMove(){ray = Camera.main.ScreenPointToRay(Input.mousePosition);suc = Physics.Raycast(ray, out hit);if (suc){Debug.Log(hit.transform.gameObject.name + ":" + hit.transform.gameObject.layer);if (t <= 0.01f){startToRun = true;}animator.SetFloat("Blend", 1);//防止在奔跑状态转到默认状态途中发出行走指令,导致Blend的值恒定Hero.transform.localPosition = Vector3.zero;Hero.transform.localRotation = Quaternion.Euler(0, 0, 0);transform.LookAt(hit.point);}}public void MapMove(Vector3 target){if (t <= 0.01f){startToRun = true;}animator.SetFloat("Blend", 1);//防止在奔跑状态转到默认状态途中发出行走指令,导致Blend的值恒定Hero.transform.localPosition = Vector3.zero;Hero.transform.localRotation = Quaternion.Euler(0, 0, 0);transform.LookAt(target);hit.point = target;}private void CheckPerFrame(){if (suc){Debug.DrawLine(transform.position, hit.point);transform.position = Vector3.MoveTowards(transform.position, hit.point, Time.fixedDeltaTime * 16);}if (Vector3.Distance(transform.position, hit.point) <= 0.01f && suc){w = Mathf.Clamp(w -= Time.fixedDeltaTime * 5, -1, 0);//近似到达终点时,开始过渡到默认动画t = Mathf.InverseLerp(0, 1, 1 + w);//求比例animator.SetFloat("Blend", t);if (t <= 0.01f){w = 0;t = 0;suc = false;}}if (startToRun){w = Mathf.Clamp(w += Time.fixedDeltaTime * 10, 0, 1);t = Mathf.InverseLerp(0, 1, w);animator.SetFloat("Blend", t);if (t >= 0.99f){w = 0;t = 1;startToRun = false;}}}}

效果图

Unity小地图坐标映射相关推荐

  1. unity角色移动代码_教你3个步骤实现Unity小地图

    一.前言 小地图功能在很多游戏中都有,特别是RPG游戏,在Unity中如何实现小地图功能呢,我来教你. 二.思路 专门创建一个顶视角的摄像机,然后摄像机有个Target Texture属性,可以将渲染 ...

  2. unity小地图实现----等比例映射实现的几种方式

    本次给大家分享的是unity等比例映射小地图实现的第一种方式-----通过Image进行等比例映射:最终达到的效果就是玩家映射到小地图上的图片这里用PlayerIcon代替,Player的移动带动Pl ...

  3. Unity小地图Minimap制作全面功能介绍篇

    本系列文章将讲述如何制作小地图. 功能如下: 小地图制作和美化       https://blog.csdn.net/alayeshi/article/details/115914212 小地图展示 ...

  4. 自用工具 Unity 小地图

    using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using U ...

  5. Unity小地图与大地图的互相切换

    承接上一篇. 之前的篇章讲的都是关于小地图的功能,其中有一项切换成大地图的没有讲. 本篇讲如何实现大小地图之间的相互切换. 点击下图的按钮进行切换.大地图和小地图都有此按钮.如图: 第一步首先要制作一 ...

  6. Unity小地图映射到Canvas中去,并完成摄像机跟随物体。

    OK!这次的方式是通过Renderer Texture和Material来配合实现摄像机内容映射到Canvas的UI元素中,炒鸡简单. 适用于任何场景. 首先:摄像机映射 新建一个Camera 新建一 ...

  7. Unity——小地图实现的办法

    一.使用摄像机跟随的办法实现 1.先创建一个Canvas画布 2.创建一个Raw Image来存放一会摄像机捕捉的画面,并且调整位置 3.在Scenes(也就是场景文件夹下)下创建一个 Render ...

  8. 边缘融合 边缘计算_可怕的冲击力边缘

    边缘融合 边缘计算 To recap the two previous posts exploring this subject, The 2.5 Ways of Career Development ...

  9. 关于言论自由。_言论自由

    关于言论自由. Al Sparber writes about software piracy, citing the places that allow people to remain anony ...

最新文章

  1. 熬夜翻译完的PureFTPd配置文件
  2. Linux系统安全与应用(二)——安全机制、安全控制、弱口令检测JR、网络扫描NMAP和控制台命令Netstat
  3. 嵌入式Linux LED,键盘,AD驱动程序开发
  4. ide 日志 乱码_IDE日志分析方法pt。 2
  5. Codeforces 374A - Inna and Pink Pony
  6. 机器视觉基础知识详解
  7. (UML)统一建模语言简介(关系详解)
  8. chrome浏览器截长图
  9. powerdesign生成SQL
  10. ENVI_IDL:批量拼接Modis Swath的逐日数据并输出为Geotiff格式
  11. python中import 模块的路径问题
  12. 国家图书馆最新推荐70本书
  13. Protobuf简单使用
  14. 赛孚耐SafeNet宏狗GrandDog微狗MicroDog加密狗复制破解路径
  15. 面试复盘:2020.09.09
  16. Metamask不能访问以太坊账户?隐私模式!
  17. fgets()函数的详解-使用技巧-C语言基础
  18. ffmpeg 结构体分析
  19. PolarDB 阿里云国产化数据库:linux系统下的详细安装步骤手册
  20. 石油远程《机械设计》第三次在线作业

热门文章

  1. 百度域名解析API+python实现百度云DDNS功能绑定动态公网ip
  2. Apifox自定义脚本实现二分法查找正确数值
  3. 2004年度最欠“扁”短信集锦
  4. 发送短信——java
  5. 怀孕女子缺钱拒绝进医院 在街头生下双胞胎女儿
  6. Python可视化-县市按经纬度坐标在地图标记数值
  7. SQL 小练习(简单:基础语句)—合集
  8. Python简单爬取“中国日报”新浪微博的早晚安鼓励话语
  9. 圣诞节的正确打开方式,应该是这个样子丨钛空舱礼物清单
  10. 弘辽科技:抖音平台如何养新号、老号。