Unity中如何获取Sprite的左下角与右上角边界,解决sprite.bounds取值为0问题
核心问题排查
- 你当前使用的
Sprite.bounds是Sprite资源本地空间的包围盒,返回值是相对于Sprite自身锚点的偏移值,默认锚点在中心时min/max确实会以中心点为原点对称,不是你需要的世界空间下的地图实际坐标。应该改用SpriteRenderer.bounds,这个属性已经完成了本地到世界空间的换算,直接返回世界坐标系下Sprite的实际包围盒范围。 - 你代码中的生命周期方法写的是小写的
start(),Unity要求内置生命周期函数首字母必须大写为Start()才会被自动调用,如果你没手动调用过这个方法,里面的边界计算逻辑根本不会执行,也会导致数值错误。
修正后可直接使用的代码
public Transform target; public GameObject theMap; private Vector3 bottomLeftLimit; private Vector3 topRightLimit; // 相机半宽高参数 private float halfHeight; private float halfWidth; // 注意首字母大写 void Start() { target = PlayerController.instance.transform; halfHeight = Camera.main.orthographicSize; halfWidth = halfHeight * Camera.main.aspect; // 获取SpriteRenderer的世界空间包围盒 Bounds mapWorldBounds = theMap.GetComponent<SpriteRenderer>().bounds; // 计算相机可移动的边界,要扣除自身半宽高避免超出地图 bottomLeftLimit = mapWorldBounds.min + new Vector3(halfWidth, halfHeight, 0f); topRightLimit = mapWorldBounds.max + new Vector3(-halfWidth, -halfHeight, 0f); // 传递地图实际边界给玩家控制器 PlayerController.instance.SetBounds(mapWorldBounds.min, mapWorldBounds.max); } void LateUpdate() { transform.position = new Vector3(target.position.x, target.position.y, transform.position.z); // 限制相机在边界内 transform.position = new Vector3( Mathf.Clamp(transform.position.x, bottomLeftLimit.x, topRightLimit.x), Mathf.Clamp(transform.position.y, bottomLeftLimit.y, topRightLimit.y), transform.position.z ); }
额外验证说明
如果修改后还是有偏差,可以检查两个配置项:
- 确认你的地图Sprite的Pivot设置符合预期,如果Pivot不是默认的Center,需要根据实际情况调整边界偏移
- 确认地图GameObject没有缩放、旋转参数异常,SpriteRenderer的bounds会自动计入父物体和自身的变换参数,只要变换参数正常结果就准确
内容的提问来源于stack exchange,提问作者Óscar Macías
相关产品推荐
相关产品推荐

