/// <summary> /// 设置图标的可见性 /// </summary> /// <param name="mapIconStruct">图标对象</param> /// <param name="visiable">是否可见</param> public void SetIconVissable(UIMapIconStruct mapIconStruct, bool visiable) { if (mapIconStruct) { mapIconStruct.gameObject.SetActive(visiable); if (visiable) { if (UseHandle && handleTriggerGameObjectList != null && handleTriggerGameObjectList.Contains(mapIconStruct.gameObject)) { handleTriggerGameObjectList.Remove(mapIconStruct.gameObject); } if (touchIconObj && touchIconObj.Equals(mapIconStruct.gameObject)) { touchIconObj = null; } } else { if (UseHandle) { Vector2 iconPos = mapIconStruct.GetComponent <RectTransform>().position; Vector2 handlePos = mapHandle.GetComponent <RectTransform>().position; if (Vector2.Distance(iconPos, handlePos) < stickOnPixel) { if (!handleTriggerGameObjectList.Contains(mapIconStruct.gameObject)) { handleTriggerGameObjectList.Add(mapIconStruct.gameObject); touchIconObj = null; } } } } } }
/// <summary> /// 获取触碰或点击的图标 /// </summary> /// <returns></returns> public UIMapIconStruct GetTouchOrClickIcon() { if (UseHandle) { if (touchIconObj != null) { return(touchIconObj.GetComponent <UIMapIconStruct>()); } else if (handleTriggerGameObjectList != null && handleTriggerGameObjectList.Count > 0) { UIMapIconStruct uiMapIconStruct = NearIconOfHandle(); if (uiMapIconStruct != null) { touchIconObj = uiMapIconStruct.gameObject; return(uiMapIconStruct); } return(null); } else { return(null); } } else { if (touchIconObj != null) { return(touchIconObj.GetComponent <UIMapIconStruct>()); } return(null); } }
/// <summary> /// 获取图标在场景中位置 /// </summary> /// <param name="uiMapIconStruct">图标对象</param> /// <returns></returns> public Vector2 GetIconPosInTerrain(UIMapIconStruct uiMapIconStruct) { if (uiMapIconStruct) { return(TranslatePosSceneToTerrain(uiMapIconStruct.GetComponent <RectTransform>().position)); } return(new Vector2(-10000, -10000)); }
/// <summary> /// 设置图标的大小 /// </summary> /// <param name="mapIconStruct">图标对象</param> /// <param name="size">像素大小</param> public void SetIconSize(UIMapIconStruct mapIconStruct, Vector2 size) { if (mapIconStruct) { RectTransform mapIconTrans = mapIconStruct.GetComponent <RectTransform>(); mapIconTrans.offsetMin = new Vector2(-size.x, -size.y); mapIconTrans.offsetMax = new Vector2(size.x, size.y); } }
/// <summary> /// 设置图标在地图上的位置 /// </summary> /// <param name="mapIconStruct">图标对象</param> /// <param name="pointAtTerrain">图标在场景中的位置</param> public void SetIconPos(UIMapIconStruct mapIconStruct, Vector2 pointAtTerrain) { if (mapIconStruct) { Vector2 anchor = new Vector2((pointAtTerrain.x - sceneRect.xMin) / sceneRect.width, (pointAtTerrain.y - sceneRect.yMin) / sceneRect.height); RectTransform mapIconTrans = mapIconStruct.GetComponent <RectTransform>(); mapIconTrans.anchorMin = anchor; mapIconTrans.anchorMax = anchor; } }
/// <summary> /// 定位到指定图标 /// </summary> /// <param name="iconStruct"></param> public void MoveToIconStruct(UIMapIconStruct iconStruct) { if (!iconStruct) { return; } RectTransform iconTrans = iconStruct.GetComponent <RectTransform>(); Vector2 anchor = iconTrans.anchorMin; Vector2 terrainPoint = new Vector2(sceneRect.xMin + sceneRect.width * anchor.x, sceneRect.yMin + sceneRect.height * anchor.y); MoveToTerrainPoint(terrainPoint); }
/// <summary> /// 鼠标点击图标时触发 /// </summary> /// <param name="e"></param> private void MapIcon_Click(BaseEventData e) { PointerEventData pe = e as PointerEventData; if (pe != null) { UIMapIconStruct uiMapIconStruct = null; if (pe.pointerCurrentRaycast.gameObject && (uiMapIconStruct = pe.pointerCurrentRaycast.gameObject.GetComponent <UIMapIconStruct>()) != null) { touchIconObj = uiMapIconStruct.gameObject; if (ClickOnMap != null) { ClickOnMap(TranslatePosSceneToTerrain(pe.currentInputModule.input.mousePosition)); } } } }
/// <summary> /// 获取距离手柄最近的图标 /// 只有在使用手柄式才会有效 /// </summary> /// <returns></returns> private UIMapIconStruct NearIconOfHandle() { if (UseHandle && handleTriggerGameObjectList != null && handleTriggerGameObjectList.Count > 0) { Vector2 mapHandleCenter = new Vector2(mapHandle.rectTransform.position.x, mapHandle.rectTransform.position.y); UIMapIconStruct uiMapIconStruct = handleTriggerGameObjectList. Where(temp => temp != null). Select(temp => temp.GetComponent <RectTransform>()). Select(temp => new { trans = temp, pos = new Vector2(temp.position.x, temp.position.y) }). Select(temp => new { trans = temp.trans, dis = Vector2.Distance(mapHandleCenter, temp.pos) }). OrderBy(temp => temp.dis). FirstOrDefault().trans.GetComponent <UIMapIconStruct>(); return(uiMapIconStruct); } else { return(null); } }
/// <summary> /// 移除一个Icon /// </summary> /// <param name="mapIconStruct">图标对象</param> public void RemoveIcon(UIMapIconStruct mapIconStruct) { if (uiImapIconStructList.Contains(mapIconStruct)) { uiImapIconStructList.Remove(mapIconStruct); } if (mapIconStruct) { if (handleTriggerGameObjectList.Contains(mapIconStruct.gameObject)) { handleTriggerGameObjectList.Remove(mapIconStruct.gameObject); } if (touchIconObj && touchIconObj.Equals(mapIconStruct.gameObject)) { touchIconObj = null; } DestroyImmediate(mapIconStruct.gameObject); } }
/// <summary> /// 添加一个Icon /// </summary> /// <param name="iconSprite">图标精灵</param> /// <param name="pointAtTerrain">图标在地图中的位置</param> /// <param name="size">图标大小</param> /// <returns></returns> public UIMapIconStruct AddIcon(Sprite iconSprite, Vector2 size, Vector2 pointAtTerrain) { if (mapImage) { RectTransform mapImageRect = mapImage.rectTransform; GameObject mapIconObj = new GameObject(); mapIconObj.transform.SetParent(mapImageRect); //添加ui组件并设置大小和位置 RectTransform mapIconRect = mapIconObj.AddComponent <RectTransform>(); Vector2 anchor = new Vector2((pointAtTerrain.x - sceneRect.xMin) / sceneRect.width, (pointAtTerrain.y - sceneRect.yMin) / sceneRect.height); mapIconRect.anchorMin = anchor; mapIconRect.anchorMax = anchor; mapIconRect.offsetMin = -size / 2; mapIconRect.offsetMax = size / 2; //添加触发器 CircleCollider2D collider2D = mapIconObj.AddComponent <CircleCollider2D>(); collider2D.radius = size.x > size.y ? (size.x / 2) : (size.y / 2); collider2D.isTrigger = true; //添加图片 Image mapIconImage = mapIconObj.AddComponent <Image>(); mapIconImage.sprite = iconSprite; mapIconImage.color = Color.white; mapIconImage.type = Image.Type.Simple; //添加点击事件 EventTrigger eventTrigger = mapIconObj.AddComponent <EventTrigger>(); eventTrigger.triggers = new List <EventTrigger.Entry>(); EventTrigger.Entry entry = new EventTrigger.Entry(); entry.eventID = EventTriggerType.PointerClick; entry.callback = new EventTrigger.TriggerEvent(); entry.callback.AddListener(MapIcon_Click); eventTrigger.triggers.Add(entry); //添加脚本 UIMapIconStruct uiMapIconStruct = mapIconObj.AddComponent <UIMapIconStruct>(); uiImapIconStructList.Add(uiMapIconStruct); return(uiMapIconStruct); } return(null); }
/* #region 测试代码 * private void Start() * { * InitMap(mapImage.sprite, new Rect(100, 100, 100, 100), 0.2f); * tempStruct = AddIcon(mapImage.sprite, new Vector2(20, 20), new Vector2(130, 130)); * ClickOnMap += UIMap_ClickOnMap; * } * * private void UIMap_ClickOnMap(Vector2 obj) * { * Vector2 terrainPos = obj; * Vector2 scenePos = TranslatePosTerrainToScene(terrainPos); * Debug.Log(terrainPos+" "+ scenePos); * * UIMapIconStruct uiMapIconStruct = GetTouchOrClickIcon(); * if (!uiMapIconStruct) * if (!tempStruct1) * tempStruct1 = AddIcon(mapImage.sprite, new Vector2(20, 20), obj); * else * { * SetIconPos(tempStruct1, obj); * } * } * * UIMapIconStruct tempStruct; * UIMapIconStruct tempStruct1; * private void Update() * { * //缩放 * float add = Input.GetAxis("Mouse ScrollWheel") / 20; * Scale += add; * //移动 * Vector2 moveDelat = Vector2.zero; * if (Input.GetKey(KeyCode.A)) * moveDelat.x -= 10; * if (Input.GetKey(KeyCode.D)) * moveDelat.x += 10; * if (Input.GetKey(KeyCode.W)) * moveDelat.y += 10; * if (Input.GetKey(KeyCode.S)) * moveDelat.y -= 10; * MoveHandle(moveDelat); * //定位 * if (Input.GetKey(KeyCode.Return)) * { * MoveToTerrainPoint(new Vector2(200, 200)); * } * //定位到图标 * if (Input.GetKey(KeyCode.KeypadEnter)) * { * MoveToIconStruct(tempStruct); * } * } #endregion */ /// <summary> /// 用于处理手柄靠近后的吸附效果 /// </summary> private void LateUpdate() { if (UseHandle && handleTriggerGameObjectList != null && handleTriggerGameObjectList.Count > 0) { lastMoveHandleTime += Time.deltaTime; if (lastMoveHandleTime > WaitMoveHandleTimeStickOn && isMoveHandleState) { isMoveHandleState = false; //计算手柄应该移动到的位置 UIMapIconStruct uiMapIconStruct = NearIconOfHandle(); if (uiMapIconStruct != null) { Vector2 iconPos = uiMapIconStruct.GetComponent <RectTransform>().position; Vector2 handlePos = mapHandle.GetComponent <RectTransform>().position; if (Vector2.Distance(iconPos, handlePos) < stickOnPixel) { Vector2 offset = iconPos - handlePos; MoveHandleInner(offset); touchIconObj = uiMapIconStruct.gameObject; } } } } }
/// <summary> /// 重新设置地图 /// </summary> private void ResetMap() { if (iMapState.MapBackSprite == null) { return; } //根据场景初始化地图 uiMapControl.InitMap(iMapState.MapBackSprite, iMapState.MaskMapSprite, iMapState.MapRectAtScene, 0.05f); //重回全地图的图标 //npc与路牌 NPCDataInfo[] npcDataInfos = npcData.GetNPCDataInfos(iGameState.SceneName); foreach (NPCDataInfo npcDataInfo in npcDataInfos) { UIMapIconStruct uiMapIconStruct = uiMapControl.AddIcon(npcDataInfo.NPCSprite, new Vector2(10, 10), new Vector2(npcDataInfo.NPCLocation.x, npcDataInfo.NPCLocation.z)); object[] innerValue = new object[] { npcDataInfo.NPCType != EnumNPCType.Street?EnumBigMapIconCheck.Action : EnumBigMapIconCheck.Street, npcDataInfo }; uiMapIconStruct.value = innerValue; } //任务 //等待接取的任务 TaskMap.RunTimeTaskInfo[] runTimeTaskInfos_Wait = iNowTaskState.GetWaitTask(iGameState.SceneName); foreach (TaskMap.RunTimeTaskInfo runTimeTaskInfo in runTimeTaskInfos_Wait) { NPCDataInfo npcDataInfo = npcData.GetNPCDataInfo(iGameState.SceneName, runTimeTaskInfo.TaskInfoStruct.ReceiveTaskNpcId);//接取任务的NPC if (npcDataInfo == null) { continue; } //需要传入一个金色的叹号 UIMapIconStruct uiMapIconStruct = uiMapControl.AddIcon(null, new Vector2(20, 30), new Vector2(npcDataInfo.NPCLocation.x, npcDataInfo.NPCLocation.z)); object[] innerValue = new object[] { EnumBigMapIconCheck.Task, runTimeTaskInfo, 0//0表示等待接取,1表示正在执行,2表示已经完成 }; uiMapIconStruct.value = innerValue; } //正在执行的任务 TaskMap.RunTimeTaskInfo[] runTimeTaskInfos_Start = iNowTaskState.GetStartTask(iGameState.SceneName); foreach (TaskMap.RunTimeTaskInfo runTimeTaskInfo in runTimeTaskInfos_Start) { Vector2 targetPosition = Vector2.zero; if (runTimeTaskInfo.TaskInfoStruct.DeliveryTaskLocation != null && runTimeTaskInfo.TaskInfoStruct.DeliveryTaskNpcId < 0) { targetPosition = new Vector2(runTimeTaskInfo.TaskInfoStruct.DeliveryTaskLocation.ArrivedCenterPos.x, runTimeTaskInfo.TaskInfoStruct.DeliveryTaskLocation.ArrivedCenterPos.z); } else { NPCDataInfo npcDataInfo = npcData.GetNPCDataInfo(iGameState.SceneName, runTimeTaskInfo.TaskInfoStruct.DeliveryTaskNpcId);//交付任务的NPC if (npcDataInfo != null) { targetPosition = new Vector2(npcDataInfo.NPCLocation.x, npcDataInfo.NPCLocation.z); } } //需要传入一个白色的的问号 UIMapIconStruct uiMapIconStruct = uiMapControl.AddIcon(null, new Vector2(20, 30), targetPosition); object[] innerValue = new object[] { EnumBigMapIconCheck.Task, runTimeTaskInfo, 1//0表示等待接取,1表示正在执行,2表示已经完成 }; uiMapIconStruct.value = innerValue; } //条件达成但是没有交付的任务 TaskMap.RunTimeTaskInfo[] runTimeTaskInfos_End = iNowTaskState.GetStartTask(iGameState.SceneName); foreach (TaskMap.RunTimeTaskInfo runTimeTaskInfo in runTimeTaskInfos_End) { NPCDataInfo npcDataInfo = npcData.GetNPCDataInfo(iGameState.SceneName, runTimeTaskInfo.TaskInfoStruct.DeliveryTaskNpcId);//交付任务的NPC if (npcDataInfo == null) { continue; } //需要传入一个金色的问号 UIMapIconStruct uiMapIconStruct = uiMapControl.AddIcon(null, new Vector2(20, 30), new Vector2(npcDataInfo.NPCLocation.x, npcDataInfo.NPCLocation.z)); object[] innerValue = new object[] { EnumBigMapIconCheck.Task, runTimeTaskInfo, 2//0表示等待接取,1表示正在执行,2表示已经完成 }; uiMapIconStruct.value = innerValue; } //根据玩家位置设置地图中心位置 MoveToCenter(); }
/// <summary> /// 在地图相应的场景坐标点击或按下按钮触发的功能 /// 1点击路牌标记可以进行传送 /// 2点击地图或者任务功能npcboss等标记位置 /// </summary> /// <param name="terrainPos"></param> private void ActionAtTerrain(Vector2 terrainPos) { //清理当前的标记图标 Action ClearFlagIconStruct = () => { if (!flagIconStruct) { return; } try { object[] innerValue = (object[])flagIconStruct.value; EnumBigMapIconCheck enumBigMapIconCheck = (EnumBigMapIconCheck)innerValue[0]; if (enumBigMapIconCheck == EnumBigMapIconCheck.Flag)//如果该标记已经是标记则移除该图标 { uiMapControl.RemoveIcon(flagIconStruct); flagIconStruct = null; } } catch { } }; UIMapIconStruct uiMapIconStruct = uiMapControl.GetTouchOrClickIcon(); if (uiMapIconStruct)//获取不为空则判断类型 { try { object[] innerValue = (object[])uiMapIconStruct.value; EnumBigMapIconCheck enumBigMapIconCheck = (EnumBigMapIconCheck)innerValue[0]; switch (enumBigMapIconCheck) { case EnumBigMapIconCheck.Task: case EnumBigMapIconCheck.Action: case EnumBigMapIconCheck.Boss: //重设图标 ClearFlagIconStruct(); flagIconStruct = uiMapIconStruct; break; case EnumBigMapIconCheck.Flag: //清理图标 ClearFlagIconStruct(); uiMapControl.RemoveIcon(uiMapIconStruct); break; case EnumBigMapIconCheck.Street: //传送 if (canTransport) //如果可以传送 { NPCDataInfo npcDataInfo = (NPCDataInfo)innerValue[1]; iGameState.ChangedScene(npcDataInfo.SceneName, npcDataInfo.NPCLocation + Vector3.one); } break; } } catch { } } else//获取为空则设置标记 { if (flagIconStruct)//如果当前标记不等于空 { ClearFlagIconStruct(); //在该处设置图标 Sprite flagSprit = null; flagIconStruct = uiMapControl.AddIcon(flagSprit, iconSize, terrainPos); flagIconStruct.value = new object[] { EnumBigMapIconCheck.Flag, null }; } } }
/// <summary> /// 重新设置地图 /// </summary> private void ResetMap(Sprite mapBackSprite, Sprite maskMapSprite, Rect mapRectAtScene, string sceneName) { nowSceneName = sceneName; //根据场景初始化地图 uiMapControl.InitMap(mapBackSprite, maskMapSprite, mapRectAtScene); //重绘全地图的图标 uiMapIconStructList = new List <UIMapIconStruct>(); //npc与路牌 NPCDataInfo[] npcDataInfos = npcData.GetNPCDataInfos(sceneName); foreach (NPCDataInfo npcDataInfo in npcDataInfos) { UIMapIconStruct uiMapIconStruct = uiMapControl.AddIcon(npcDataInfo.NPCSprite, new Vector2(30, 30), new Vector2(npcDataInfo.NPCLocation.x, npcDataInfo.NPCLocation.z)); object[] innerValue = new object[] { npcDataInfo.NPCType != EnumNPCType.Street?EnumBigMapIconCheck.Action : EnumBigMapIconCheck.Street, npcDataInfo }; uiMapIconStruct.value = innerValue; uiMapIconStructList.Add(uiMapIconStruct); } //任务 //等待接取的任务 TaskMap.RunTimeTaskInfo[] runTimeTaskInfos_Wait = iNowTaskState.GetWaitTask(sceneName); foreach (TaskMap.RunTimeTaskInfo runTimeTaskInfo in runTimeTaskInfos_Wait) { NPCDataInfo npcDataInfo = npcData.GetNPCDataInfo(sceneName, runTimeTaskInfo.TaskInfoStruct.ReceiveTaskNpcId);//接取任务的NPC if (npcDataInfo == null) { continue; } //需要传入一个金色的叹号 UIMapIconStruct uiMapIconStruct = uiMapControl.AddIcon(null, new Vector2(20, 30), new Vector2(npcDataInfo.NPCLocation.x, npcDataInfo.NPCLocation.z)); object[] innerValue = new object[] { EnumBigMapIconCheck.Task, runTimeTaskInfo, 0//0表示等待接取,1表示正在执行,2表示已经完成 }; uiMapIconStruct.value = innerValue; uiMapIconStructList.Add(uiMapIconStruct); } //正在执行的任务 TaskMap.RunTimeTaskInfo[] runTimeTaskInfos_Start = iNowTaskState.GetStartTask(sceneName); foreach (TaskMap.RunTimeTaskInfo runTimeTaskInfo in runTimeTaskInfos_Start) { Vector2 targetPosition = Vector2.zero; if (runTimeTaskInfo.TaskInfoStruct.DeliveryTaskLocation != null && runTimeTaskInfo.TaskInfoStruct.DeliveryTaskNpcId < 0) { targetPosition = new Vector2(runTimeTaskInfo.TaskInfoStruct.DeliveryTaskLocation.ArrivedCenterPos.x, runTimeTaskInfo.TaskInfoStruct.DeliveryTaskLocation.ArrivedCenterPos.z); } else { NPCDataInfo npcDataInfo = npcData.GetNPCDataInfo(sceneName, runTimeTaskInfo.TaskInfoStruct.DeliveryTaskNpcId);//交付任务的NPC if (npcDataInfo != null) { targetPosition = new Vector2(npcDataInfo.NPCLocation.x, npcDataInfo.NPCLocation.z); } } //需要传入一个白色的的问号 UIMapIconStruct uiMapIconStruct = uiMapControl.AddIcon(null, new Vector2(20, 30), targetPosition); object[] innerValue = new object[] { EnumBigMapIconCheck.Task, runTimeTaskInfo, 1//0表示等待接取,1表示正在执行,2表示已经完成 }; uiMapIconStruct.value = innerValue; uiMapIconStructList.Add(uiMapIconStruct); } //条件达成但是没有交付的任务 TaskMap.RunTimeTaskInfo[] runTimeTaskInfos_End = iNowTaskState.GetStartTask(sceneName); foreach (TaskMap.RunTimeTaskInfo runTimeTaskInfo in runTimeTaskInfos_End) { NPCDataInfo npcDataInfo = npcData.GetNPCDataInfo(sceneName, runTimeTaskInfo.TaskInfoStruct.DeliveryTaskNpcId);//交付任务的NPC if (npcDataInfo == null) { continue; } //需要传入一个金色的问号 UIMapIconStruct uiMapIconStruct = uiMapControl.AddIcon(null, new Vector2(20, 30), new Vector2(npcDataInfo.NPCLocation.x, npcDataInfo.NPCLocation.z)); object[] innerValue = new object[] { EnumBigMapIconCheck.Task, runTimeTaskInfo, 2//0表示等待接取,1表示正在执行,2表示已经完成 }; uiMapIconStruct.value = innerValue; uiMapIconStructList.Add(uiMapIconStruct); } //设置玩家的图标 //1_272 Sprite playerSprite = SpriteManager.GetSrpite("1:1_272"); UIMapIconStruct uiMapIconStruct_Player = uiMapControl.AddIcon(playerSprite, new Vector2(30, 40), new Vector2(iPlayerState.PlayerObj.transform.position.x, iPlayerState.PlayerObj.transform.position.z)); uiMapIconStruct_Player.value = null; uiMapIconStructList.Add(uiMapIconStruct_Player); if (string.Equals(iGameState.SceneName, sceneName))//如果这个场景是玩家所在的场景则设置场景的中心位置为玩家的位置 { //根据玩家位置设置地图中心位置 Vector2 playerLocation = new Vector2(iPlayerState.PlayerObj.transform.position.x, iPlayerState.PlayerObj.transform.position.z); uiMapControl.MoveToTerrainPoint(playerLocation); } else { uiMapControl.MoveToTerrainPoint(mapRectAtScene.center); } }