@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", "Please select an object with a mesh.","Cancel"); return;
}else if ((obj.GetComponent(MeshFilter) as MeshFilter).sharedMesh == null) { EditorUtility.DisplayDialog("No mesh selected", "Please select an object with a valid mesh.", "Cancel"); return; } if (Terrain.activeTerrain == null) { EditorUtility.DisplayDialog("No terrain found", "Please 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> var x = leftEdge; for (xCount = 0; xCount < resolutionX> 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); } }
制作游戏时,我们都希望用最简单的方法获得最好的成效,就比如unity3d 模型转地形,如果可以很快得到转换不是我们希望的吗?所以今天给大家介绍一个插件。
这是一个超级方便的插件.直接把max导出的地形变成U3d地形.
1、将附件解压然后放进项目资源文件跟目录下;
2、把从3D Max或maya中制作的地形对象导入到unity3d资源文件夹中;
3、点击工具栏菜单中的Terrain--->Create Terrain,创建一个地形;
4、把导入的地形从Unity3D Project面板中拖放到Hierarchy面板中。在Hierarchy面板中选中刚才导入的模型对象记得要选中是带mesh的对象哦,然后选中工具栏菜单中的Terrain--->3DObject to Terrain.此时就能看到您自己导入的修改化地形了。
一,在Unity3D 的Project面板中新建一个文件夹,并为其命名为Editor。并在其文件夹下新建一个Javascript文件,命名为MountainsCreate.
二,把下面的代码拷贝到MountainsCreate.js上。
@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", "Please select an object with a mesh.","Cancel");
return;
}else if ((obj.GetComponent(MeshFilter) as MeshFilter).sharedMesh == null) {
EditorUtility.DisplayDialog("No mesh selected", "Please select an object with a valid mesh.", "Cancel");
return;
}
if (Terrain.activeTerrain == null) {
EditorUtility.DisplayDialog("No terrain found", "Please 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> var x = leftEdge;
for (xCount = 0; xCount < resolutionX> 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.此时就能看到您自己导入的修改化地形了。
unity3d本来不是建模、渲染的专门工具。max里的很多材质在unity3d都不能表现出来的,需要在unity3d中再对材质进行设置,而且如果你用的vary这些渲染器就更不能渲染出来了。最简单的办法就是烘焙图啊,在max里烘焙,在unity3d里直接贴图就是了,这样效果几乎就没变化了。
有两种模式,一种是将三维模型烘焙成高度图,之后在Unity的Terrain系统中导入高度图。
第二种是为模型添加碰撞器,但是说到底还是模型,并不是真的地形。
相关问题推荐
还是要学好编程基础呀如果你觉得编程很苦难 不一定要从c#开始学 学学js flash as等等 有个梯度就好多了如果要用好unity 不会编程那是不行的 学习的过程中都有个头疼的过程 记住 头越痛 代表你要接受的东西越多 坚持 你的大脑在和知识兼容中:D...
可以先思考学习的目的,是什么因素在驱动你。是完成一款作品?进入某个行业?还是探究某类问题?否则和技术相关的知识浩如烟海,很容易迷失在细枝末节上。而要找到动力源头。个人的经验,就是关注一些和自己同方向,同类型的创作者。他们输出的作品会激励你,...
可以让模型师直接作出这样的形状,如果用纯Unity制作,就要用基本游戏对象拼接了,包括楼梯,城堡,都可以拼接出来。正常情况不会这样做,因为不够精美,都是建模师来实现,毕竟Unity不属于专业的建模软件,侧重于实现功能。...
Shader Unlit/Test{Properties{_MainTex(MainTex,2D)=white{}_MainColor(MainColor,COLOR)=(1,1,1,1)_AddTex(AddTex,2D)=white{}_Maxset(Max,Range(0.1,1.0))=0.1}SubShader{Tags{RenderType=Transparent Queue=Tran...
文章主要为大家详细介绍了Unity Shader实现水波纹效果,文中示例代码介绍的非常详细具体代码实现如下:Shader Custom/shuibowen{ Properties{ _MainTex(Base (RGB),2D)=white{} _distanceFactor(Distancefactor,float)=1 _timeFactor(time factor,float)=...
策划的最基本的原则就是:改进缺点,做别人没有做到的。无论游戏策划还是其它策划都是一样! 游戏策划的第二个原则:放飞思想。也许你认为我是说策划们应该充满想象力,能想一些匪夷所思的东西!对不起。不是这意思!一个合格的策划不是为了发泄自己的...
可以多玩一些其它的游戏,看一些科幻电影等,寻找灵感。
游戏架构与设计不纯粹是一门科学,它不需要提出假设或探究真理,也不被逻辑或正规方法的严格标准所束缚。游戏的目的就是通过玩来获得娱乐,因此游戏设计即需要艺术家一样的创造力,也需要工程师一样的精心规划。游戏设计是一门手艺,就像好莱坞的电影摄像或服...
void Update(){ transform.rotation = Quaternion.Euler(Vector3.zero);}可以试一下,保证物体x轴和z轴为0就可以使其一直垂直。
界面左右移动、上下移动。。本质都是:手指滑动。。。可以参考这些:https://www.cnblogs.com/coldcode/p/5362537.htmlhttps://blog.csdn.net/totosj/article/details/80112852https://blog.csdn.net/zcc858079762/article/details/85253120...
首先新建一个C#脚本,命名为MyFollow,然后把以下代码粘贴进去,保存:AخA 1using UnityEngine;2using System.Collections;3public class MyFollow : MonoBehaviour4{5 public float distanceAway = 5; // distance...
安装高通的Vuforia插件即可。
不可以,只能一个工程打一个包。
Edit->Project Settings->Graphics 找到Shader Stripping 中fog mode设置为custom(原来是Automatic),然后选中你想要的模式,最后重新打包就ok
用到的插件:System.Drawing.dllSystem.Windows.Forms.dllSystem.Deployment.dll(运用基于.Net4.x的dll打包时,需要用到该dll,否则会报错)代码如下:using System;using System.Runtime.InteropServices;using UnityEngine;using UnityEngine.UI; p......
如下图,设置为none,然后删掉滑动条就可以了。