unity入门学习

568 阅读11分钟

1、unity简介

Unity 3D 也称 Unity,是由 Unity Technologies 公司开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具

Unity 3D 可以运行在 Windows 和MacOS X 下,可发布游戏至 Windows、Mac、Wii、iPhone、WebGL(需要 HTML5)、Windows Phone和 Android 平台。也可以利用 Unity Web Player 插件发布网页游戏,支持 Mac 和 Windows 平台的网页浏览,是一个全面整合的专业游戏引擎。

2、unity特色

1) 跨平台

游戏开发者可以通过不同的平台进行开发。游戏制作完成后,游戏无需任何修改即可直接一键发布到常用的主流平台上。

Unity 3D 游戏可发布的平台包括 Windows、Linux、MacOS X、iOS、Android、Xbox360、PS3 以及 Web 等。跨平台开发可以为游戏开发者节省大量时间。

以往游戏开发中,开发者要考虑平台之间的差异,比如屏幕尺寸、操作方式、硬件条件等,这样会直接影响到开发进度,给开发者造成巨大的麻烦,Unity 3D 几乎为开发者完美地解决了这一难题,将大幅度减少移植过程中不必要的麻烦。

2) 综合编辑

Unity 3D 的用户界面具备视觉化编辑、详细的属性编辑器和动态游戏预览特性。Unity 3D 创新的可视化模式让游戏开发者能够轻松构建互动体验,当游戏运行时可以实时修改参数值,方便开发,为游戏开发节省大量时间。

3) 资源导入

项目可以自动导入资源,并根据资源的改动自动更新。Unity 3D 支持几乎所有主流的三维格式,如 3ds Max、Maya、Blender 等,贴图材质自动转换为 U3D 格式,并能和大部分相关应用程序协调工作。

4) 一键部署

Unity 3D 只需一键即可完成作品的多平台开发和部署,让开发者的作品在多平台呈现。

5) 脚本语言

Unity 3D 集成了 MonoDeveloper 编译平台,支持 C#、JavaScript 和 Boo 3 种脚本语言,其中 C# 和 JavaScript 是在游戏开发中最常用的脚本语言。

**6) 联网

Unity 3D 支持从单机应用到大型多人联网游戏的开发。

7) 着色器

Unity 3D 着色器系统整合了易用性、灵活性、高性能。

8) 地形编辑器

Unity 3D 内置强大的地形编辑系统,该系统可使游戏开发者实现游戏中任何复杂的地形,支持地形创建和树木与植被贴片,支持自动的地形 LOD、水面特效,尤其是低端硬件亦可流畅运行广阔茂盛的植被景观,能够方便地创建游戏场景中所用到的各种地形。

9) 物理特效

物理引擎是模拟牛顿力学模型的计算机程序,其中使用了质量、速度、摩擦力和空气阻力等变量。Unity 3D 内置 NVIDIA 的 PhysX 物理引擎,游戏开发者可以用高效、逼真、生动的方式复原和模拟真实世界中的物理效果,例如碰撞检测、弹簧效果、布料效果、重力效果等。

10) 光影

Unity 3D 提供了具有柔和阴影以及高度完善的烘焙效果的光影渲染系统

3、unity应用

1) 游戏

3D 游戏是 Unity 游戏引擎重要的应用方向之一,从最初的文字游戏到二维游戏、三维游戏,再到网络三维游戏,游戏在其保持实时性和交互性的同时,其逼真度和沉浸感在不断地提高和加强。 下图为 Unity 官方发布的 3D 游戏 AngryBots 的试玩版(demo)。随着三维技术的快速发展和软硬件技术的不断进步,在不远的将来,3D 虚拟现实游戏必将成为主流游戏市场应用方向。

image.png

2) ### 虚拟仿真教育面应用

Unity 3D 应用于虚拟仿真教育是教育技术发展的一个飞跃,它营造了自主学习的环境,由传统的“以教促学”的学习方式变为学习者通过自身与信息环境的相互作用来得到知识、技能的新型学习方式。

image.png

3) 军事与航天工业

美国国防部高级研究计划局(DARPA)自 20 世纪 80 年代起一直致力于 SIMNET 的虚拟战场系统的研究,以提供坦克协同训练,该系统可连接 200 多台模拟器。 另外,该系统利用 VR 技术,可模拟零重力环境,以代替现在非标准的水下训练宇航员的方法

image.png

3) 室内设计

虚拟室内设计方案应用 Unity 3D 引擎进行开发,设计者可以完全按照自己的构思去构建和装饰虚拟的房间,并可以任意变换自己在房间中的位置,去观察设计的效果,直到满意为止,既节约了时间,又节省了做模型的费用

image.png

4) 城市规划

城市规划一直是对全新的可视化技术需求最为迫切的领域之一,利用 Unity 3D 引擎可以进行虚拟城市规划,并带来切实且可观的利益,展现规划方案时,虚拟现实系统的沉浸感和互动性不但能够给用户带来强烈、逼真的感官冲击,使用户获得身临其境的体验

image.png 5) 仿真工业

Unity 3D 引擎已经被世界上一些大型企业广泛地应用到工业仿真的各个环节,对企业提高开发效率,加强数据采集、分析、处理能力,减少决策失误,降低企业风险起到了重要的作用

image.png

6) 文物古迹展示、保护方面 利用 Unity 3D 引擎,结合网络技术,可以将文物古迹的展示、保护提高到一个崭新的阶段。

首先表现在将文物古迹实体通过影像数据采集手段建立三维实物或模型数据库,保存文物古迹原有的各种形式的数据和空间关系等重要资源,实现濒危文物古迹资源的科学、高精度和永久的保存。

其次,利用这些技术来提高文物修复的精度,预先判断、选取将要采用的保护手段,同时可以缩短修复工期。

通过计算机网络来整合统一大范围内的文物古迹资源,并且通过网络在大范围内利用虚拟技术更加全面、生动、逼真地展示文物古迹,从而使文物古迹脱离地域限制,实现资源共享,真正成为全人类可以拥有的文化遗产。

如下图所示。利用 Unity 3D 引擎实现虚拟文物古迹仿真可以推动文博行业更快地进入信息时代,实现文物古迹展示和保护的现代化。

image.png

4、游戏的几个要素

image.png

5、新建一个unity的项目

1)新建一个3d空项目,初始化ui界面

image.png 2)ui功能介绍

1、hierachy

  1. 可以看到默认有一个叫做 sampleScene 的东西,这是个 scene(unity 里的 scene 就是关卡)。
  2. 然后其下方可以展开的两个叫做 object。一个是主相机,一个是定向光

 2、inspector

  • 点击任意一个 object 后,右边就会显示一些东西。
  • 这些东西也是有 hierachy 的,那些可展开的东西叫做 components。component 可以使 object 做各种各样的事情。展开里的东西叫做 Properties(属性)

3、project

  • 下方很长的这个是 project。里面放着游戏 asset,可以从这里把 asset 直接拖进屏幕。从而显示在 hierachy 里。

3)创建地面

  • 在 hierachy 视图里新建一个 3d cube。
  • 在中央视图里选择物体后,双击 Object 聚焦。
  • 物品出现的位置不是我么想要的,所以选择 cube 后,在 inspector 里右键 transform 这个 component,点击 reset。这样物品的位置和缩放就被重置了。
  • 中央界面上方有几个 tab,代表着不同视图,选择 game 后就会变成游戏实际看到的画面。这些视图 tab 也可以拖动改变布局。比如说把 game 拖动到右边,这样就可以同时看到游戏画面的样子了。我们就这么做。
  • 改变一下 transform 让其变长变宽。就成了一个地面。在 inspector 左上方可以更改 object 的名字。这里改成 ground。

image.png

4)创建角色

  • 依旧用 cube 来作为游戏角色。创建后 reset。你看,之前的地面我们 reset 过了,现在的角色我们也 reset。那么调整两者之间的距离关系就简单多了。

5)material

角色现在和地面一样是白色,并不好区分。所以要用 material 改变角色的外观。

  • material 是 asset,要在 project panel 里创建。
  • material 也有很多属性可以在 inspector 里更改。
  • 把 material 拖到 object 上就可以用了。在 material 里更改的属性可以实时显示在屏幕上。

6) 添加物理

  • 把角色往上拖一点。点击中央上方的 play。发现无事发生,cube 并不会掉下来。因为我们什么都没做,什么都没加。
  • 所以我们得让这个 object 和 unity 物理系统交互。
  • 之前讲过 component 使得 object 做各种各样的事。因此我们需要给 object 一个新的 component。
  • 我们加上 RigidBody 这个 component,这样我们的 cube 就可以掉下来了。然后我们旋转一下以让物品掉下来更有趣。(qwerty 快捷键可以快速更换拖动,位置,旋转,缩放等工具)

7)component

  •  cube 的 components。除了我们添加的 RigidBody。还有很多别的。
  • transform 不用说了,基本每个 object 都有的基本属性。
  • Mesh Rendered。渲染 object 的,如果去掉勾选。物品就不会显示在屏幕上。但是仍然存在,只是不显示。
  • Box Collider。顾名思义,碰撞相关的组件。去掉勾选后物品就没有碰撞效果了。在有重力的时候,会无视地面一直往下掉。和其他物品碰到也不会相互影响。Box Collider 和 RigidBody 共同提供了真实物理效果。
  • Mesh Filter。没什么好说的,只有一个属性,改变形状。如果我们改成球体。注意由于我们的组件里依然还是 Box Collider。因此碰撞体积还是 Box。可以删掉 Box collider 换成 Sphere Collider。

unity 是通过 Script 来給 Object 添加代码

  1. script是一种组件 因此还是通过 Add Component 来添加。我们在我们的 cube 上添加一个 Script 组件。这个script上边会有几个函数
  2. Unity里可以使用C#和UnityScript;
  3. 在Unity里面凡是能挂在GameObject上的都是Component;
  4. Script也可以作为一个Component;
  5. Script要想挂在GameObject上就必须继承MonoBehaviour。
  6. 游戏是一种循环。

【Unity如何通过脚本驱动游戏】:

  1. Instantiate()创建GameObject;
  2. 通过Awake()和Start()来做初始化;
  3. Update,LateUpdate和FixedUpdate更新逻辑;
  4. 用OnGUI绘制UI;
  5. OnCollisonEnter等进行物理计算;
  6. OnPreCall等来控制渲染。

【如何更新逻辑】:

  1. 场景启动时调用所有脚本的Awake();
  2. 调用所有脚本的Start();
  3. 每一帧会调用一次Update;
  4. 所有脚本的Update调用完后,调用LateUpdate;
  5. 一帧中调用几次FixedUpdate。
  6. Update和LateUpdate一帧只调用一次,FixedUpdate和时间相关,例如,目标跑60帧,每一帧会更新一次FixedUpdate;游戏性能不行,没有达到理想帧数(例如30帧),一帧会调用两次FixedUpdate。这样可以保证单位时间内做得更新频率相同。

【对象销毁】:

  1. 调用Destroy销毁GameObject;
  2. 销毁对象时脚本调用OnDestroy(析构)。

【脚本间的通信】:

  1. 通过GetComponent找到(同一物体上挂的)其他脚本;
  2. 通过GameObject.Find找到其他物体 例如:
MyComponment myCom=gameObject.GetComponent<MyComponment>();  
//GetCompoment <T>()从当前游戏对象获取组件T,只在当前游戏对象中获取,没得到的就返回null,不会去子物体中去寻找。
  
MyComponment childCom=gameObject.GetComponentInChildren<MyComponment>();  
//GetCompomentInChildren<T>()先从本对象中找,有就返回,没就子物体中找,知道找完为止。
  
MyComponment[] comS=gameObject.GetComponents<MyComponment>();  
//GetComponents<T>()获取本游戏对象的所有T组件,不会去子物体中找。

MyComponment[] comS1=gameObject.GetComponentsInChildren<MyComponment>();    
MyComponment[] comSTrue=gameObject.GetComponentsInChildren<MyComponment>(true); 
//GetComponentsInChildren<T>()=GetComponentsInChildren<T>(true)取本游戏对象及子物体的所有组件 
  
MyComponment[] comSFalse=gameObject.GetComponentsInChildren<MyComponment>(false); 
//GetComponentsInChildren<T>(false)取本游戏对象及子物体的所有组件 除开非活跃的游戏对象,不是该组件是否活跃。

例如:获取另一个脚本中的变量

moveCube = GetComponent<MoveCube> ();  
Debug.Log ("GetComponent<MoveCube> () debug "+moveCube.speed); 

6、unity发布

unity可以根据各平台分别设置要发布的一些设置

image.png

通过在Build settings中设置各个平台的发布设置

image.png

6、热更新

7、发布