我有一个target,它是用于target 位置(5000,0,0)的cube的父级
GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
cube.transform.localPosition = new Vector3(0, 0, 0);
cube.transform.localScale = new Vector3(100, 100, 100);
cube.name = "XXXXX";
cube.transform.parent = target.transform;下面的代码应该在target中添加一个target,即(5000,0,0)中的全局
但是该对象被添加到全局中心本身(0,0,0)中。
我做错了什么?

发布于 2020-11-19 21:22:47
您在这里所做的是实例化一个立方体,在(0,0,0)处。在此之后,您将把多维数据集传递到当前对象。立方体仍然处于(0,0,0)的位置。因此,在本地,您的多维数据集将有一个本地偏移量,以确保多维数据集仍然位于创建它的原点。
但是,在本地或世界空间实例化对象时,您确实可以选择。在这里引用团结文档的话:
“默认情况下,新对象的父对象为null;它不是原始对象的”兄弟“。但是,您仍然可以使用重载的方法设置父对象。如果指定了父对象,并且没有指定位置和旋转,则原始对象的位置和旋转用于克隆对象的本地位置和旋转,如果instantiateInWorldSpace参数为真,则使用原始对象的世界位置和旋转。如果指定了位置和旋转,则将它们用作对象在世界空间中的位置和旋转。”
请注意,CreatePrimitive没有使用本地或世界空间的选项。由你自己来定位原始人。
所以,在你的例子中,你可以这样做:
GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
cube.transform.parent = target.transform;
cube.transform.localPosition = new Vector3(0, 0, 0);
cube.transform.localScale = new Vector3(100, 100, 100);
cube.name = "XXXXX";请注意,您先父级子,然后设置本地位置。您的第一个代码块设置了父代码的本地位置,这个位置就是世界,因为它不是任何东西的子代。但是,如果您首先父对象,那么您将本地位置设置为父对象的位置,现在您将看到您期望的行为。
发布于 2020-11-19 23:56:11
使用Transform.SetParent,将worldPositionStays参数设置为false
GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
cube.transform.localPosition = new Vector3(0, 0, 0);
cube.transform.localScale = new Vector3(100, 100, 100);
cube.name = "XXXXX";
cube.transform.SetParent(target.transform, false);从文件中:
该方法与父属性相同,但它还允许转换保持其局部方向而不是全局方向。这意味着,例如,如果GameObject先前位于其父服务器的旁边,将
worldPositionStays设置为false将以相同的方式将GameObject移动到其新父节点的旁边。worldPositionStays参数的默认值为true。
https://stackoverflow.com/questions/64919918
复制相似问题