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

Unity 2D俯视角道路对象生成后尺寸过小问题修复求助

Unity 2D俯视角道路系统:生成对象尺寸异常修复

问题描述

我正在开发Unity 2D俯视角道路系统,流程如下:

  • 用户点击屏幕,显示道路预览线
  • 预览线跟随鼠标光标实时更新
  • 第二次点击确定终点,将预览线转换为尺寸、位置匹配的GameObject

目前预览功能正常,但生成的GameObject尺寸远小于预期的预览线长度。

原代码

using UnityEngine;

public class RoadBuilder : MonoBehaviour
{
    public GameObject roadPrefab; // 用于生成道路的预制体
    public LineRenderer previewLine; // 临时显示道路预览的LineRenderer

    private Vector2 startingPoint; // 道路起点
    private Vector2 endingPoint; // 道路终点
    private bool isBuildingRoad; // 是否正在绘制道路的标记

    private void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            if (!isBuildingRoad)
            {
                // 开始绘制道路
                isBuildingRoad = true;
                startingPoint = Camera.main.ScreenToWorldPoint(Input.mousePosition);
                previewLine.positionCount = 2;
                previewLine.SetPosition(0, startingPoint);
                previewLine.SetPosition(1, startingPoint);
            }
            else
            {
                // 完成道路绘制
                endingPoint = Camera.main.ScreenToWorldPoint(Input.mousePosition);
                CreateRoad(startingPoint, endingPoint);
                isBuildingRoad = false;
                previewLine.positionCount = 0;
            }
        }
        else if (isBuildingRoad)
        {
            // 更新预览线
            Vector2 currentPoint = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            previewLine.SetPosition(1, currentPoint);
        }
    }

    private void CreateRoad(Vector2 start, Vector2 end)
    {
        // 计算道路位置
        Vector2 roadPosition = start;

        // 计算道路尺寸和旋转角度
        float roadSize = Vector2.Distance(start, end);
        float roadRotation = Mathf.Atan2(end.y - start.y, end.x - start.x) * Mathf.Rad2Deg;

        // 实例化道路对象
        GameObject road = Instantiate(roadPrefab, roadPosition, Quaternion.Euler(0f, 0f, roadRotation));
        road.transform.localScale = new Vector3(roadSize, 1f, 1f);
    }
}

问题原因与修复方案

1. 位置计算错误

原代码将道路位置设为起点,旋转后道路会以起点为轴心偏移,导致视觉上长度不符。应该将道路放在起点和终点的中点,确保旋转后两端对齐起点和终点。

2. 缩放未考虑预制体原始尺寸

如果道路预制体的X轴初始尺寸不是1,直接用距离值缩放会导致实际长度偏差。需要用距离除以预制体原始X长度来计算缩放比例。

3. Z轴深度匹配

2D俯视角下,要确保道路的Z轴值和预览线一致,避免显示层级问题。

修改后的CreateRoad方法

private void CreateRoad(Vector2 start, Vector2 end)
{
    // 计算道路中点位置(确保旋转后两端对齐起点终点)
    Vector2 roadPosition = (start + end) / 2f;
    // 保持Z轴和预览线一致,避免层级问题
    roadPosition = new Vector3(roadPosition.x, roadPosition.y, previewLine.transform.position.z);

    // 计算道路长度
    float roadLength = Vector2.Distance(start, end);
    // 获取预制体原始X轴尺寸,避免缩放偏差
    float originalWidth = roadPrefab.transform.localScale.x;
    // 计算X轴缩放比例
    float scaleX = roadLength / originalWidth;

    // 计算旋转角度
    float roadRotation = Mathf.Atan2(end.y - start.y, end.x - start.x) * Mathf.Rad2Deg;

    // 实例化道路对象
    GameObject road = Instantiate(roadPrefab, roadPosition, Quaternion.Euler(0f, 0f, roadRotation));
    // 应用缩放,保持Y、Z轴尺寸不变
    road.transform.localScale = new Vector3(scaleX, roadPrefab.transform.localScale.y, roadPrefab.transform.localScale.z);
}

额外注意事项

  • 确保道路预制体的锚点/ pivot在中心,否则旋转和缩放会出现偏移。
  • 预览LineRenderer的宽度建议和道路预制体的Y轴尺寸匹配,保证视觉一致性。

内容的提问来源于stack exchange,提问作者Paul Sotena

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 07:38:16