求助:World Space RectTransform鼠标坐标获取结果不准确问题
这是我的第一篇帖子,若有违反论坛规则之处,请告知我。
相关背景
- 基于一款非世界空间UI背包教程开发
- 正在开发第一人称视角3D游戏
- 尝试制作可在世界空间任意位置访问的网格系统
- 存在多个网格,可通过OnPointerEnter进行检测
问题描述
- 当前脚本仅在相机处于0,0度角度(朝向特定方向)时有效,其他角度下获取的坐标结果不准确
- 推测原因是原脚本并非为3D场景设计,MousePosition坐标值会出现过高/过低的情况,这是导致网格结果不准确的明显原因
相关代码
获取网格坐标的方法
public Vector2Int GetTileGridPosition (Vector2 mousePosition) { var pos = mousePosition; Vector3 output = Vector2.zero; RectTransformUtility.ScreenPointToWorldPointInRectangle(this.rectTransform,pos,cam,out output); positionOnTheGrid.x = (output.x - ((rectTransform.position.x ) )); positionOnTheGrid.y = rectTransform.position.y - output.y; tileGridPosition.x = (int)Mathf.Abs((positionOnTheGrid.x/tileSizeWidth)); tileGridPosition.y = (int)(positionOnTheGrid.y/tileSizeHeight); return tileGridPosition; }
方法调用示例
Debug.Log("This tha" + selectedItemGrid.GetTileGridPosition(Input.mousePosition));
检测网格的脚本示例
private void Awake() { Cursor.visible = true; inventoryController = FindObjectOfType(typeof(InventoryController)) as InventoryController; itemGrid = GetComponent<ItemGrid>(); } public void OnPointerEnter(PointerEventData eventData) { inventoryController.selectedItemGrid = itemGrid; } public void OnPointerExit(PointerEventData eventData) { inventoryController.selectedItemGrid = null; }
调用网格鼠标位置的完整脚本示例(挂载于相机)
{ if (selectedItemGrid == null) { return;} Debug.Log("Testing position " + selectedItemGrid.GetTileGridPosition(Input.mousePosition)); if (Input.GetMouseButtonDown(0)) { Vector2Int tileGridPosition = selectedItemGrid.GetTileGridPosition(Input.mousePosition); if (itemModel == null) { itemModel = selectedItemGrid.PickUpItem( tileGridPosition.x, tileGridPosition.y); } else{ bool complete = selectedItemGrid.PlaceItem(itemModel, tileGridPosition.x, tileGridPosition.y); if (complete) { itemModel = null; } } } }
内容的提问来源于stack exchange,提问作者Charlie Decker
相关产品推荐
相关产品推荐

