Unity 3D。子对象不会更改

时间:2015-05-05 14:10:47

标签: c# unity3d unity3d-2dtools

我是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;                                                           
    }
 }

2 个答案:

答案 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)

我在你的代码中发现了一些问题:

  1. 如果标记是空游戏对象而不是您不需要更改其比例。
  2. 如果它不是一个空的GameObject,但你不能在游戏中看到比将比例设置为一个非常低的值但大于零。
  3. 如果您使用的是Unity 5或更高版本,我建议您使用SetParent方法为您的标记分配父级,例如marker.transform.SetParent(ground.transform);
  4. 首先为您的标记指定一个父项,然后使用其变换(位置和旋转)进行播放。
  5. 如果您首先更改转换然后为其指定父级,那么统一将会将您的标记放在"分配位置"在世界坐标中,然后在将其分配给父级时,它将计算父级空间w.r.t世界空间坐标中的等效位置,但结果该对象看起来与添加到父级之前看起来相同。

    e.g。如果父级的比例为0.5,0.5,0.5且子级(在使其成为父级的子级之前)的比例为1,1,1。因此,当孩子现在成为父母统一的孩子时,将其比例更新为2,2,2。因此,尺寸会发生变化,但在游戏中看起来却一样。位置和旋转也是如此。