diff --git a/Assets/PerfectWorld/Scripts/UI/WorldMap.meta b/Assets/PerfectWorld/Scripts/UI/WorldMap.meta new file mode 100644 index 0000000000..d30ed9d9f7 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/UI/WorldMap.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fce16fcbe8e82ec4588c7fba89c7cb64 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/PerfectWorld/Scripts/UI/DlgWorldMap.cs b/Assets/PerfectWorld/Scripts/UI/WorldMap/DlgWorldMap.cs similarity index 74% rename from Assets/PerfectWorld/Scripts/UI/DlgWorldMap.cs rename to Assets/PerfectWorld/Scripts/UI/WorldMap/DlgWorldMap.cs index a20a1728ca..425a0028da 100644 --- a/Assets/PerfectWorld/Scripts/UI/DlgWorldMap.cs +++ b/Assets/PerfectWorld/Scripts/UI/WorldMap/DlgWorldMap.cs @@ -1,3 +1,4 @@ +using BrewMonster.Network; using CSNetwork.Common; using UnityEngine; using UnityEngine.UI; @@ -54,10 +55,14 @@ namespace BrewMonster.UI public override bool Render() { - // UpdateHostPlayerPositionImage(); + UpdateHostPlayerPositionImage(); return base.Render(); } + + Vector3 _hostPlayerPosition; + Quaternion _hostPlayerRotation; + private void UpdateHostPlayerPositionImage() { if (_hostPlayerPositionImage == null) @@ -65,7 +70,7 @@ namespace BrewMonster.UI return; } - if (!TryGetHostPlayerPosition(out Vector3 hostPosition)) + if (!TryGetHostPlayerPosition(out _hostPlayerPosition, out _hostPlayerRotation)) { _hostPlayerPositionImage.enabled = false; return; @@ -81,13 +86,16 @@ namespace BrewMonster.UI _hostPlayerPositionImage.enabled = true; RectTransform hostPlayerRectTransform = _hostPlayerPositionImage.rectTransform; hostPlayerRectTransform.anchoredPosition = new Vector2( - hostPosition.x / _positionFactor, - hostPosition.z / _positionFactor); + _hostPlayerPosition.x / _positionFactor, + _hostPlayerPosition.z / _positionFactor); + + hostPlayerRectTransform.localRotation = Quaternion.Euler(0, 0, -_hostPlayerRotation.eulerAngles.y); } - private bool TryGetHostPlayerPosition(out Vector3 hostPlayerPosition) + private bool TryGetHostPlayerPosition(out Vector3 hostPlayerPosition, out Quaternion hostPlayerRotation) { hostPlayerPosition = Vector3.zero; + hostPlayerRotation = Quaternion.identity; CECHostPlayer hostPlayer = GetHostPlayer(); if (hostPlayer == null || hostPlayer.transform == null) @@ -96,6 +104,7 @@ namespace BrewMonster.UI } hostPlayerPosition = hostPlayer.transform.position; + hostPlayerRotation = hostPlayer.transform.rotation; return true; } @@ -139,6 +148,20 @@ namespace BrewMonster.UI } } + /// + /// When user click on the map texture. + /// We will calculate the world coordinates from the local cursor position. Then move the host player to the world coordinates. + /// + /// + public void OnMapClicked(Vector2 localCursorPosition) + { + var worldCoordinates = localCursorPosition * _positionFactor; + UnityGameSession.c2s_CmdGoto(worldCoordinates.x, 1.0f, worldCoordinates.y); + + // close the map + OnCloseButtonClicked(); + } + private void OnCloseButtonClicked() { CloseDialogue(); diff --git a/Assets/PerfectWorld/Scripts/UI/DlgWorldMap.cs.meta b/Assets/PerfectWorld/Scripts/UI/WorldMap/DlgWorldMap.cs.meta similarity index 100% rename from Assets/PerfectWorld/Scripts/UI/DlgWorldMap.cs.meta rename to Assets/PerfectWorld/Scripts/UI/WorldMap/DlgWorldMap.cs.meta diff --git a/Assets/PerfectWorld/Scripts/UI/WorldMap/WorldMapClickHandler.cs b/Assets/PerfectWorld/Scripts/UI/WorldMap/WorldMapClickHandler.cs new file mode 100644 index 0000000000..e051a5b058 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/UI/WorldMap/WorldMapClickHandler.cs @@ -0,0 +1,59 @@ +using UnityEngine; +using UnityEngine.EventSystems; + +namespace BrewMonster.UI +{ + public class WorldMapClickHandler : MonoBehaviour, IPointerClickHandler + { + [Tooltip("The RectTransform of the Map Image (Usually this GameObject)")] + private RectTransform mapRectTransform; + + [SerializeField] private RectTransform _hostPlayerPositionImage; + + public DlgWorldMap dlgWorldMap; + + // The host player player (0,0,0) is not at the center of the map. It usually has an offset that we have to calculate at Awake + private Vector2 _hostPlayerOffsetPosition; + + private void Awake() + { + // Get the RectTransform of the map + mapRectTransform = GetComponent(); + + CalculateHostPlayerOffsetPosition(); + } + + private void CalculateHostPlayerOffsetPosition() + { + _hostPlayerOffsetPosition = _hostPlayerPositionImage.anchoredPosition; + + // if the max/min of the anchor is 0.5 0.5, then the host player is at the center of the map + // however we have to calculate the offset of the player because it is not at the center of the map + // we can calculate the offset by the max/min of the anchor + var maxAnchor = _hostPlayerPositionImage.anchorMax; + var minAnchor = _hostPlayerPositionImage.anchorMin; + _hostPlayerOffsetPosition = new Vector2((maxAnchor.x - 0.5f) * mapRectTransform.rect.width, (maxAnchor.y - 0.5f) * mapRectTransform.rect.height); + } + + // This triggers automatically when the user clicks/taps on this Image + public void OnPointerClick(PointerEventData eventData) + { + Vector2 localCursorPosition; + + // Convert the screen click position to local anchored position inside the Map + bool isConverted = RectTransformUtility.ScreenPointToLocalPointInRectangle( + mapRectTransform, + eventData.position, + eventData.pressEventCamera, + out localCursorPosition + ); + + if (isConverted) + { + // convert the localCursorPosition to the local position of the host player position image + localCursorPosition -= _hostPlayerOffsetPosition; + dlgWorldMap.OnMapClicked(localCursorPosition); + } + } + } +} diff --git a/Assets/PerfectWorld/Scripts/UI/WorldMap/WorldMapClickHandler.cs.meta b/Assets/PerfectWorld/Scripts/UI/WorldMap/WorldMapClickHandler.cs.meta new file mode 100644 index 0000000000..9199d3ecf5 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/UI/WorldMap/WorldMapClickHandler.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 876ab9894018f2b4cb4a0b04bf534bc5 \ No newline at end of file diff --git a/Assets/Prefabs/UI/DlgWorldMap.prefab b/Assets/Prefabs/UI/DlgWorldMap.prefab index 245de697af..3eafab46a6 100644 --- a/Assets/Prefabs/UI/DlgWorldMap.prefab +++ b/Assets/Prefabs/UI/DlgWorldMap.prefab @@ -1,5 +1,80 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: +--- !u!1 &191621185379502263 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 9142400375056319150} + - component: {fileID: 7949922842883969624} + - component: {fileID: 6790297770241223980} + m_Layer: 0 + m_Name: click_pos + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &9142400375056319150 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 191621185379502263} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 7169122999130120872} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 15, y: 15} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &7949922842883969624 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 191621185379502263} + m_CullTransparentMesh: 1 +--- !u!114 &6790297770241223980 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 191621185379502263} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 --- !u!1 &936441858863998774 GameObject: m_ObjectHideFlags: 0 @@ -35,7 +110,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 403.03613, y: 341.03613} + m_AnchoredPosition: {x: 549, y: 465} m_SizeDelta: {x: 58, y: 58} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &6772256914059310038 @@ -286,7 +361,7 @@ MonoBehaviour: imageProgress: {fileID: 0} mapImage: {fileID: 1174346096914174862} _hostPlayerPositionImage: {fileID: 4036230907032538800} - _positionFactor: 2.5 + _positionFactor: 1.8 _closeButton: {fileID: 8858186809287203567} --- !u!1 &8308536083041954008 GameObject: @@ -363,6 +438,81 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 +--- !u!1 &8900623989843312765 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1510574663178069641} + - component: {fileID: 5533213955690836106} + - component: {fileID: 7414570214724661608} + m_Layer: 0 + m_Name: hostplayerpos_debug + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &1510574663178069641 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8900623989843312765} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 7169122999130120872} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.518} + m_AnchorMax: {x: 0.5, y: 0.518} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 13, y: 16} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &5533213955690836106 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8900623989843312765} + m_CullTransparentMesh: 1 +--- !u!114 &7414570214724661608 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8900623989843312765} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 448046091, guid: 99520ceed6182dd408f2da040fe0c033, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 --- !u!1 &8924313797425690832 GameObject: m_ObjectHideFlags: 0 @@ -374,6 +524,7 @@ GameObject: - component: {fileID: 7169122999130120872} - component: {fileID: 7283747291599937432} - component: {fileID: 1174346096914174862} + - component: {fileID: 4521997594693838426} m_Layer: 0 m_Name: MapTexture m_TagString: Untagged @@ -394,12 +545,14 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: - {fileID: 5906545349664091413} + - {fileID: 1510574663178069641} + - {fileID: 9142400375056319150} m_Father: {fileID: 7323734624486819451} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 1024, y: 1024} + m_AnchoredPosition: {x: -6.0056, y: -6.0056} + m_SizeDelta: {x: 1408.0024, y: 1408.0024} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &7283747291599937432 CanvasRenderer: @@ -439,3 +592,17 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 +--- !u!114 &4521997594693838426 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8924313797425690832} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 876ab9894018f2b4cb4a0b04bf534bc5, type: 3} + m_Name: + m_EditorClassIdentifier: + _hostPlayerPositionImage: {fileID: 5906545349664091413} + dlgWorldMap: {fileID: 135853640611757204}