如何使用脚本从 Unity3d 中的 Terrain 更改树的顶点?
How do I change vertices of a tree from Terrain in Unity3d with script?
我已经通过编辑器在地形上放置了一些树木。我有一个物体正在穿过树木,当这个物体与某棵树发生碰撞时,我想改变它的顶点。
void OnTriggerEnter (Collider col) {
DestroyableTree tree = col.gameObject.GetComponent<DestroyableTree>();
if (tree == null)
return;
Mesh mesh = tree.GetComponent<MeshFilter>().mesh;
Vector3[] vertices = mesh.vertices;
for (var i = 0; i < 100; i++){ // 100 just random number, as well as 50 bellow
vertices[i].x = 50;
vertices[i].z = 50;
}
mesh.vertices = vertices;
mesh.RecalculateBounds ();
mesh.RecalculateNormals ();
tree.GetComponent<MeshFilter> ().mesh = mesh;
//tree.UpdadeMesh(tree, mesh);
//tree.Delete();
}
DestroyableTree 来自 http://rene.klacan.sk/unity3d/games/2014/10/28/destroyable-terrain-trees-in-unity/
未注释时 tree.Delete()
让我确定我正在尝试编辑正确的树。
当我调试时我可以看到网格的顶点已经改变但是为什么它们不会在游戏场景运行时更新?
编辑: 这可能是因为我正在访问胶囊组件的网格而不是树本身。仍然如何访问地形上的树木网格(不一定使用上面显示的代码)?
使用上面 link 中提供的代码并稍作修改就可以了。虽然它没有解决我为什么要首先问这个问题的根本问题:(
这就是我的做法,很简单:在 René Klačan 写的 class DestroyableTree
中,我添加了额外的字段 public TreeInstance treeInstance;
,它在标记语句之后被初始化(在下图)通过添加 tree.treeInstance = treeInstance;
:
之后,我必须在问题开始时在我的代码中使用 tree.treeInstance.GetComponent<MeshFilter>().mesh;
到达树的网格。我希望有人会觉得这很有用。
我已经通过编辑器在地形上放置了一些树木。我有一个物体正在穿过树木,当这个物体与某棵树发生碰撞时,我想改变它的顶点。
void OnTriggerEnter (Collider col) {
DestroyableTree tree = col.gameObject.GetComponent<DestroyableTree>();
if (tree == null)
return;
Mesh mesh = tree.GetComponent<MeshFilter>().mesh;
Vector3[] vertices = mesh.vertices;
for (var i = 0; i < 100; i++){ // 100 just random number, as well as 50 bellow
vertices[i].x = 50;
vertices[i].z = 50;
}
mesh.vertices = vertices;
mesh.RecalculateBounds ();
mesh.RecalculateNormals ();
tree.GetComponent<MeshFilter> ().mesh = mesh;
//tree.UpdadeMesh(tree, mesh);
//tree.Delete();
}
DestroyableTree 来自 http://rene.klacan.sk/unity3d/games/2014/10/28/destroyable-terrain-trees-in-unity/
未注释时 tree.Delete()
让我确定我正在尝试编辑正确的树。
当我调试时我可以看到网格的顶点已经改变但是为什么它们不会在游戏场景运行时更新?
编辑: 这可能是因为我正在访问胶囊组件的网格而不是树本身。仍然如何访问地形上的树木网格(不一定使用上面显示的代码)?
使用上面 link 中提供的代码并稍作修改就可以了。虽然它没有解决我为什么要首先问这个问题的根本问题:(
这就是我的做法,很简单:在 René Klačan 写的 class DestroyableTree
中,我添加了额外的字段 public TreeInstance treeInstance;
,它在标记语句之后被初始化(在下图)通过添加 tree.treeInstance = treeInstance;
:
tree.treeInstance.GetComponent<MeshFilter>().mesh;
到达树的网格。我希望有人会觉得这很有用。