从MAYA建模到Unity漫游的详细教程_bysking算法
1、MAYA建模部分(maya版本:windows 2018版 (64-bit))windows
咱们的思路是创建一楼各个房间及楼梯而后不断的向上复制出整个楼栋框架
1.首先咱们要拿到模型的俯视图了解大体的布局:编辑器
创建一楼的地板,原理:新建一个立方体再创建另一个立方体让它们相交,按住ctrl键选中其中一个再加选另一个而后使用maya的布尔运算工具,在设置里面选择旧版算法,做差集利用此原理获得以下效果:ide
预计效果图以下:函数
元素类型有如下的几种:房间分为三种类型教室(有桌子椅子讲台黑板),会议室(有桌子椅子会议桌柜子)和左下角的小房子,因此咱们分别把这些元素建出来而后拼装在一块儿。工具
--桌子(倒角工具+立方体的组装+贴图)布局
--椅子ui
椅子模型,限于篇幅,不作讲解,简单说来就是,绘制曲线,绘制圆环曲线,同时选中,使用曲面挤出工具就能够作出弯曲的框架,还可使用倒角工具美化模型棱角。this
--会议桌(挤出+倒角+贴图)
--柜子(布尔差工具+贴图)
--讲台(立方体的面的挤出以及倒角就能够实现,再贴图)
--黑板(倒角+贴图)
--房间框架
新建一个立方体,利用布尔工具抠去镂空,获得房间的框架,这里要注意使用的是旧版算法,
(带窗户的房间框架)
用立方体组装一个窗户并赋予玻璃材,用立方体组装一个窗户并赋予玻璃材质。
选中房间框架模型进行uv展开,烘焙UV成TGA格式的图像文件,使用ps工具绘制贴图,再从新贴回模型(导入部分有详细教程)
--楼梯
好了,基本元素作完以后咱们就开始组装最基本的两间房间:教室以及会议室,并把他们打组命名,并居中枢轴,清除构建历史,最核心的基本元素就作好了。
而后在咱们根据卫星地图构建的地板上再次组装出咱们的一楼:
加上楼顶,总体打组,命名好比:floor1(一楼),选中这个组,居中枢轴,清除历史:
剩下的工做十分简单,能够在maya里面总体复制五份堆出五层楼,可是在Unity里面还须要进行添加碰撞,因此咱们选择去unity里面,为一层楼添加碰撞后再复制,节省工做时间,因而这栋楼就算完成了。
(能够看一下复制五层的效果:
)
而后是中间的大厅部分,也是很简单,几何体,不断运用布尔差工具,拼装。
大厅:
大厅顶:
大厅楼梯和台阶:
墙壁就是简单几何体,压缩后拼装,就像搭积木同样,再贴图,玻璃门那里有给玻璃材质:
玻璃门的建模和上面的窗户建模一个原理。
最后是右边的大楼和左边大楼的建模是一样的原理:
咱们只须要作出一层就好:
看一下五层的效果:
看一下总体效果(注意,unity使用模型的时候,只须要导入两栋楼的一楼便可):
2、导入部分(Unity版本:Windows Unity 2018.1.0f2 (64-bit))以及贴图教程
导入部分须要注意的问题就是贴图:下面咱们进行举个小例子进行两种方式导入尝试
(1)建模:建立一个多边形:
ctrl+d复制一份,按r键进行调整缩小如图:
做布尔运算:
确保旧版算法(方便uv展开)
获得以下结构:
同理,再新建多边形,作出窗户:
布尔运算后:
选中多边形,进入uv编辑器:
先确保以对象级别选中左侧物体,点击uv编辑器里面的建立,通常规则物体选择自动就行
uv被自动展开,放在长宽为1单位的正方形内,每一块uv壳能够直观理解为和多边形的某一个面相对应
因为咱们只须要作墙外面的贴图,因此只关心外边的四个面,因此全选uv,
从新缝合这些uv
在左边多边形上,按住鼠标右键不放,拖动到面级别,按住shift+鼠标左键依次点击咱们关注的四个墙壁外面,在uv编辑器里面,点击自动展开:
把咱们关注的uv壳和其余不关注的分离,保证关注的部分所占的比例最大,充分利用1*1的面积。
再点击保存uv快照。
选择存放的位置以及文件名记住。
点击应用并关闭:
若是没法保存是由于没选择左边的对象,鼠标移动到左边,切换到对象级别并选择物体,再点击应用并关闭便可。这样就在咱们事先选择的目录下面就有了贴图的文件。
接着就在刚下的目录找到,咱们的贴图,选择ps打开。
新建图层而且在对应区域绘制,或者插入图片
最后隐藏掉黑色的参考图层
输出为png图片,用做最终的贴图。
回到maya界面,点击多边形,建立新材质lambert
点击小箭头,切换到lambert属性
点击建立文件节点
点击文件夹
打开贴图文件:
打开渲染开关:
以上就是一个完整的绘制贴图的教程。
咱们保存为两种格式,fbx,与mb(导出时保留纹理,以及引用)文件
---方式一(fbx文件):
创建一个fbx文件夹把fbx模型和贴图文件一块儿放进去,导入unity才能有贴图
新建unity项目-把文件夹一块儿拖到unity的assets资源文件夹下,在再拖到项目里面就能够了。
--方式二(mb文件):这种方式直接拖就行,纹理被置入mb文件,会自动贴纹理,不过会花费一点时间,如今的unity版本支持对maya导出文件的mb格式进行直接解析。
3、Unity实现漫游部分
好了如今咱们Unity就有了带材质的模型.在实现漫游以前还须要对模型添加碰撞
为了快速进项漫游讲解,先使用未贴图的模型:
选中地面,点击右边的add Component,有两种选择,地板的话,能够选第一个box Collider,房间框架的话就选mesh Collider,就这样为每个一楼的物件都添加碰撞(能够批量选择,总体添加碰撞)
而后就是添加第一人称控制器:在Assests目录下右键导入须要的控制器包
依次展开以下目录:
拖动到世界里面,调整大小,而且调整到合适的位置
点击三角形,运行发现能够wasd四个按键来控制镜头移动,鼠标来控制视角方向。
由于咱们要作两个主场景,一个是第一人称,一个是第三人称,固然加上开始界面,一共有三个场景,更改当前场景名字为first,再新建两个场景third和start
进入third场景,(能够在first场景里面把添加好碰撞的模型从新从世界里面拖回ASSETS目录再导入third场景)导入添加好碰撞的模型,添加第三人称控制器,拖到游戏场景里面
可是直接点击运行是不可取的(咱们能够控制角色,可是摄像机倒是固定的),咱们还须要有后续的工做,即让摄像机跟随角色视角
因而咱们新建脚本followby
双击脚本(咱们事先安装好vs或者其余unity支持的代码编辑工具)
添加以下代码并点击保存:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class followby : MonoBehaviour {
public float mouse_x;
public float mouse_y;
public float mouse_scroll;
public GameObject player;
void Start()
{
mouse_x = 0;
mouse_y = 0;
mouse_scroll = 0;
}
// Update is called once per frame
void Update()
{
transform.LookAt(player.transform);
mouse_scroll = Input.GetAxis("Mouse ScrollWheel");
if (mouse_scroll != 0)
{
transform.Translate(new Vector3(0, 0, mouse_scroll * Time.deltaTime * 50f), Space.Self);
}
// if (Input.GetMouseButton(1))
//{
mouse_x = Input.GetAxis("Mouse X");
mouse_y = Input.GetAxis("Mouse Y");
transform.RotateAround(player.transform.position, player.transform.up, mouse_x * Time.deltaTime * 50f);
transform.RotateAround(player.transform.position, transform.right, -1 * mouse_y * Time.deltaTime * 50f);
// }
}
}回到unity的third场景,把脚本托给摄像机,再点击摄像机,展开属性列表,把第三人称控制器拖到对应位置:
摄像机和第三人称控制器都有位置属性,能够直接把摄像机的位置值改成第三人称控制器的值,
调整能够看到人物,其实这个时候点击运行就能够看到,摄像机能跟随人物进行旋转视角了,不过这还不够,还差运动跟随,因而再新建一个脚本follow_move
编辑以下代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class follow_move : MonoBehaviour {
public GameObject player;
// Use this for initialization
void Start()
{
}
// Update is called once per frame
void Update()
{
transform.position = player.transform.position;
}
}
返回unity,咱们新创建一个空对象,把follow_move脚本拖给它,再把第三人称控制器做为对象拖给这个空对象的脚本做为参数:
而后最后一个步骤,把main camera拖到这个空对象下面做为它的子物体,
这样就实现了摄像机的跟随而且能够根据用户的鼠标进行旋转,推移镜头
最后一个就是实现页面跳转了,咱们保存当前场景,进入start场景,新建脚本rotate
输入如下代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class rotate : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
transform.Rotate(Vector3.up, Time.deltaTime * 15, Space.World);
}
}
再把这个脚本拖给咱们的模型,这样就实现了模型的自动旋转,可点击三角启动运行,正常。
而后咱们须要建立基本的UI元素,简单的几个按钮:第一人称漫游,第三人称漫游,退出游戏
首先,新建一个pannel,而后在这个pannel下面添加三个按钮:展开按钮text属性,修改成第一人称漫游,第三人称漫游,退出游戏
把按钮拖放到中间
点击运行:效果以下
而后接下来咱们须要作最后的步骤 ,添加场景切换,即按钮事件
新建场景加载脚本:load
using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;//增长命名空间
public class load : MonoBehaviour
{
public void OnStartGame(string sceneName)
{
Application.LoadLevel(sceneName);
}
}
回到unity场景,新建空对象,把这个脚本拖给它,
接着点击第一人称漫游按钮,为其添加事件:
展开,选中咱们自定义的方法
而后按钮1就表明加载名字为first的场景,咱们在对应位置输入first
第二个按钮也是一样的原理:
最后还剩下一个退出按钮,新建一个quit脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class quit : MonoBehaviour {
public void BtnQuit()
{
#if UNITY_EDITOR
UnityEditor.EditorApplication.isPlaying = false;
#else
Application.Quit();
#endif
}
}
回到unity场景,把该quit脚本继续拖给以前建立的空对象,再点击退出按钮,展开属性,添加点击事件,
再把带有quit脚本的空对象拖给它
而后找到咱们建立的退出函数
最后就是可能须要调节一下光照的位置
至此项目的全部流程编写完毕。
截图: