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
相关产品推荐
相关产品推荐

