unity,transform.lossyScale和localScale的区别
时间: 2024-08-17 19:02:35 浏览: 241
Unity是一个流行的游戏引擎,它支持多种平台的开发。`Transform.lossyScale` 和 `localScale` 都与游戏物体变换(Transform)组件有关,但它们的作用和用途有所不同:
1. **Transform.lossyScale**:
这个属性用于表示物体在导入到Unity时所经历的缩放失真。当导入3D模型文件(如FBX、OBJ等)时,可能会因为精度丢失导致缩放值不是精确的整数比例。`lossyScale`会反映这个非线性的缩放,它是从原始模型数据计算出来的,通常用来作为全局缩放的一个近似值。
2. **localScale**:
`localScale`则是指物体本身的局部缩放,也就是相对于其父物体的位置而言的缩放。它可以独立于场景的其他缩放设置而调整。如果一个物体有一个父物体,它的`localScale`将影响其在场景中的实际大小,不受`Transform.lossyScale`影响。
简单来说,`lossyScale`关注的是整个物体在整个流程中的变形情况,而`localScale`则是在游戏内部用于精细控制单个物体的尺寸。
相关问题
private GameObject obj; float lox;//大小 float posx;//坐标 // Start is called before the first frame update void Start() { obj = GameObject.Find("Cube (3)"); lox = obj.transform.localScale.x;//大小 posx = obj.transform.position.x;//坐标 } void Update() { if (Input.GetKey(KeyCode.Q))//增长 { if (lox < 5f)//10f { lox -= 0.05f; posx += 0.025f; obj.transform.localScale = new Vector3(-lox, obj.transform.localScale.y, obj.transform.localScale.z); obj.transform.position = new Vector3(posx, obj.transform.position.y, obj.transform.position.z); } } if (Input.GetKey(KeyCode.E))//减少 { if (lox > 1f) { lox += 0.05f; posx -= 0.025f; obj.transform.localScale = new Vector3(lox, obj.transform.localScale.y, obj.transform.localScale.z); obj.transform.position = new Vector3(posx, obj.transform.position.y, obj.transform.position.z); } unity 修改代码 按Q Cube向右模型向一个方向生长增加缩放 按E Cube向左向一个方向生长减少缩放
这段代码是用于在Unity中实现一个Cube模型向右或向左生长的功能。按下键盘上的Q键,Cube模型会向右生长并增加缩放;按下键盘上的E键,Cube模型会向左生长并减少缩放。
在Start()函数中,我们首先通过GameObject.Find()函数找到了名为"Cube (3)"的物体,并将其保存为obj。然后,我们分别获取了该物体的大小和坐标,并将它们保存到了lox和posx变量中。
在Update()函数中,我们检测是否按下了Q或E键,如果是,就根据按键的不同,增加或减少Cube模型的大小和位置。我们使用了transform.localScale和transform.position来设置Cube模型的大小和位置,其中transform.localScale表示物体的大小,transform.position表示物体的位置。
需要注意的是,这段代码中的增长和减少都是在固定的速度下进行的,可以根据需要进行调整。
Unity Transform为啥只有localScale 没有Scale
在Unity中,Transform组件有三个属性:position、rotation和scale,分别对应物体在三维空间中的位置、旋转和缩放。
其中,Scale是Transform组件中的一个属性,但是它的实际意义是物体相对于其父物体的局部坐标系的缩放比例,而不是物体的实际大小。
因此,如果你想改变物体的大小,应该使用localScale属性,它表示物体在其局部坐标系下的缩放比例,而不会影响到其父物体或其他物体。
如果你仍然想使用Scale属性来改变物体的大小,可以使用Transform的localScale属性来计算出物体在世界坐标系下的缩放比例,然后再将其赋值给Scale属性,如下所示:
```csharp
Vector3 worldScale = transform.lossyScale;
transform.localScale = new Vector3(desiredSize / worldScale.x, desiredSize / worldScale.y, desiredSize / worldScale.z);
```
上面的代码中,我们首先获取物体在世界坐标系下的缩放比例,然后计算出我们希望物体在世界坐标系下的大小,最后将这个大小赋值给物体的localScale属性,以达到改变物体大小的目的。但是这种方法需要进行计算,也容易出现问题,因此一般情况下还是建议使用localScale属性来改变物体的大小。
阅读全文