我是java程序员,我是Unity的新手。我正在写一个放置在Plane对象上的网格。目的是将基于网格的逻辑与Unity 3D坐标系统分开。实际上游戏就网格位置而言,所以我需要一个将游戏坐标系转换为/形成Unity坐标系(世界位置)的代码。由于Plane对象的位置可能会被修改(旋转,移动等),我想"标记"飞机左下角。在这种情况下,我将能够随时将一个坐标系转换为另一个坐标系,因为从游戏的角度来看,游戏中的标记是#34;坐标是0,0(2D)。不幸的是我的代码不起作用。
你能告诉我什么是错的(移动飞机时,"标记"的属性不会改变)?
public class GridManager: MonoBehaviour {
GameObject ground;
GameObject marker;
...
void attachMarker() {
//get substrate (plane)
GameObject ground = getGround();
//create marker
GameObject marker = new GameObject();
//set marker position to left bottom corner
marker.transform.position.x = ground.transform.position.x - ground.transform.localScale.x/2;
marker.transform.position.z = ground.transform.position.z - ground.transform.localScale.z/2;
marker.transform.position.y = 0;
//set marker size
marker.transform.localScale = new Vector3(0,0,0);
//set marker name (will be used for search)
marker.name = "LB_Marker";
//set marker to be child of ground
marker.transform.parent = ground.transform;
//store it
this.marker = marker;
}
}
答案 0 :(得分:0)
我的猜测是getGround()方法返回错误的地方。设置marker.transform.parent = ground.transform应该绝对确保标记位置随地面更新。
另一方面,如果您改为说明,那么它可能更清晰:
//get substrate (plane)
GameObject ground = getGround();
//create marker
GameObject marker = new GameObject();
marker.transform.parent = ground.transform;
marker.transform.localPosition = new Vector3(0.5f, 0.5f, 0);
//set marker name (will be used for search)
marker.name = "LB_Marker";
//store it
this.marker = marker;
这样,你就不会搞乱Unity已经在做的数学了。
答案 1 :(得分:0)
我在你的代码中发现了一些问题:
SetParent
方法为您的标记分配父级,例如marker.transform.SetParent(ground.transform);
如果您首先更改转换然后为其指定父级,那么统一将会将您的标记放在"分配位置"在世界坐标中,然后在将其分配给父级时,它将计算父级空间w.r.t世界空间坐标中的等效位置,但结果该对象看起来与添加到父级之前看起来相同。
e.g。如果父级的比例为0.5,0.5,0.5且子级(在使其成为父级的子级之前)的比例为1,1,1。因此,当孩子现在成为父母统一的孩子时,将其比例更新为2,2,2。因此,尺寸会发生变化,但在游戏中看起来却一样。位置和旋转也是如此。