| | |
| | | using System.Collections; |
| | | using System.Collections.Generic; |
| | | using UnityEngine; |
| | | using TableConfig; |
| | | using UnityEngine.UI; |
| | | using System; |
| | | using UnityEngine.EventSystems; |
| | | |
| | | namespace Snxxz.UI |
| | | { |
| | | public class LocalMapFindPath : MonoBehaviour, IPointerClickHandler |
| | | { |
| | | const float NODE_SPACEOUT = 3f; |
| | | |
| | | [SerializeField] float m_StandardSize = 50f; |
| | | [SerializeField] BoundedDrag m_BoundDrag; |
| | | [SerializeField] RectTransform m_LocalMapRect; |
| | | [SerializeField] Image m_MapImage; |
| | | [SerializeField] Transform m_ContainerPathNode; |
| | | [SerializeField] Image m_HeroHead; |
| | | [SerializeField] LocalMapEventPointInstroduce m_EventPointInstroduce; |
| | | [SerializeField] Transform m_SelecteEventPointSign; |
| | | |
| | | LocalMap mapMatrix; |
| | | |
| | | Vector3 heroPrePosition = new Vector3(-999, -8888, 0); |
| | | private List<GameObject> pathNodeBehaviours = new List<GameObject>(); //寻路点池 |
| | | List<LocalMapTag> tagBehaviours = new List<LocalMapTag>(); |
| | | |
| | | MapModel model { get { return ModelCenter.Instance.GetModel<MapModel>(); } } |
| | | |
| | | int mapId = 0; |
| | | public void Init(int _mapId) |
| | | { |
| | | if (_mapId != mapMatrix.mapId) |
| | | { |
| | | PathPointClear(); |
| | | } |
| | | |
| | | var job = PlayerDatas.Instance.baseData.Job; |
| | | m_HeroHead.SetSprite(GeneralConfig.Instance.GetJobHeadPortrait(job, 0)); |
| | | |
| | | mapId = _mapId; |
| | | var tagChinMap = ConfigManager.Instance.GetTemplate<MapConfig>(mapId); |
| | | var mapResConfig = DTCA127_tagMCStartChangeMap.GetMapResourcesConfig(); |
| | | var mapWidth = mapResConfig.MapScale.x; |
| | | var mapHeight = mapResConfig.MapScale.y; |
| | | |
| | | m_StandardSize = mapResConfig.MapShowScale; |
| | | var uiMapWidth = mapWidth * m_StandardSize; |
| | | var uiMapHeight = mapHeight * m_StandardSize; |
| | | m_LocalMapRect.sizeDelta = new Vector2(uiMapWidth, uiMapHeight); |
| | | m_MapImage.SetSprite(mapResConfig.BigMap); |
| | | m_MapImage.SetNativeSize(); |
| | | |
| | | var offsetX = Mathf.Clamp((uiMapWidth - m_BoundDrag.rectTransform.rect.width) * 0.5f, 0, float.MaxValue); |
| | | var offsetY = Mathf.Clamp((uiMapHeight - m_BoundDrag.rectTransform.rect.height) * 0.5f, 0, float.MaxValue); |
| | | |
| | | m_BoundDrag.moveArea = new BoundedDrag.MoveArea(-offsetX, offsetX, offsetY, -offsetY); |
| | | |
| | | mapMatrix = new LocalMap(mapId, mapWidth, mapHeight, uiMapWidth, uiMapHeight); |
| | | |
| | | DrawWayPoints(); |
| | | DrawFunctionNPCs(); |
| | | DrawEventPoints(); |
| | | m_HeroHead.transform.SetAsLastSibling(); |
| | | FoucsEventPoint(model.selectedLocalMapEventPoint); |
| | | |
| | | m_BoundDrag.onBeginDrag.RemoveAllListeners(); |
| | | m_BoundDrag.onBeginDrag.AddListener(OnBeginDrag); |
| | | model.selectLocalMapEventPointEvent += FoucsEventPoint; |
| | | |
| | | var hero = PlayerDatas.Instance.hero; |
| | | if (hero != null) |
| | | { |
| | | if (hero.PathFindStatus == GActor.E_PathFindStatus.Moving) |
| | | { |
| | | OnHeroStartMove(); |
| | | } |
| | | else |
| | | { |
| | | OnHeroStopMove(); |
| | | } |
| | | hero.OnPathFinding += OnHeroStartMove; |
| | | hero.OnPathFindStop += OnHeroStopMove; |
| | | } |
| | | } |
| | | |
| | | public void UnInit() |
| | | { |
| | | var hero = PlayerDatas.Instance.hero; |
| | | if (hero != null) |
| | | { |
| | | hero.OnPathFinding -= OnHeroStartMove; |
| | | hero.OnPathFindStop -= OnHeroStopMove; |
| | | } |
| | | |
| | | model.selectLocalMapEventPointEvent -= FoucsEventPoint; |
| | | m_BoundDrag.onBeginDrag.RemoveAllListeners(); |
| | | |
| | | for (int i = 0; i < tagBehaviours.Count; i++) |
| | | { |
| | | LocalMapTagPool.Recycle(tagBehaviours[i]); |
| | | } |
| | | |
| | | tagBehaviours.Clear(); |
| | | } |
| | | |
| | | void HeroMoveTo(Vector3 _position) |
| | | { |
| | | if (PlayerDatas.Instance.hero == null) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | var position = GetGroundPosition(_position); |
| | | |
| | | PlayerDatas.Instance.hero.Behaviour.StopHandupAI(); |
| | | PlayerDatas.Instance.hero.IdleImmediate(); |
| | | |
| | | PlayerDatas.Instance.hero.MoveToPosition(position); |
| | | } |
| | | |
| | | public void OnPointerClick(PointerEventData eventData) |
| | | { |
| | | #if UNITY_EDITOR |
| | | if (RectTransformUtility.RectangleContainsScreenPoint(m_LocalMapRect, Input.mousePosition, CameraManager.uiCamera)) |
| | | { |
| | | HeroMoveTo(ScreenToWorldPosition(Input.mousePosition)); |
| | | } |
| | | #else |
| | | if (RectTransformUtility.RectangleContainsScreenPoint(m_LocalMapRect, Input.mousePosition,CameraManager.uiCamera)) |
| | | { |
| | | HeroMoveTo( ScreenToWorldPosition(Input.touches[0].position)); |
| | | } |
| | | #endif |
| | | |
| | | if (RectTransformUtility.RectangleContainsScreenPoint((RectTransform)this.transform, Input.mousePosition, CameraManager.uiCamera) |
| | | && !RectTransformUtility.RectangleContainsScreenPoint(m_EventPointInstroduce.containerDetails, Input.mousePosition, CameraManager.uiCamera)) |
| | | { |
| | | model.selectedLocalMapEventPoint = -1; |
| | | } |
| | | |
| | | } |
| | | |
| | | private void LateUpdate() |
| | | { |
| | | UpdateHeroPosition(); |
| | | } |
| | | |
| | | Vector3 ScreenToWorldPosition(Vector3 _sp) |
| | | { |
| | | var originalPoint = CameraManager.uiCamera.WorldToViewportPoint(UIUtility.GetMinWorldPosition(m_LocalMapRect)); |
| | | var spToViewPoint = CameraManager.uiCamera.ScreenToViewportPoint(_sp); |
| | | var delta = spToViewPoint - originalPoint; |
| | | |
| | | var adjustScale = (Screen.width / (float)Screen.height) / (Constants.DESIGN_RESOLUTION.x / Constants.DESIGN_RESOLUTION.y); |
| | | |
| | | var adjustX = delta.x * Constants.DESIGN_RESOLUTION.x * (adjustScale > 1f ? adjustScale : 1f) / m_LocalMapRect.rect.width; |
| | | var adjustY = delta.y * Constants.DESIGN_RESOLUTION.y / (adjustScale < 1f ? adjustScale : 1f) / m_LocalMapRect.rect.height; |
| | | |
| | | var adjustedViewPoint = new Vector2(adjustX, adjustY); |
| | | return new Vector3(mapMatrix.worldMapWidth * adjustedViewPoint.x, 0, mapMatrix.worldMapHeight * adjustedViewPoint.y); |
| | | } |
| | | |
| | | private void GeneratePathNodes(Vector3 targetPos) |
| | | { |
| | | var pathVertexArray = GetWorldPathNodes(targetPos); |
| | | if (pathVertexArray == null) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | PathPointClear(); |
| | | var nodes = NodeLerp(pathVertexArray); |
| | | if (nodes == null) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | InstantiateNodeBehaviours(nodes.Count); |
| | | for (int i = 0; i < nodes.Count; i++) |
| | | { |
| | | var position = mapMatrix.WorldToLocalPosition(nodes[i]); |
| | | pathNodeBehaviours[i].transform.localPosition = position; |
| | | pathNodeBehaviours[i].SetActive(true); |
| | | } |
| | | } |
| | | |
| | | private void DrawEventPoints() |
| | | { |
| | | var eventPoints = model.GetMapEventPoints(mapId); |
| | | for (int i = 0; i < eventPoints.Count; i++) |
| | | { |
| | | var eventPoint = eventPoints[i]; |
| | | DrawEventPoint(eventPoint); |
| | | } |
| | | } |
| | | |
| | | private void DrawEventPoint(int _eventPoint) |
| | | { |
| | | var eventPointConfig = ConfigManager.Instance.GetTemplate<MapEventPointConfig>(_eventPoint); |
| | | if (eventPointConfig.ShowInMipMap == 0) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | var npcType = LocalMapTag.TagType.Boss; |
| | | var npcConfig = ConfigManager.Instance.GetTemplate<NPCConfig>(eventPointConfig.NPCID); |
| | | |
| | | if (eventPointConfig.IsShowInfo == 1) |
| | | { |
| | | if (npcConfig.NPCType == (int)E_NpcType.Func) |
| | | { |
| | | npcType = LocalMapTag.TagType.Function; |
| | | } |
| | | else if (npcConfig.NPCType == (int)E_NpcType.Fight) |
| | | { |
| | | switch ((E_MonsterType)npcConfig.IsBoss) |
| | | { |
| | | case E_MonsterType.Normal: |
| | | npcType = LocalMapTag.TagType.Monster; |
| | | break; |
| | | default: |
| | | npcType = LocalMapTag.TagType.Elite; |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | | npcType = LocalMapTag.TagType.Boss; |
| | | } |
| | | |
| | | var monsterRefreshConfig = ConfigManager.Instance.GetTemplate<MonsterRefreshPointConfig>(npcConfig.NPCID); |
| | | var npcPos = new Vector3(monsterRefreshConfig.Position.x * 0.5f, 0, monsterRefreshConfig.Position.y * 0.5f); |
| | | |
| | | var behaviour = LocalMapTagPool.Require(npcType); |
| | | tagBehaviours.Add(behaviour); |
| | | if (npcType == LocalMapTag.TagType.Boss) |
| | | { |
| | | behaviour.Display(eventPointConfig.NPCID, (TextColType)eventPointConfig.Colour, npcPos); |
| | | } |
| | | else |
| | | { |
| | | behaviour.Display(npcConfig.NPCID, (TextColType)eventPointConfig.Colour); |
| | | } |
| | | |
| | | var pathPointPos = mapMatrix.WorldToLocalPosition(npcPos); |
| | | behaviour.transform.SetParentEx(m_LocalMapRect, pathPointPos, Quaternion.identity, Vector3.one); |
| | | behaviour.gameObject.SetActive(true); |
| | | } |
| | | |
| | | |
| | | private void DrawWayPoints() |
| | | { |
| | | var waypoints = ConfigManager.Instance.GetAllValues<maptransportConfig>(); |
| | | foreach (var waypoint in waypoints) |
| | | { |
| | | if (waypoint.OriginalMapID == PlayerDatas.Instance.baseData.MapID) |
| | | { |
| | | DrawWayPoint(waypoint.TransportID); |
| | | } |
| | | } |
| | | } |
| | | |
| | | private void DrawWayPoint(int _wayPoint) |
| | | { |
| | | var config = ConfigManager.Instance.GetTemplate<maptransportConfig>(_wayPoint.ToString()); |
| | | var behaviour = LocalMapTagPool.Require(LocalMapTag.TagType.WayPoint); |
| | | |
| | | tagBehaviours.Add(behaviour); |
| | | var position = new Vector3(config.OriginalPosX * 0.5f, 0, config.OriginalPosY * 0.5f); |
| | | |
| | | var pathPointPos = mapMatrix.WorldToLocalPosition(position); |
| | | behaviour.transform.SetParentEx(m_LocalMapRect, pathPointPos, Quaternion.identity, Vector3.one); |
| | | behaviour.gameObject.SetActive(true); |
| | | } |
| | | |
| | | private void DrawFunctionNPCs() |
| | | { |
| | | var npcRefreshIds = model.GetMapNPCRefreshIds(mapId); |
| | | if (npcRefreshIds != null) |
| | | { |
| | | for (int i = 0; i < npcRefreshIds.Count; i++) |
| | | { |
| | | DrawFunctionNPC(npcRefreshIds[i]); |
| | | } |
| | | } |
| | | } |
| | | |
| | | private void DrawFunctionNPC(string _refreshId) |
| | | { |
| | | var mapNpcConfig = ConfigManager.Instance.GetTemplate<mapnpcConfig>(_refreshId); |
| | | |
| | | var behaviour = LocalMapTagPool.Require(LocalMapTag.TagType.Function); |
| | | |
| | | tagBehaviours.Add(behaviour); |
| | | var originalPosition = GAStaticDefine.GetClientPostionFromHex(mapNpcConfig.HexPosNPCRefreshAreaChaseArea); |
| | | var position = new Vector3(originalPosition.x, 0, originalPosition.y); |
| | | |
| | | var pathPointPos = mapMatrix.WorldToLocalPosition(position); |
| | | behaviour.transform.SetParentEx(m_LocalMapRect, pathPointPos, Quaternion.identity, Vector3.one); |
| | | behaviour.gameObject.SetActive(true); |
| | | behaviour.Display(mapNpcConfig.NPCID, TextColType.White); |
| | | } |
| | | |
| | | private void UpdateHeroPosition() |
| | | { |
| | | if (mapId == PlayerDatas.Instance.baseData.MapID) |
| | | { |
| | | var heroPos = mapMatrix.WorldToLocalPosition(PlayerDatas.Instance.hero.Pos); |
| | | if (Vector3.Distance(heroPrePosition, heroPos) > 0.01f) |
| | | { |
| | | m_HeroHead.transform.localPosition = heroPos; |
| | | } |
| | | } |
| | | } |
| | | |
| | | private void PathPointClear() |
| | | { |
| | | for (int i = pathNodeBehaviours.Count - 1; i >= 0; i--) |
| | | { |
| | | pathNodeBehaviours[i].SetActive(false); |
| | | } |
| | | } |
| | | |
| | | private Vector3[] GetWorldPathNodes(Vector3 targetPos) |
| | | { |
| | | return PlayerDatas.Instance.hero.GetCorners(); |
| | | } |
| | | |
| | | List<Vector3> NodeLerp(Vector3[] _originalNodes) |
| | | { |
| | | if (_originalNodes == null || _originalNodes.Length < 2) |
| | | { |
| | | return null; |
| | | } |
| | | |
| | | var nodes = new List<Vector3>(); |
| | | nodes.Add(_originalNodes[0]); |
| | | |
| | | var acclength = 0f; |
| | | |
| | | for (int i = 0; i < _originalNodes.Length - 1; i++) |
| | | { |
| | | var node1 = _originalNodes[i]; |
| | | var node2 = _originalNodes[i + 1]; |
| | | var direction = Vector3.Normalize(node2 - node1); |
| | | var distance = Vector3.Distance(node1, node2); |
| | | |
| | | while (acclength < distance) |
| | | { |
| | | nodes.Add(node1 + direction * acclength); |
| | | acclength += NODE_SPACEOUT; |
| | | } |
| | | |
| | | acclength = acclength - distance; |
| | | } |
| | | |
| | | if (Vector3.Distance(nodes[nodes.Count - 1], _originalNodes[_originalNodes.Length - 1]) > NODE_SPACEOUT * 0.5f) |
| | | { |
| | | nodes.Add(_originalNodes[_originalNodes.Length - 1]); |
| | | } |
| | | |
| | | return nodes; |
| | | } |
| | | |
| | | void InstantiateNodeBehaviours(int _count) |
| | | { |
| | | var now = pathNodeBehaviours.Count; |
| | | var dif = _count - now; |
| | | if (dif > 0) |
| | | { |
| | | var prefab = UILoader.LoadPrefab("LocalMap_PathNode"); |
| | | for (int i = 0; i < dif; i++) |
| | | { |
| | | var instance = Instantiate<GameObject>(prefab); |
| | | pathNodeBehaviours.Add(instance); |
| | | instance.transform.SetParentEx(m_ContainerPathNode, Vector3.zero, Quaternion.identity, Vector3.one); |
| | | } |
| | | } |
| | | } |
| | | |
| | | private void FoucsEventPoint(int _eventPoint) |
| | | { |
| | | if (model.selectedLocalMapEventPoint != -1) |
| | | { |
| | | var config = ConfigManager.Instance.GetTemplate<MapEventPointConfig>(_eventPoint); |
| | | var monsterRefreshConfig = ConfigManager.Instance.GetTemplate<MonsterRefreshPointConfig>(config.NPCID); |
| | | var position = new Vector3(monsterRefreshConfig.Position.x * 0.5f, 0, monsterRefreshConfig.Position.y * 0.5f); |
| | | |
| | | var localPosition = mapMatrix.WorldToLocalPosition(position); |
| | | m_BoundDrag.destPosition = -1 * localPosition; |
| | | |
| | | if (localPosition.y >= 0f) |
| | | { |
| | | m_SelecteEventPointSign.localPosition = localPosition.SetY(localPosition.y - 15); |
| | | } |
| | | else |
| | | { |
| | | m_SelecteEventPointSign.localPosition = localPosition.SetY(localPosition.y + 15); |
| | | } |
| | | |
| | | m_EventPointInstroduce.gameObject.SetActive(true); |
| | | m_EventPointInstroduce.Display(model.selectedLocalMapEventPoint, m_SelecteEventPointSign); |
| | | } |
| | | else |
| | | { |
| | | m_EventPointInstroduce.gameObject.SetActive(false); |
| | | } |
| | | } |
| | | |
| | | private Vector3 GetGroundPosition(Vector3 _xzPosition) |
| | | { |
| | | RaycastHit hit; |
| | | var ray = new Ray(_xzPosition.SetY(50f), Vector3.down); |
| | | |
| | | if (Physics.Raycast(ray, out hit, 100f, LayerUtility.WalkbleMask)) |
| | | { |
| | | return hit.point; |
| | | } |
| | | else |
| | | { |
| | | return _xzPosition; |
| | | } |
| | | } |
| | | |
| | | private void OnHeroStartMove() |
| | | { |
| | | if (PlayerDatas.Instance.hero == null) |
| | | { |
| | | return; |
| | | } |
| | | GeneratePathNodes(PlayerDatas.Instance.hero.DestPos); |
| | | } |
| | | |
| | | private void OnHeroStopMove() |
| | | { |
| | | if (PlayerDatas.Instance.hero == null) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | PathPointClear(); |
| | | } |
| | | |
| | | private void OnBeginDrag() |
| | | { |
| | | model.selectedLocalMapEventPoint = -1; |
| | | } |
| | | |
| | | public struct LocalMap |
| | | { |
| | | public int mapId; |
| | | public float worldMapWidth; |
| | | public float worldMapHeight; |
| | | public float localMapWidth; |
| | | public float localMapHeight; |
| | | |
| | | public LocalMap(int mId, float mWidth, float mHeigth, float mSpriteWidth, float mSpriteHeight) |
| | | { |
| | | mapId = mId; |
| | | worldMapWidth = mWidth; |
| | | worldMapHeight = mHeigth; |
| | | localMapWidth = mSpriteWidth; |
| | | localMapHeight = mSpriteHeight; |
| | | } |
| | | |
| | | public Vector3 WorldToLocalPosition(Vector3 _worldPosition) |
| | | { |
| | | var x = ((_worldPosition.x - worldMapWidth * 0.5f) / worldMapWidth) * localMapWidth; |
| | | var y = ((_worldPosition.z - worldMapHeight * 0.5f) / worldMapHeight) * localMapHeight; |
| | | return new Vector3(x, y, 0); |
| | | } |
| | | |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | using System.Collections;
|
| | | using System.Collections.Generic;
|
| | | using UnityEngine;
|
| | | using TableConfig;
|
| | | using UnityEngine.UI;
|
| | | using System;
|
| | | using UnityEngine.EventSystems;
|
| | |
|
| | | namespace Snxxz.UI
|
| | | {
|
| | | public class LocalMapFindPath : MonoBehaviour, IPointerClickHandler
|
| | | {
|
| | | const float NODE_SPACEOUT = 3f;
|
| | |
|
| | | [SerializeField] float m_StandardSize = 50f;
|
| | | [SerializeField] BoundedDrag m_BoundDrag;
|
| | | [SerializeField] RectTransform m_LocalMapRect;
|
| | | [SerializeField] Image m_MapImage;
|
| | | [SerializeField] Transform m_ContainerPathNode;
|
| | | [SerializeField] Image m_HeroHead;
|
| | | [SerializeField] LocalMapEventPointInstroduce m_EventPointInstroduce;
|
| | | [SerializeField] Transform m_SelecteEventPointSign;
|
| | |
|
| | | LocalMap mapMatrix;
|
| | |
|
| | | Vector3 heroPrePosition = new Vector3(-999, -8888, 0);
|
| | | private List<GameObject> pathNodeBehaviours = new List<GameObject>(); //寻路点池
|
| | | List<LocalMapTag> tagBehaviours = new List<LocalMapTag>();
|
| | |
|
| | | MapModel model { get { return ModelCenter.Instance.GetModel<MapModel>(); } }
|
| | |
|
| | | int mapId = 0;
|
| | | public void Init(int _mapId)
|
| | | {
|
| | | if (_mapId != mapMatrix.mapId)
|
| | | {
|
| | | PathPointClear();
|
| | | }
|
| | |
|
| | | var job = PlayerDatas.Instance.baseData.Job;
|
| | | m_HeroHead.SetSprite(GeneralConfig.Instance.GetJobHeadPortrait(job, 0));
|
| | |
|
| | | mapId = _mapId;
|
| | | var tagChinMap = Config.Instance.Get<MapConfig>(mapId);
|
| | | var mapResConfig = DTCA127_tagMCStartChangeMap.GetMapResourcesConfig();
|
| | | var mapWidth = mapResConfig.MapScale.x;
|
| | | var mapHeight = mapResConfig.MapScale.y;
|
| | |
|
| | | m_StandardSize = mapResConfig.MapShowScale;
|
| | | var uiMapWidth = mapWidth * m_StandardSize;
|
| | | var uiMapHeight = mapHeight * m_StandardSize;
|
| | | m_LocalMapRect.sizeDelta = new Vector2(uiMapWidth, uiMapHeight);
|
| | | m_MapImage.SetSprite(mapResConfig.BigMap);
|
| | | m_MapImage.SetNativeSize();
|
| | |
|
| | | var offsetX = Mathf.Clamp((uiMapWidth - m_BoundDrag.rectTransform.rect.width) * 0.5f, 0, float.MaxValue);
|
| | | var offsetY = Mathf.Clamp((uiMapHeight - m_BoundDrag.rectTransform.rect.height) * 0.5f, 0, float.MaxValue);
|
| | |
|
| | | m_BoundDrag.moveArea = new BoundedDrag.MoveArea(-offsetX, offsetX, offsetY, -offsetY);
|
| | |
|
| | | mapMatrix = new LocalMap(mapId, mapWidth, mapHeight, uiMapWidth, uiMapHeight);
|
| | |
|
| | | DrawWayPoints();
|
| | | DrawFunctionNPCs();
|
| | | DrawEventPoints();
|
| | | m_HeroHead.transform.SetAsLastSibling();
|
| | | FoucsEventPoint(model.selectedMapEventPoint);
|
| | |
|
| | | m_BoundDrag.onBeginDrag.RemoveAllListeners();
|
| | | m_BoundDrag.onBeginDrag.AddListener(OnBeginDrag);
|
| | | model.selectMapEventPointEvent += FoucsEventPoint;
|
| | |
|
| | | var hero = PlayerDatas.Instance.hero;
|
| | | if (hero != null)
|
| | | {
|
| | | if (hero.PathFindStatus == GActor.E_PathFindStatus.Moving)
|
| | | {
|
| | | OnHeroStartMove();
|
| | | }
|
| | | else
|
| | | {
|
| | | OnHeroStopMove();
|
| | | }
|
| | | hero.OnPathFinding += OnHeroStartMove;
|
| | | hero.OnPathFindStop += OnHeroStopMove;
|
| | | }
|
| | | }
|
| | |
|
| | | public void UnInit()
|
| | | {
|
| | | var hero = PlayerDatas.Instance.hero;
|
| | | if (hero != null)
|
| | | {
|
| | | hero.OnPathFinding -= OnHeroStartMove;
|
| | | hero.OnPathFindStop -= OnHeroStopMove;
|
| | | }
|
| | |
|
| | | model.selectMapEventPointEvent -= FoucsEventPoint;
|
| | | m_BoundDrag.onBeginDrag.RemoveAllListeners();
|
| | |
|
| | | for (int i = 0; i < tagBehaviours.Count; i++)
|
| | | {
|
| | | LocalMapTagPool.Recycle(tagBehaviours[i]);
|
| | | }
|
| | |
|
| | | tagBehaviours.Clear();
|
| | | }
|
| | |
|
| | | void HeroMoveTo(Vector3 _position)
|
| | | {
|
| | | if (PlayerDatas.Instance.hero == null)
|
| | | {
|
| | | return;
|
| | | }
|
| | |
|
| | | var position = GetGroundPosition(_position);
|
| | |
|
| | | PlayerDatas.Instance.hero.Behaviour.StopHandupAI();
|
| | | PlayerDatas.Instance.hero.IdleImmediate();
|
| | |
|
| | | PlayerDatas.Instance.hero.MoveToPosition(position);
|
| | | }
|
| | |
|
| | | public void OnPointerClick(PointerEventData eventData)
|
| | | {
|
| | | #if UNITY_EDITOR
|
| | | if (RectTransformUtility.RectangleContainsScreenPoint(m_LocalMapRect, Input.mousePosition, CameraManager.uiCamera))
|
| | | {
|
| | | HeroMoveTo(ScreenToWorldPosition(Input.mousePosition));
|
| | | }
|
| | | #else
|
| | | if (RectTransformUtility.RectangleContainsScreenPoint(m_LocalMapRect, Input.mousePosition,CameraManager.uiCamera))
|
| | | {
|
| | | HeroMoveTo( ScreenToWorldPosition(Input.touches[0].position));
|
| | | }
|
| | | #endif
|
| | |
|
| | | if (RectTransformUtility.RectangleContainsScreenPoint((RectTransform)this.transform, Input.mousePosition, CameraManager.uiCamera)
|
| | | && !RectTransformUtility.RectangleContainsScreenPoint(m_EventPointInstroduce.containerDetails, Input.mousePosition, CameraManager.uiCamera))
|
| | | {
|
| | | model.selectedMapEventPoint = -1;
|
| | | }
|
| | |
|
| | | }
|
| | |
|
| | | private void LateUpdate()
|
| | | {
|
| | | UpdateHeroPosition();
|
| | | }
|
| | |
|
| | | Vector3 ScreenToWorldPosition(Vector3 _sp)
|
| | | {
|
| | | var originalPoint = CameraManager.uiCamera.WorldToViewportPoint(UIUtility.GetMinWorldPosition(m_LocalMapRect));
|
| | | var spToViewPoint = CameraManager.uiCamera.ScreenToViewportPoint(_sp);
|
| | | var delta = spToViewPoint - originalPoint;
|
| | |
|
| | | var adjustScale = (Screen.width / (float)Screen.height) / (Constants.DESIGN_RESOLUTION.x / Constants.DESIGN_RESOLUTION.y);
|
| | |
|
| | | var adjustX = delta.x * Constants.DESIGN_RESOLUTION.x * (adjustScale > 1f ? adjustScale : 1f) / m_LocalMapRect.rect.width;
|
| | | var adjustY = delta.y * Constants.DESIGN_RESOLUTION.y / (adjustScale < 1f ? adjustScale : 1f) / m_LocalMapRect.rect.height;
|
| | |
|
| | | var adjustedViewPoint = new Vector2(adjustX, adjustY);
|
| | | return new Vector3(mapMatrix.worldMapWidth * adjustedViewPoint.x, 0, mapMatrix.worldMapHeight * adjustedViewPoint.y);
|
| | | }
|
| | |
|
| | | private void GeneratePathNodes(Vector3 targetPos)
|
| | | {
|
| | | var pathVertexArray = GetWorldPathNodes(targetPos);
|
| | | if (pathVertexArray == null)
|
| | | {
|
| | | return;
|
| | | }
|
| | |
|
| | | PathPointClear();
|
| | | var nodes = NodeLerp(pathVertexArray);
|
| | | if (nodes == null)
|
| | | {
|
| | | return;
|
| | | }
|
| | |
|
| | | InstantiateNodeBehaviours(nodes.Count);
|
| | | for (int i = 0; i < nodes.Count; i++)
|
| | | {
|
| | | var position = mapMatrix.WorldToLocalPosition(nodes[i]);
|
| | | pathNodeBehaviours[i].transform.localPosition = position;
|
| | | pathNodeBehaviours[i].SetActive(true);
|
| | | }
|
| | | }
|
| | |
|
| | | private void DrawEventPoints()
|
| | | {
|
| | | var eventPoints = model.GetMapEventPoints(mapId);
|
| | | for (int i = 0; i < eventPoints.Count; i++)
|
| | | {
|
| | | var eventPoint = eventPoints[i];
|
| | | DrawEventPoint(eventPoint);
|
| | | }
|
| | | }
|
| | |
|
| | | private void DrawEventPoint(int _eventPoint)
|
| | | {
|
| | | var eventPointConfig = Config.Instance.Get<MapEventPointConfig>(_eventPoint);
|
| | | if (eventPointConfig.ShowInMipMap == 0)
|
| | | {
|
| | | return;
|
| | | }
|
| | |
|
| | | var npcType = LocalMapTag.TagType.Boss;
|
| | | var npcConfig = Config.Instance.Get<NPCConfig>(eventPointConfig.NPCID);
|
| | |
|
| | | if (eventPointConfig.IsShowInfo == 1)
|
| | | {
|
| | | if (npcConfig.NPCType == (int)E_NpcType.Func)
|
| | | {
|
| | | npcType = LocalMapTag.TagType.Function;
|
| | | }
|
| | | else if (npcConfig.NPCType == (int)E_NpcType.Fight)
|
| | | {
|
| | | switch ((E_MonsterType)npcConfig.IsBoss)
|
| | | {
|
| | | case E_MonsterType.Normal:
|
| | | npcType = LocalMapTag.TagType.Monster;
|
| | | break;
|
| | | default:
|
| | | npcType = LocalMapTag.TagType.Elite;
|
| | | break;
|
| | | }
|
| | | }
|
| | | }
|
| | | else
|
| | | {
|
| | | npcType = LocalMapTag.TagType.Boss;
|
| | | }
|
| | |
|
| | | var monsterRefreshConfig = Config.Instance.Get<MonsterRefreshPointConfig>(npcConfig.NPCID);
|
| | | var npcPos = new Vector3(monsterRefreshConfig.Position.x * 0.5f, 0, monsterRefreshConfig.Position.y * 0.5f);
|
| | |
|
| | | var behaviour = LocalMapTagPool.Require(npcType);
|
| | | tagBehaviours.Add(behaviour);
|
| | | if (npcType == LocalMapTag.TagType.Boss)
|
| | | {
|
| | | behaviour.Display(eventPointConfig.NPCID, (TextColType)eventPointConfig.Colour, npcPos);
|
| | | }
|
| | | else
|
| | | {
|
| | | behaviour.Display(npcConfig.NPCID, (TextColType)eventPointConfig.Colour);
|
| | | }
|
| | |
|
| | | var pathPointPos = mapMatrix.WorldToLocalPosition(npcPos);
|
| | | behaviour.transform.SetParentEx(m_LocalMapRect, pathPointPos, Quaternion.identity, Vector3.one);
|
| | | behaviour.gameObject.SetActive(true);
|
| | | }
|
| | |
|
| | |
|
| | | private void DrawWayPoints()
|
| | | {
|
| | | var waypoints = Config.Instance.GetAllValues<maptransportConfig>();
|
| | | foreach (var waypoint in waypoints)
|
| | | {
|
| | | if (waypoint.OriginalMapID == PlayerDatas.Instance.baseData.MapID)
|
| | | {
|
| | | DrawWayPoint(waypoint.TransportID);
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | | private void DrawWayPoint(int _wayPoint)
|
| | | {
|
| | | var config = Config.Instance.Get<maptransportConfig>(_wayPoint.ToString());
|
| | | var behaviour = LocalMapTagPool.Require(LocalMapTag.TagType.WayPoint);
|
| | |
|
| | | tagBehaviours.Add(behaviour);
|
| | | var position = new Vector3(config.OriginalPosX * 0.5f, 0, config.OriginalPosY * 0.5f);
|
| | |
|
| | | var pathPointPos = mapMatrix.WorldToLocalPosition(position);
|
| | | behaviour.transform.SetParentEx(m_LocalMapRect, pathPointPos, Quaternion.identity, Vector3.one);
|
| | | behaviour.gameObject.SetActive(true);
|
| | | }
|
| | |
|
| | | private void DrawFunctionNPCs()
|
| | | {
|
| | | var npcRefreshIds = model.GetMapNPCRefreshIds(mapId);
|
| | | if (npcRefreshIds != null)
|
| | | {
|
| | | for (int i = 0; i < npcRefreshIds.Count; i++)
|
| | | {
|
| | | DrawFunctionNPC(npcRefreshIds[i]);
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | | private void DrawFunctionNPC(string _refreshId)
|
| | | {
|
| | | var mapNpcConfig = Config.Instance.Get<mapnpcConfig>(_refreshId);
|
| | |
|
| | | var behaviour = LocalMapTagPool.Require(LocalMapTag.TagType.Function);
|
| | |
|
| | | tagBehaviours.Add(behaviour);
|
| | | var originalPosition = GAStaticDefine.GetClientPostionFromHex(mapNpcConfig.HexPosNPCRefreshAreaChaseArea);
|
| | | var position = new Vector3(originalPosition.x, 0, originalPosition.y);
|
| | |
|
| | | var pathPointPos = mapMatrix.WorldToLocalPosition(position);
|
| | | behaviour.transform.SetParentEx(m_LocalMapRect, pathPointPos, Quaternion.identity, Vector3.one);
|
| | | behaviour.gameObject.SetActive(true);
|
| | | behaviour.Display(mapNpcConfig.NPCID, TextColType.White);
|
| | | }
|
| | |
|
| | | private void UpdateHeroPosition()
|
| | | {
|
| | | if (mapId == PlayerDatas.Instance.baseData.MapID)
|
| | | {
|
| | | var heroPos = mapMatrix.WorldToLocalPosition(PlayerDatas.Instance.hero.Pos);
|
| | | if (Vector3.Distance(heroPrePosition, heroPos) > 0.01f)
|
| | | {
|
| | | m_HeroHead.transform.localPosition = heroPos;
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | | private void PathPointClear()
|
| | | {
|
| | | for (int i = pathNodeBehaviours.Count - 1; i >= 0; i--)
|
| | | {
|
| | | pathNodeBehaviours[i].SetActive(false);
|
| | | }
|
| | | }
|
| | |
|
| | | private Vector3[] GetWorldPathNodes(Vector3 targetPos)
|
| | | {
|
| | | return PlayerDatas.Instance.hero.GetCorners();
|
| | | }
|
| | |
|
| | | List<Vector3> NodeLerp(Vector3[] _originalNodes)
|
| | | {
|
| | | if (_originalNodes == null || _originalNodes.Length < 2)
|
| | | {
|
| | | return null;
|
| | | }
|
| | |
|
| | | var nodes = new List<Vector3>();
|
| | | nodes.Add(_originalNodes[0]);
|
| | |
|
| | | var acclength = 0f;
|
| | |
|
| | | for (int i = 0; i < _originalNodes.Length - 1; i++)
|
| | | {
|
| | | var node1 = _originalNodes[i];
|
| | | var node2 = _originalNodes[i + 1];
|
| | | var direction = Vector3.Normalize(node2 - node1);
|
| | | var distance = Vector3.Distance(node1, node2);
|
| | |
|
| | | while (acclength < distance)
|
| | | {
|
| | | nodes.Add(node1 + direction * acclength);
|
| | | acclength += NODE_SPACEOUT;
|
| | | }
|
| | |
|
| | | acclength = acclength - distance;
|
| | | }
|
| | |
|
| | | if (Vector3.Distance(nodes[nodes.Count - 1], _originalNodes[_originalNodes.Length - 1]) > NODE_SPACEOUT * 0.5f)
|
| | | {
|
| | | nodes.Add(_originalNodes[_originalNodes.Length - 1]);
|
| | | }
|
| | |
|
| | | return nodes;
|
| | | }
|
| | |
|
| | | void InstantiateNodeBehaviours(int _count)
|
| | | {
|
| | | var now = pathNodeBehaviours.Count;
|
| | | var dif = _count - now;
|
| | | if (dif > 0)
|
| | | {
|
| | | var prefab = UILoader.LoadPrefab("LocalMap_PathNode");
|
| | | for (int i = 0; i < dif; i++)
|
| | | {
|
| | | var instance = Instantiate<GameObject>(prefab);
|
| | | pathNodeBehaviours.Add(instance);
|
| | | instance.transform.SetParentEx(m_ContainerPathNode, Vector3.zero, Quaternion.identity, Vector3.one);
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | | private void FoucsEventPoint(int _eventPoint)
|
| | | {
|
| | | if (model.selectedMapEventPoint != -1)
|
| | | {
|
| | | var config = Config.Instance.Get<MapEventPointConfig>(_eventPoint);
|
| | | var monsterRefreshConfig = Config.Instance.Get<MonsterRefreshPointConfig>(config.NPCID);
|
| | | var position = new Vector3(monsterRefreshConfig.Position.x * 0.5f, 0, monsterRefreshConfig.Position.y * 0.5f);
|
| | |
|
| | | var localPosition = mapMatrix.WorldToLocalPosition(position);
|
| | | m_BoundDrag.destPosition = -1 * localPosition;
|
| | |
|
| | | if (localPosition.y >= 0f)
|
| | | {
|
| | | m_SelecteEventPointSign.localPosition = localPosition.SetY(localPosition.y - 15);
|
| | | }
|
| | | else
|
| | | {
|
| | | m_SelecteEventPointSign.localPosition = localPosition.SetY(localPosition.y + 15);
|
| | | }
|
| | |
|
| | | m_EventPointInstroduce.gameObject.SetActive(true);
|
| | | m_EventPointInstroduce.Display(model.selectedMapEventPoint, m_SelecteEventPointSign);
|
| | | }
|
| | | else
|
| | | {
|
| | | m_EventPointInstroduce.gameObject.SetActive(false);
|
| | | }
|
| | | }
|
| | |
|
| | | private Vector3 GetGroundPosition(Vector3 _xzPosition)
|
| | | {
|
| | | RaycastHit hit;
|
| | | var ray = new Ray(_xzPosition.SetY(50f), Vector3.down);
|
| | |
|
| | | if (Physics.Raycast(ray, out hit, 100f, LayerUtility.WalkbleMask))
|
| | | {
|
| | | return hit.point;
|
| | | }
|
| | | else
|
| | | {
|
| | | return _xzPosition;
|
| | | }
|
| | | }
|
| | |
|
| | | private void OnHeroStartMove()
|
| | | {
|
| | | if (PlayerDatas.Instance.hero == null)
|
| | | {
|
| | | return;
|
| | | }
|
| | | GeneratePathNodes(PlayerDatas.Instance.hero.DestPos);
|
| | | }
|
| | |
|
| | | private void OnHeroStopMove()
|
| | | {
|
| | | if (PlayerDatas.Instance.hero == null)
|
| | | {
|
| | | return;
|
| | | }
|
| | |
|
| | | PathPointClear();
|
| | | }
|
| | |
|
| | | private void OnBeginDrag()
|
| | | {
|
| | | model.selectedMapEventPoint = -1;
|
| | | }
|
| | |
|
| | | public struct LocalMap
|
| | | {
|
| | | public int mapId;
|
| | | public float worldMapWidth;
|
| | | public float worldMapHeight;
|
| | | public float localMapWidth;
|
| | | public float localMapHeight;
|
| | |
|
| | | public LocalMap(int mId, float mWidth, float mHeigth, float mSpriteWidth, float mSpriteHeight)
|
| | | {
|
| | | mapId = mId;
|
| | | worldMapWidth = mWidth;
|
| | | worldMapHeight = mHeigth;
|
| | | localMapWidth = mSpriteWidth;
|
| | | localMapHeight = mSpriteHeight;
|
| | | }
|
| | |
|
| | | public Vector3 WorldToLocalPosition(Vector3 _worldPosition)
|
| | | {
|
| | | var x = ((_worldPosition.x - worldMapWidth * 0.5f) / worldMapWidth) * localMapWidth;
|
| | | var y = ((_worldPosition.z - worldMapHeight * 0.5f) / worldMapHeight) * localMapHeight;
|
| | | return new Vector3(x, y, 0);
|
| | | }
|
| | |
|
| | | }
|
| | | }
|
| | |
|
| | | }
|
| | |
|