diff --git a/Assets/GameMain/Scripts/Entity/EntityLogic/CombatSelectInputService.cs b/Assets/GameMain/Scripts/Entity/EntityLogic/CombatSelectInputService.cs index 47c4fc6..25a9245 100644 --- a/Assets/GameMain/Scripts/Entity/EntityLogic/CombatSelectInputService.cs +++ b/Assets/GameMain/Scripts/Entity/EntityLogic/CombatSelectInputService.cs @@ -20,7 +20,7 @@ namespace GeometryTD.Entity { userData = null; if (tilemap == null || !TryGetPointerWorldPosition(tilemap, mapTransform, out Vector3 worldPosition, - out Vector2 contentPosition)) + out Vector2 screenPosition)) { return false; } @@ -28,25 +28,25 @@ namespace GeometryTD.Entity Vector3Int clickedCell = tilemap.WorldToCell(worldPosition); CombatSelectClickObjectType clickObjectType = CombatSelectClickObjectType.None; int towerEntityId = 0; - Vector2 resolvedContentPosition = contentPosition; + Vector2 resolvedScreenPosition = screenPosition; if (towerEntityIdByFoundationCell != null && towerEntityIdByFoundationCell.TryGetValue(clickedCell, out int occupiedTowerEntityId)) { clickObjectType = CombatSelectClickObjectType.Tower; towerEntityId = occupiedTowerEntityId; - resolvedContentPosition = BuildContentPositionFromCell(tilemap, clickedCell, contentPosition); + resolvedScreenPosition = BuildScreenPositionFromCell(tilemap, clickedCell, screenPosition); } else if (isFoundationCell != null && isFoundationCell(clickedCell)) { clickObjectType = CombatSelectClickObjectType.Foundation; - resolvedContentPosition = BuildContentPositionFromCell(tilemap, clickedCell, contentPosition); + resolvedScreenPosition = BuildScreenPositionFromCell(tilemap, clickedCell, screenPosition); } userData = new CombatSelectFormUserData { ClickObjectType = clickObjectType, - ContentPosition = resolvedContentPosition, + ScreenPosition = resolvedScreenPosition, WorldPosition = worldPosition, CellPosition = clickedCell, TowerEntityId = towerEntityId, @@ -59,10 +59,10 @@ namespace GeometryTD.Entity private static bool TryGetPointerWorldPosition(Tilemap tilemap, Transform mapTransform, out Vector3 worldPosition, - out Vector2 contentPosition) + out Vector2 screenPosition) { worldPosition = Vector3.zero; - contentPosition = Vector2.zero; + screenPosition = Vector2.zero; Camera mainCamera = GameEntry.Scene != null ? GameEntry.Scene.MainCamera : Camera.main; if (mainCamera == null) @@ -84,38 +84,37 @@ namespace GeometryTD.Entity } worldPosition = ray.GetPoint(enterDistance); - contentPosition = BuildContentPosition(Input.mousePosition); - contentPosition = new Vector2((int)contentPosition.x, (int)contentPosition.y); - contentPosition = new Vector2(contentPosition.x + 0.5f, contentPosition.y + 0.5f); + screenPosition = BuildScreenPosition(Input.mousePosition); return true; } - private static Vector2 BuildContentPosition(Vector3 pointerScreenPosition) + private static Vector2 BuildScreenPosition(Vector3 pointerScreenPosition) { - return new Vector2( - pointerScreenPosition.x - Screen.width * 0.5f, - pointerScreenPosition.y - Screen.height * 0.5f); + return new Vector2(pointerScreenPosition.x, pointerScreenPosition.y); } - private static Vector2 BuildContentPositionFromCell(Tilemap tilemap, Vector3Int cellPosition, - Vector2 fallbackContentPosition) + private static Vector2 BuildScreenPositionFromCell(Tilemap tilemap, Vector3Int cellPosition, + Vector2 fallbackScreenPosition) { if (tilemap == null) { - return fallbackContentPosition; + return fallbackScreenPosition; } Camera mainCamera = GameEntry.Scene != null ? GameEntry.Scene.MainCamera : Camera.main; if (mainCamera == null) { - return fallbackContentPosition; + return fallbackScreenPosition; } Vector3 cellCenterWorld = tilemap.GetCellCenterWorld(cellPosition); Vector3 cellScreenPosition = mainCamera.WorldToScreenPoint(cellCenterWorld); - Vector2 contentPosition = BuildContentPosition(cellScreenPosition); - contentPosition = new Vector2((int)contentPosition.x, (int)contentPosition.y); - return new Vector2(contentPosition.x + 0.5f, contentPosition.y + 0.5f); + if (cellScreenPosition.z < 0f) + { + return fallbackScreenPosition; + } + + return BuildScreenPosition(cellScreenPosition); } } } diff --git a/Assets/GameMain/Scripts/UI/Combat/Context/CombatSelectFormContext.cs b/Assets/GameMain/Scripts/UI/Combat/Context/CombatSelectFormContext.cs index 4282895..800945f 100644 --- a/Assets/GameMain/Scripts/UI/Combat/Context/CombatSelectFormContext.cs +++ b/Assets/GameMain/Scripts/UI/Combat/Context/CombatSelectFormContext.cs @@ -5,7 +5,7 @@ namespace GeometryTD.UI public class CombatSelectFormContext : UIContext { public bool IsVisible; - public Vector2 ContentPosition; + public Vector2 ScreenPosition; public bool ShowBuildArea; public bool ShowFuncArea; public TowerSelectItemContext[] BuildItems; diff --git a/Assets/GameMain/Scripts/UI/Combat/Controller/CombatSelectFormController.cs b/Assets/GameMain/Scripts/UI/Combat/Controller/CombatSelectFormController.cs index 7707db3..1ac91cb 100644 --- a/Assets/GameMain/Scripts/UI/Combat/Controller/CombatSelectFormController.cs +++ b/Assets/GameMain/Scripts/UI/Combat/Controller/CombatSelectFormController.cs @@ -99,13 +99,13 @@ namespace GeometryTD.UI { case CombatSelectClickObjectType.Foundation: _useCase.SetUpgradeVisible(true); - _useCase.ShowForFoundation(userData.ContentPosition); + _useCase.ShowForFoundation(userData.ScreenPosition); break; case CombatSelectClickObjectType.Tower: _useCase.SetUpgradePrice(userData.UpgradeCost); _useCase.SetUpgradeVisible(!userData.IsTowerAtMaxLevel); _useCase.SetDestroyGain(userData.DestroyGain); - _useCase.ShowForTower(userData.ContentPosition); + _useCase.ShowForTower(userData.ScreenPosition); break; default: _useCase.Hide(); @@ -127,7 +127,7 @@ namespace GeometryTD.UI _useCase = combatSelectFormUseCase; } - public int? ShowForFoundation(Vector2 contentPosition) + public int? ShowForFoundation(Vector2 screenPosition) { if (_useCase == null) { @@ -136,11 +136,11 @@ namespace GeometryTD.UI } _useCase.SetUpgradeVisible(true); - _useCase.ShowForFoundation(contentPosition); + _useCase.ShowForFoundation(screenPosition); return OpenUI(_useCase.TryRefresh()); } - public int? ShowForTower(Vector2 contentPosition, int upgradeCost, int destroyGain) + public int? ShowForTower(Vector2 screenPosition, int upgradeCost, int destroyGain) { if (_useCase == null) { @@ -151,7 +151,7 @@ namespace GeometryTD.UI _useCase.SetUpgradePrice(upgradeCost); _useCase.SetUpgradeVisible(true); _useCase.SetDestroyGain(destroyGain); - _useCase.ShowForTower(contentPosition); + _useCase.ShowForTower(screenPosition); return OpenUI(_useCase.TryRefresh()); } @@ -190,7 +190,7 @@ namespace GeometryTD.UI return new CombatSelectFormContext { IsVisible = rawData.IsVisible, - ContentPosition = rawData.ContentPosition, + ScreenPosition = rawData.ScreenPosition, ShowBuildArea = rawData.IsVisible && rawData.DisplayMode == CombatSelectDisplayMode.Build, ShowFuncArea = rawData.IsVisible && rawData.DisplayMode == CombatSelectDisplayMode.Func, BuildItems = BuildItemContexts(rawData.BuildItems), @@ -290,4 +290,4 @@ namespace GeometryTD.UI RefreshFromUseCase(); } } -} \ No newline at end of file +} diff --git a/Assets/GameMain/Scripts/UI/Combat/RawData/CombatSelectFormRawData.cs b/Assets/GameMain/Scripts/UI/Combat/RawData/CombatSelectFormRawData.cs index 32a5621..587b9e3 100644 --- a/Assets/GameMain/Scripts/UI/Combat/RawData/CombatSelectFormRawData.cs +++ b/Assets/GameMain/Scripts/UI/Combat/RawData/CombatSelectFormRawData.cs @@ -5,7 +5,7 @@ namespace GeometryTD.UI public class CombatSelectFormRawData { public bool IsVisible; - public Vector2 ContentPosition; + public Vector2 ScreenPosition; public CombatSelectDisplayMode DisplayMode; public TowerSelectItemRawData[] BuildItems; public TowerSelectItemRawData UpgradeItem; diff --git a/Assets/GameMain/Scripts/UI/Combat/RawData/CombatSelectFormUserData.cs b/Assets/GameMain/Scripts/UI/Combat/RawData/CombatSelectFormUserData.cs index a9c0b9a..6dfc15d 100644 --- a/Assets/GameMain/Scripts/UI/Combat/RawData/CombatSelectFormUserData.cs +++ b/Assets/GameMain/Scripts/UI/Combat/RawData/CombatSelectFormUserData.cs @@ -5,7 +5,7 @@ namespace GeometryTD.UI public class CombatSelectFormUserData { public CombatSelectClickObjectType ClickObjectType; - public Vector2 ContentPosition; + public Vector2 ScreenPosition; public Vector3 WorldPosition; public Vector3Int CellPosition; public int TowerEntityId; diff --git a/Assets/GameMain/Scripts/UI/Combat/UseCase/CombatSelectFormUseCase.cs b/Assets/GameMain/Scripts/UI/Combat/UseCase/CombatSelectFormUseCase.cs index 26e8c20..445b073 100644 --- a/Assets/GameMain/Scripts/UI/Combat/UseCase/CombatSelectFormUseCase.cs +++ b/Assets/GameMain/Scripts/UI/Combat/UseCase/CombatSelectFormUseCase.cs @@ -14,7 +14,7 @@ namespace GeometryTD.UI private Func _coinProvider; private bool _isVisible; private CombatSelectDisplayMode _displayMode = CombatSelectDisplayMode.Hidden; - private Vector2 _contentPosition; + private Vector2 _screenPosition; public CombatSelectFormUseCase() { @@ -174,16 +174,16 @@ namespace GeometryTD.UI _destroyOption.IsGain = true; } - public void ShowForFoundation(Vector2 contentPosition) + public void ShowForFoundation(Vector2 screenPosition) { - _contentPosition = contentPosition; + _screenPosition = screenPosition; _displayMode = CombatSelectDisplayMode.Build; _isVisible = true; } - public void ShowForTower(Vector2 contentPosition) + public void ShowForTower(Vector2 screenPosition) { - _contentPosition = contentPosition; + _screenPosition = screenPosition; _displayMode = CombatSelectDisplayMode.Func; _isVisible = true; } @@ -239,7 +239,7 @@ namespace GeometryTD.UI return new CombatSelectFormRawData { IsVisible = _isVisible, - ContentPosition = _contentPosition, + ScreenPosition = _screenPosition, DisplayMode = _displayMode, BuildItems = buildItems, UpgradeItem = BuildOptionRawData(_upgradeOption, currentCoin), diff --git a/Assets/GameMain/Scripts/UI/Combat/View/CombatSelectForm.cs b/Assets/GameMain/Scripts/UI/Combat/View/CombatSelectForm.cs index a76fe59..a1bb5e3 100644 --- a/Assets/GameMain/Scripts/UI/Combat/View/CombatSelectForm.cs +++ b/Assets/GameMain/Scripts/UI/Combat/View/CombatSelectForm.cs @@ -33,7 +33,7 @@ namespace GeometryTD.UI return; } - _content.anchoredPosition = context.ContentPosition; + _content.anchoredPosition = ResolveContentAnchoredPosition(context.ScreenPosition); if (_buildArea != null) { @@ -107,5 +107,35 @@ namespace GeometryTD.UI Transform contentTransform = transform.Find("Content"); _content = contentTransform as RectTransform; } + + private Vector2 ResolveContentAnchoredPosition(Vector2 screenPosition) + { + if (_content == null) + { + return Vector2.zero; + } + + RectTransform parentRect = _content.parent as RectTransform; + if (parentRect == null) + { + return screenPosition; + } + + Canvas canvas = _content.GetComponentInParent(); + Canvas rootCanvas = canvas != null ? canvas.rootCanvas : null; + Camera uiCamera = null; + if (rootCanvas != null && rootCanvas.renderMode != RenderMode.ScreenSpaceOverlay) + { + uiCamera = rootCanvas.worldCamera != null ? rootCanvas.worldCamera : Camera.main; + } + + if (!RectTransformUtility.ScreenPointToLocalPointInRectangle(parentRect, screenPosition, uiCamera, + out Vector2 localPoint)) + { + return Vector2.zero; + } + + return localPoint; + } } } diff --git a/Assets/GameMain/UI/UIItems/TowerSelectItem.prefab b/Assets/GameMain/UI/UIItems/TowerSelectItem.prefab index b0dbe32..ee40fc3 100644 --- a/Assets/GameMain/UI/UIItems/TowerSelectItem.prefab +++ b/Assets/GameMain/UI/UIItems/TowerSelectItem.prefab @@ -1,5 +1,80 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: +--- !u!1 &3060068991883162593 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8925646583573969405} + - component: {fileID: 188918238517848746} + - component: {fileID: 1983669471491993411} + m_Layer: 5 + m_Name: Icon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8925646583573969405 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3060068991883162593} + 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: 274828358581623048} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -20, y: -20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &188918238517848746 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3060068991883162593} + m_CullTransparentMesh: 1 +--- !u!114 &1983669471491993411 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3060068991883162593} + 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: 21300144, guid: 29c9cded5e558164aaf8c9bf08aa1510, 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 &6361423396692704141 GameObject: m_ObjectHideFlags: 0 @@ -105,6 +180,7 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: - {fileID: 28444767019028035} + - {fileID: 8925646583573969405} - {fileID: 2412538576477069160} - {fileID: 8201350274026178469} m_Father: {fileID: 0} @@ -126,7 +202,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 4da5ef45ee18db44ebe3c015dddb61d6, type: 3} m_Name: m_EditorClassIdentifier: - _icon: {fileID: 5411719625189444569} + _icon: {fileID: 1983669471491993411} _price: {fileID: 6134693184638222351} _button: {fileID: 8644563062325311724} _towerIconArea: {fileID: 7379728654387442000} @@ -254,18 +330,6 @@ RectTransform: type: 3} m_PrefabInstance: {fileID: 1106531443240827291} m_PrefabAsset: {fileID: 0} ---- !u!114 &5411719625189444569 stripped -MonoBehaviour: - m_CorrespondingSourceObject: {fileID: 4918346613506060866, guid: ab6ee7e8b2a678544af490543d99f665, - type: 3} - m_PrefabInstance: {fileID: 1106531443240827291} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: --- !u!114 &7379728654387442000 stripped MonoBehaviour: m_CorrespondingSourceObject: {fileID: 7579875247493712075, guid: ab6ee7e8b2a678544af490543d99f665,