12 第1页 | 共2 页下一页
返回列表 发新帖
查看: 3774|回复: 16
打印 上一主题 下一主题

【转】Unity3d个性化地形创建

[复制链接]

1023

主题

3

听众

359

积分

设计实习生

Rank: 2

纳金币
335582
精华
0

最佳新人

跳转到指定楼层
楼主
发表于 2011-8-9 08:07:45 |只看该作者 |倒序浏览
一,在unity3d 的Project面板中新建一个文件夹,并为其命名为Editor。并在其文件夹下新建一个Javascript文件,命名为MountainsCreate.
二,把下面的代码拷贝到MountainsCreate.js上。
/*

*Use the tool.

*You can put 3D Max or maya model built into Unity3d in the mountains.

*/
@MenuItem ("Terrain/3DObject to Terrain")static function Object2Terrain ()

{   

// See if a valid object is selected   

var obj = Selection.activeObject as GameObject;   

if (obj.GetComponent(MeshFilter) == null) {



  EditorUtility.DisplayDialog("No mesh selected", "lease select an object with a mesh.","Cancel");   

  return;  

  

}else if ((obj.GetComponent(MeshFilter) as MeshFilter).sharedMesh == null) {   

  EditorUtility.DisplayDialog("No mesh selected", "lease select an object with a valid mesh.", "Cancel");   

  return;      

}   

if (Terrain.activeTerrain == null) {   

  EditorUtility.DisplayDialog("No terrain found", "lease make sure a terrain exists.","Cancel");   

  return;   

}   

    var terrain = Terrain.activeTerrain.terrainData;        // If there's no mesh collider, add one(and then remove it later when done)   
var addedCollider = false;
    var addedMesh = false;



    var objCollider = obj.collider as MeshCollider;

   

if (objCollider == null) {   

  objCollider = obj.AddComponent(MeshCollider);   

  addedCollider = true;   

}else if (objCollider.sharedMesh == null) {   

  objCollider.sharedMesh = (obj.GetComponent(MeshFilter) as MeshFilter).sharedMesh;   

  addedMesh = true;

    }   

   

Undo.RegisterUndo (terrain, "Object to Terrain");

   

var resolutionX = terrain.heightmapWidth;

   

var resolutionZ = terrain.heightmapHeight;

   

var heights = terrain.GetHeights(0, 0, resolutionX, resolutionZ);   

   

// Use bounds a bit smaller than the actual object; otherwise raycasting tends to miss at the edges

    var objectBounds = objCollider.bounds;

   

var leftEdge = objectBounds.center.x - objectBounds.extents.x + .01;

   

var bottomEdge = objectBounds.center.z - objectBounds.extents.z + .01;

   

var stepX = (objectBounds.size.x - .019) / resolutionX;

   

var stepZ = (objectBounds.size.z - .019) / resolutionZ;   

   

// Set up raycast vars

    var y = objectBounds.center.y + objectBounds.extents.y + .01;

   

var hit : RaycastHit;    var ray = new Ray(Vector3.zero, -Vector3.up);

   

var rayDistance = objectBounds.size.y + .02;   



var heightFactor = 1.0 / rayDistance;            



// Do raycasting samples over the object to see what terrain heights should be

   

var z = bottomEdge;

   

for (zCount = 0; zCount < resolutionZ; zCount++) {   

  var x = leftEdge;   

  for (xCount = 0; xCount < resolutionX; xCount++) {        

   ray.origin = Vector3(x, y, z);        

   if (objCollider.Raycast(ray, hit, rayDistance)) {            

    heights[zCount, xCount] = 1.0 - (y - hit.point.y)*heightFactor;            }

   else {

    heights[zCount, xCount] = 0.0;        

   }        

   x += stepX;   

  }   

  z += stepZ;

    }   

   

terrain.SetHeights(0, 0, heights);   



    if (addedMesh) {   

  objCollider.sharedMesh = null;

    }



    if (addedCollider) {   

  DestroyImmediate(objCollider);

    }

}
三,把从3D Max或Maya中制作的地形对象导入到Unity3d资源文件夹中。模型名为Mountains.
四,点击工具栏菜单中的Terrain--->Create Terrain,创建一个地形。
五,把导入的地形从Unity3D Project面板中拖放到Hierarchy面板中。在Hierarchy面板中选中Mountains对象,然后选中工具栏菜单中的
Terrain--->3DObject to Terrain.此时就能看到您自己导入的修改化地形了。
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

462

主题

1

听众

31万

积分

首席设计师

Rank: 8Rank: 8

纳金币
2
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

沙发
发表于 2011-12-30 18:25:52 |只看该作者
再看一看,再顶楼主
回复

使用道具 举报

1023

主题

3

听众

359

积分

设计实习生

Rank: 2

纳金币
335582
精华
0

最佳新人

板凳
发表于 2012-1-26 23:26:38 |只看该作者
2012年祝你好事多赢,发点小财;好事不断,交点小运;马上升职,做个小官;得个表彰,露个小脸;生活无忧,喝点小酒;预祝新年快乐,眯眯小眼。龙年春节祝福语
回复

使用道具 举报

1023

主题

3

听众

359

积分

设计实习生

Rank: 2

纳金币
335582
精华
0

最佳新人

地板
发表于 2012-4-3 13:16:21 |只看该作者
长了不少见识
回复

使用道具 举报

5969

主题

1

听众

39万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

5#
发表于 2012-4-16 23:20:58 |只看该作者
很有心,部分已收录自用,谢谢
回复

使用道具 举报

462

主题

1

听众

31万

积分

首席设计师

Rank: 8Rank: 8

纳金币
2
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

6#
发表于 2012-4-17 23:33:56 |只看该作者
先垫一块,再说鸟
回复

使用道具 举报

tc    

5089

主题

1

听众

33万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

7#
发表于 2012-4-24 23:25:00 |只看该作者
再次路过……
回复

使用道具 举报

462

主题

1

听众

31万

积分

首席设计师

Rank: 8Rank: 8

纳金币
2
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

8#
发表于 2012-4-30 23:27:31 |只看该作者
沙发不解释
回复

使用道具 举报

tc    

5089

主题

1

听众

33万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

9#
发表于 2012-7-11 23:26:24 |只看该作者
好可爱的字,学习了
回复

使用道具 举报

   

671

主题

1

听众

3247

积分

中级设计师

Rank: 5Rank: 5

纳金币
324742
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

10#
发表于 2012-7-22 23:22:53 |只看该作者
提醒猪猪,千万不能让你看见
回复

使用道具 举报

12 第1页 | 共2 页下一页
返回列表 发新帖
您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2025-7-24 00:06 , Processed in 0.065645 second(s), 28 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部