Unity等距视角方块建造系统跳块问题技术求助
Unity等距视角方块建造系统跳块问题求助
我是Unity新手,正在开发一款类似Minecraft的等距视角方块建造系统,通过光标放置方块,代码来自网络及YouTube教程。目前遇到的问题是:前几次放置方块正常,但放置若干块后会出现跳块现象——白色高亮块显示的是预期放置位置,但到第3块时会向上跳位。
我的实现思路是通过射线检测判断光标指向:
- 若指向地图平面,则将方块放置在对应网格单元
- 若指向方块,则根据击中的面调整位置,避免将方块放置在已有方块内部,而是放在相邻单元
初期运行正常,但达到一定层数或放置若干块后会出现跳块问题,希望能得到更优雅的实现方案及问题解决帮助。
确定鼠标位置的核心代码(用于方块高亮渲染)
public Vector3 GetSelectedMapPosition() { Vector3 mousePos = Input.mousePosition; mousePos.z = sceneCamera.nearClipPlane; Ray ray = sceneCamera.ScreenPointToRay(mousePos); RaycastHit hit; BlockFace activeHitFace = GetHitFace(); string activeHitTag = GetHitTag(); if (Physics.Raycast(ray, out hit, 100, layerMask) && activeHitTag == "Map Plane") { hit.point = new Vector3(Mathf.RoundToInt(hit.point.x / gridManager.UnityGridSize), Mathf.RoundToInt(hit.point.y / gridManager.UnityGridSize), Mathf.RoundToInt(hit.point.z / gridManager.UnityGridSize)); return lastPosition = hit.point; } else if (Physics.Raycast(ray, out hit, 100, layerMask) && activeHitTag == "Block") { if (activeHitFace == BlockFace.Up) { hit.point = new Vector3(Mathf.RoundToInt(hit.point.x / gridManager.UnityGridSize), (Mathf.RoundToInt(hit.point.y / gridManager.UnityGridSize)) + 1, Mathf.RoundToInt(hit.point.z / gridManager.UnityGridSize)); return lastPosition = hit.point; } else if (activeHitFace == BlockFace.West) { hit.point = new Vector3((Mathf.RoundToInt(hit.point.x / gridManager.UnityGridSize)) - 1, (Mathf.RoundToInt(hit.point.y / gridManager.UnityGridSize)), Mathf.RoundToInt(hit.point.z / gridManager.UnityGridSize)); return lastPosition = hit.point; } if (activeHitFace == BlockFace.South) { hit.point = new Vector3(Mathf.RoundToInt(hit.point.x / gridManager.UnityGridSize), Mathf.RoundToInt(hit.point.y / gridManager.UnityGridSize), (Mathf.RoundToInt(hit.point.z / gridManager.UnityGridSize)) - 1); return lastPosition = hit.point; } else if (activeHitFace == BlockFace.West) { hit.point = new Vector3(Mathf.RoundToInt(hit.point.x / gridManager.UnityGridSize) - 1, (Mathf.RoundToInt(hit.point.y / gridManager.UnityGridSize)), Mathf.RoundToInt(hit.point.z / gridManager.UnityGridSize)); return lastPosition = hit.point; } } return lastPosition; }
建造模式实现代码(由Update()调用)
按下“B”键进入建造模式,此时显示方块高亮,点击鼠标会在高亮位置实例化方块。
void EnterBuildMode() { Vector3 mousePosition = inputManager.GetSelectedMapPosition(); blockHighlight.transform.position = mousePosition; if (Input.GetMouseButtonDown(0)) { Debug.Log(inputManager.GetSelectedMapPosition()); Debug.Log(inputManager.GetHitFace()); Debug.Log(inputManager.GetHitTag()); BuildBlock(); } } void BuildBlock() { Vector3 spawnPosition = inputManager.GetSelectedMapPosition(); Instantiate(block, spawnPosition, Quaternion.identity, Blocks); }
内容的提问来源于stack exchange,提问作者arvzzz_15
相关产品推荐
相关产品推荐

