You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 15:34:58