C# 两个不同的向量3,零,但没有父向量?
更新 我发现网格对象的网格中心不在0,0,0。那有什么用吗 我有以下问题。我从柏林噪声生成一个地形,效果很好。然而,当我尝试实例化它上面的任何对象时,一些对象在地形区域内生成,而另一些则完全在外部生成。当我重置对象的变换时,它会按预期传送到0,0,0,但当我重置另一个在运行时未实例化的对象时,0,0,0位于完全不同的位置!我没有为这些对象设置父对象,也没有为其他对象设置父对象。下面是我生成对象的代码:C# 两个不同的向量3,零,但没有父向量?,c#,unity3d,C#,Unity3d,更新 我发现网格对象的网格中心不在0,0,0。那有什么用吗 我有以下问题。我从柏林噪声生成一个地形,效果很好。然而,当我尝试实例化它上面的任何对象时,一些对象在地形区域内生成,而另一些则完全在外部生成。当我重置对象的变换时,它会按预期传送到0,0,0,但当我重置另一个在运行时未实例化的对象时,0,0,0位于完全不同的位置!我没有为这些对象设置父对象,也没有为其他对象设置父对象。下面是我生成对象的代码: private void AddRocks(Terrain terrain, int coun
private void AddRocks(Terrain terrain, int count)
{
for (int i = 0; i < count; i++)
{
float randX = Random.Range(0, 256); //256 is my terrain size, the transform is all zeros and 1 for the transform size.
float randZ = Random.Range(0, 256);
GameObject newGameObject = Instantiate(rockPrefab,
new Vector3(randX, terrain.terrainData.GetHeight((int)randX, (int)randZ),
randZ), Quaternion.identity);
}
}
这是生成以下内容后的情况:
这就是岩石的外观:
岩石是由位于主地形上的脚本生成的
我没有为这些对象设置父对象,也没有为其他对象设置父对象
实际上,您确实设置了父项:
GameObject newGameObject = Instantiate(rockPrefab,
new Vector3(randX, terrain.terrainData.GetHeight((int)randX, (int)randZ),
randZ), Quaternion.identity, rockHolder.transform);
最后一个参数rockHolder.transform是实例化对象将附加到的变换,您设置的位置将成为实例化对象相对于父rockHolder的localPosition
但是我在层次视图屏幕截图中没有看到rockHolder对象。似乎您有rockHolder.transform=null,换句话说,它没有初始化。所以,当你调用实例化。。。并将rockHolder.transform作为岩石的所需父对象传递,该值为null,因此Unity生成对象并将其指定给null no parent
无法判断这是否是问题的根源,但无论如何肯定不行。顺便说一句,TerrainData是一个类,因此不需要返回TerrainData;保留更改。对本地terrainData所做的更改将对传入的terrain.terrainData进行更改。该方法可以是void generateTerainTerrainData terrainData{/*…*/},然后您可以只执行generateTerainTerrainTerrainData.terrainData;。检查你的预制件。如果预设中的项不是0,0,0,则它将被该变换偏移location@BugFinder预制件位于0,0,0:/非常感谢,但这并没有解决问题,因为持岩器处于0,0,0进行测试,所以将其放入是没有用的。我已经删除了那行代码。你知道吗?我甚至把预制板换成了另一个,但还是不起作用。啊,我明白了。另一个想法是:几天前,当我将所需位置传递给实例化对象时,实例化对象的位置有些奇怪。。。方法,因此,我决定在之后设置位置。像GameObject go=InstancePrefab;然后go.position=新矢量30,5f,10f;用这种方法,效果很好。好主意,可惜效果不太好。我想我可能已经发现了问题。我正在使用的岩石对象的网格的中心不在0,0,0。但是,如果我使用unity提供的一个简单的3d立方体,它似乎工作得很好。如何将中心更改为0,0,0?在这种情况下,人们使用的一般方法是:创建一个空对象,使网格对象成为空对象的子对象,调整网格对象的局部位置和旋转,使其看起来很好,即位于空对象的中心,旋转正确,然后从这个结构中创建一个预制件。很多从Blender等导入的模型都存在轴点和旋转轴问题,当你无法要求艺术家修复模型时,上述解决方法是解决问题的最简单方法。之后,设置预设对象位置和旋转时,会更改根空对象的属性,而附着到根空对象的网格对象保持在父空对象的中心位置。
terrain.terrainData = GenerateTerrain(terrain.terrainData);
AddRocks(terrain: terrain, count: 20);
GameObject newGameObject = Instantiate(rockPrefab,
new Vector3(randX, terrain.terrainData.GetHeight((int)randX, (int)randZ),
randZ), Quaternion.identity, rockHolder.transform);