Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 两个不同的向量3,零,但没有父向量?_C#_Unity3d - Fatal编程技术网

C# 两个不同的向量3,零,但没有父向量?

C# 两个不同的向量3,零,但没有父向量?,c#,unity3d,C#,Unity3d,更新 我发现网格对象的网格中心不在0,0,0。那有什么用吗 我有以下问题。我从柏林噪声生成一个地形,效果很好。然而,当我尝试实例化它上面的任何对象时,一些对象在地形区域内生成,而另一些则完全在外部生成。当我重置对象的变换时,它会按预期传送到0,0,0,但当我重置另一个在运行时未实例化的对象时,0,0,0位于完全不同的位置!我没有为这些对象设置父对象,也没有为其他对象设置父对象。下面是我生成对象的代码: private void AddRocks(Terrain terrain, int coun

更新

我发现网格对象的网格中心不在0,0,0。那有什么用吗

我有以下问题。我从柏林噪声生成一个地形,效果很好。然而,当我尝试实例化它上面的任何对象时,一些对象在地形区域内生成,而另一些则完全在外部生成。当我重置对象的变换时,它会按预期传送到0,0,0,但当我重置另一个在运行时未实例化的对象时,0,0,0位于完全不同的位置!我没有为这些对象设置父对象,也没有为其他对象设置父对象。下面是我生成对象的代码:

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);