Unity SpriteRenderer API Sprite的大小,宽度,高度 以及bounds.size属性的详解

当spriteRenderer的rendermode设置为sliced时,可以通过SpriteRenderer.size来获取大小

当然,还有一种是可以无视RenderMode,直接访问和获取大小的,就是SpriteRenderer.bounds.size

这个bounds属性里面有好多东西,有center(中心点位置),size , min, max ,extends(具体怎么解释,我也不好说,是一个vector3的量,大概等于|min|+|max|除以2)

 

假如我现在倒入一张512*512的图片。设置它的pixels per unit为100。在transform.localscale =(1,1,1)的时候,那么这个gameobject的renderer.bounds.size属性中,x和y都是5.12。

现在我将transform.localscale =(1,1,1)改为(2,2,2),这个时候renderer.bounds.size中的x和y变成的10.24。

也就是说transform组件会影响renderer。同时初始的sprite设置:pixels per unit也会 影响renderer。

 

这里提一下,这次我制作游戏的过程中出现了父子物体的scale变化问题。(其实一直都有,但是原先没有引起我重视)

只有两层,父物体localscale = (0.5,0.5,0.5)  子物体localscale =(2,2,2),如果我将子物体从父物体拿出来,放到根节点,那么子物体的localscale会变成(1,1,1)。

这个可以这样子来计算,我理解为每一个物体有一个绝对scale。这里简称为absscale。

一个子物体的absscale = 父物体的localscale * 子物体的localscale 。

子物体从父物体移除或移入,其absscale不会改变,但是其localscale会因为上面的公式,在进行父对象变换时,自己的localscale根据父对象的localscale进行改变。

 

这个问题就涉及到instantiate这个方法的使用了。

正常的一个父物体A=(0.5,0.5,0.5)    子物体B(1,1,1)  

如果我是使用instantiate(B,A)  //实例化子物体B,同时指定B的父物体是A。

这时子物体B的localscale仍是(1,1,1),但是我发现B物体的absscale变了,现在是(0.5,0.5,0.5,)

但是我将实例化物体这一过程分成两部

首先Gameobject go = Instantiate(B);

然后go.transform.parent = A;

这样子物体B的localscale会变成(2,2,2) ,  这样子就没有改变他的absscale。

### 设置或获取 UnitySpriteRenderer 组件的尺寸Unity 中,`SpriteRenderer` 的尺寸可以通过 `bounds.size` 属性来获取。此属性返回的是包围盒大小,它反映了精灵的实际渲染区域大小[^1]。 对于设置或调整 `SpriteRenderer` 的尺寸,通常不是直接修改其尺寸,而是通过变换 (`Transform`) 组件中的缩放 (`localScale`) 来间接影响最终呈现出来的大小。下面是一个具体的例子展示如何操作: #### 获取 SpriteRenderer 尺寸 为了获得 `SpriteRenderer` 所关联精灵的真实宽度高度,可以使用如下代码片段: ```csharp float width = GetComponent<SpriteRenderer>().bounds.size.x; float height = GetComponent<SpriteRenderer>().bounds.size.y; ``` 这会给出基于世界坐标系下的宽高值,如果想要得到相对于本地坐标的尺寸,则需考虑物体自身的缩放因子。 #### 调整 SpriteRenderer 显示尺寸 当希望改变一个精灵显示时所占的空间而不实际更改它的纹理资源本身时,应该作用于该 GameObject 上面的 Transform 组件来进行局部缩放处理。例如要让某个 sprite 变得更大一些,可增大 localScale 参数;反之亦然。需要注意的是,在多平台开发过程中,考虑到屏幕分辨率差异等因素的影响,可能还需要额外编写逻辑去动态适应不同的设备环境[^2]。 ```csharp // 假设我们有一个目标分辨率作为参考标准 (比如 750x1334),以及当前运行时的具体分辨率 Vector2 targetResolution = new Vector2(750f, 1334f); Vector2 currentResolution = new Vector2(Screen.width, Screen.height); // 计算两个分辨率之间的比例关系 float scaleX = currentResolution.x / targetResolution.x; float scaleY = currentResolution.y / targetResolution.y; // 应用到游戏对象上使其适配新的分辨率 transform.localScale = new Vector3(scaleX, scaleY, 1f); ``` 上述方法能够帮助开发者实现跨多种分辨率的良好视觉体验,特别是在移动应用领域内尤为重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值