unity3d

Unity 3D使用高度图创建地形

半世苍凉 提交于 2021-01-04 11:48:10
在 Unity 3D 中编辑地形有两种方法:一种是通过地形编辑器编辑地形,另一种是通过导入一幅预先渲染好的灰度图来快速地为地形建模。 地形上每个点的高度被表示为一个矩阵中的一列值。这个矩阵可以用一个被称为高度图(heightmap)的灰度图来表示。 灰度图是一种使用二维图形来表示三维的高度变化的图片。近黑色的、较暗的颜色表示较低的点,接近白色的、较亮的颜色表示较高的点。 通常可以用 Photoshop 或其他三维软件导出灰度图,灰度图的格式为 RAW 格式,Unity 3D 可以支持 16 位的灰度图。 Unity 提供了为地形导入、导出高度图的选项。单击 Settings tool 按钮,找到标记为 Import RAW 和 Export RAW 的按钮。这两个按钮允许从标准 RAW 格式中读出或者写入高度图,并且兼容大部分图片和地表编辑器。 实践案例: 采用高度图创建地形 案例构思 Unity 3D 中支持 RAW 格式的高度图导入,这个格式不包含诸如图像类型和大小信息的文件头,所以易被读取。 RAW 格式相当于各种图片格式的“源文件”,它的转换是不可逆的。在 Photoshop 软件中可以使用滤镜功能制作高度图,本案例根据在 Photoshop 中制作好的高度图导入 Unity 3D 系统,自动生成地形。 案例设计 本案例通过 Photoshop 中制作好的高度图在

Unity 3D导航系统(Navigation)

旧时模样 提交于 2021-01-04 11:08:03
Unity 3D Navigation(导航)是用于实现动态物体自动寻路的一种技术,它将游戏场景中复杂的结构关系简化为带有一定信息的网格,并在这些网格的基础上通过一系列相应的计算来实现自动寻路。 本节主要讲解在创建好的三维场景中烘焙导航网格、创建导航代理以实现让角色绕过重重障碍最终到达终点的功能。 导航系统 过去,游戏开发者必须自己打造寻路系统,特别是在基于节点的寻路系统中,必须手动地在 AI 使用的点之间进行导航,因此基于节点系统的寻路非常烦琐。 Unity 3D 不仅具有导航功能,还使用了导航网格(navigation meshes),这比手动放置节点更有效率而且更流畅。 更重要的是,还可以一键重新计算整个导航网格,彻底摆脱了手动修改导航节点的复杂方法。 1) 设置 NavMesh NavMesh 的设置方法很简单,在 Hierarchy 视图中选中场景中除了目标和主角以外的游戏对象,在 Inspector 视图中单击 Static 下拉列表,在其中勾选 Navigation Static 即可,如下图所示。 2) 烘焙 执行菜单 Window→Navation 命令,打开导航窗口,单击右下角的 Bake(烘焙)按钮即可,烘焙后的场景如下图所示。 接下来详细看看 Navigation 面板,它有 Object、Bake、Areas 这 3 个标签页。 其中,Object

Unity 3D障碍物(Nav Mesh Obstacle)

柔情痞子 提交于 2021-01-04 11:07:42
. 一般来说,不可攀爬的 Nav Mesh 都被视为障碍物(Nav Mesh Obstacle),也可以直接将物体设为障碍物,即可以为游戏对象添加 Nav Mesh Obstacle 组件。 有别于普通的 Nav Mesh,Nav Mesh Obstacle 是一种不需要烘焙的障碍物,形状可以选择为立方体或胶囊体。 实践案例: 障碍物绕行 案例构思 在自动寻路过程中,往往会遇到障碍物,在寻路过程中遇到障碍物要怎样解决呢? Unity 官方内置的寻路插件 Navmesh 完美地解决了这个问题。 本案例通过一个简单的有障碍的场景,实现自动寻路中障碍物绕行功能。 案例设计 本案例在 Unity 3D 内创建一个有障碍的场景,场景内有一个 Cube 用来充当障碍物,通过 Navmesh 插件实现主角遇到障碍物时自动绕行效果。 案例实施 步骤 1):执行 File→Save Scene as 命令,将 Navigation 场景另存为 Obstacle 场景,如下图所示。 步骤 2):执行 GameObject→3D Object→Cube 命令新建一个障碍物,将其放置在主角的前方,并赋予黑色材质,如下图所示。 步骤 3):执行 Component→Navigation→Nav Mesh Obstacle 命令添加 Nav Mesh Obstacle 组件,如下图所示。 步骤 4):单击

Unity 3D力(AddForce)

非 Y 不嫁゛ 提交于 2021-01-04 11:07:32
力一般是在物体之间的作用过程中表现出来的,在物理学中力是非常重要的元素。 力的种类有很多,刚体组件因为受到力的作用而进行加速或抛物线运动。 Unity 3D 中通过 rigidbody.AddForce(x,y,z)方法添加力的作用,该方法的参数是施加力的方向,参数大小代表了力的大小。 实践案例: 力的添加 案例构思 现实世界中的物体都受到力的作用,所以才会有千变万化的物理现象。 游戏中物体受力时只是现象的模拟,而不是真的受到力的作用,也就是感觉好像真的受到了力的作用,而实际上只不过是执行力的函数而已。 本案例旨在通过对小球施加力的作用产生与盒子碰撞的效果。 案例设计 本案例在 Unity 3D 内创建一个简单的 3D 场景,场景内放有 1 个 Sphere,1 个 Plane 和 3 个 Cube,Plane 用于充当地面,Sphere 和 Cube 用于做力的测试。 初始场景中 Cube 处于静止状态,通过 Sphere 瞬间施加一个力,使 Cube 运动。 案例实施 步骤 1):创建游戏对象。执行 GameObject→3D Object→Plane 命令,此时在 Scene 视图中出现了一个平面,在右侧的 Inspector 面板中设置平面位置(0,0,-5)。 步骤 2):创建游戏对象。执行菜单栏中的 GameObject→3D Object→Cube 命令,创建 3

Unity 3D Panel控件

强颜欢笑 提交于 2021-01-04 11:03:51
Unity 3D panel 控件又叫面板,面板实际上就是一个容器,在其上可放置其他 UI 控件。 当移动面板时,放在其中的 UI 控件就会跟随移动,这样可以更加合理与方便地移动与处理一组控件。 拖动面板控件的 4 个角或 4 条边可以调节面板的大小。 一个功能完备的 UI 界面往往会使用多个 Panel 容器控件,而且一个面板里还可套用其他面板,如下图所示。 当创建一个面板时,此面板会默认包含一个 Image(Script)组件,如下图所示。 其中,Source Image 用来设置面板的图像,Color 用来改变面板的颜色。 来源: oschina 链接: https://my.oschina.net/u/4310326/blog/4875068

Unity 3D物理管理器(Physics Manager)

时间秒杀一切 提交于 2021-01-04 11:02:51
Unity 3D 集成开发环境作为一个优秀的游戏开发平台,提供了出色的管理模式,即物理管理器(Physics Manager)。 物理管理器管理项目中物理效果的参数,如物体的重力、反弹力、速度和角速度等。 在 Unity 3D 中执行 Edit→Project Settings→Physics 命令可以打开物理管理器,如下图所示。 可以根据需要通过调整物理管理器中的参数来改变游戏中的物理效果,具体参数如下表所示。 参 数 含 义 功 能 Gravity 重力 应用于所有刚体,一般仅在 Y 轴起作用 Default Material 默认物理材质 如果一个碰撞体没有设置物理材质,将采用默认材质 Bounce Threshold 反弹阈值 如果两个碰撞体的相对速度低于该值,则不会反弹 Sleep Velocity 休眠速度 低于该速度的物体将进人休眠 Sleep Angular Velocity 休眠角速度 低于该角速度的物体将进人休眠 Max Angular Velocity 最大角速度 用于限制刚体角速度,避免旋转时数值不稳定 Min Penetration For Penalty 最小穿透力 设置在碰撞检测器将两个物体分开前,它们可以穿透 多少距离 Solver Iteration Count 迭代次数 决定了关节和连接的计算精度 Raycasts Hit Triggers

Unity 3D触发器(Trigger)

有些话、适合烂在心里 提交于 2021-01-04 11:02:21
在 Unity 3D 中,检测碰撞发生的方式有两种,一种是利用碰撞体,另一种则是利用触发器(Trigger)。 触发器用来触发事件。在很多游戏引擎或工具中都有触发器。 例如,在角色扮演游戏里,玩家走到一个地方会发生出现 Boss 的事件,就可以用触发器来实现。 当绑定了碰撞体的游戏对象进入触发器区域时,会运行触发器对象上的 OnTriggerEnter 函数,同时需要在检视面板中的碰撞体组件中勾选 IsTrigger 复选框,如下图所示。 触发信息检测使用以下 3 个函数: MonoBehaviour.OnTriggerEnter(Collider collider),当进入触发器时触发。 MonoBehaviour.OnTriggerExit(Collider collider),当退出触发器时触发。 MonoBehaviour.OnTriggerStay(Collider collider),当逗留在触发器中时触发。 Unity 3D 中的碰撞体和触发器的区别在于:碰撞体是触发器的载体,而触发器只是碰撞体的一个属性。 如果既要检测到物体的接触又不想让碰撞检测影响物体移动,或者要检测一个物体是否经过空间中的某个区域,这时就可以用到触发器。例如,碰撞体适合模拟汽车被撞飞、皮球掉在地上又弹起的效果,而触发器适合模拟人站在靠近门的位置时门自动打开的效果。 实践案例: 碰撞消失的立方体

Unity 3D环境特效

痞子三分冷 提交于 2021-01-04 10:12:30
一般情况下,要在游戏场景中添加雾特效和水特效较为困难,因为需要开发人员懂得着色器语言且能够熟练地使用它进行编程。 Unity 3D 游戏开发引擎为了能够简单地还原真实世界中的场景,其中内置了雾特效并在标准资源包中添加了多种水特效,开发人员可以轻松地将其添加到场景中。 需要注意的是,由于 Unity 5.0 以上版本在默认情况下都没有自带的天空盒,只有包,所以当需要使用天空盒资源时,需要人工导入天空盒资源包。 水特效 在 Project 面板中右击,执行 Import Package→Environment 命令导入环境包,在打开的窗口中选中 Water 文件夹即可,然后单击 Import 按钮导入,如下图所示。 导入完成后,找到 Water 文件夹下的 Prefab 文件夹,其中包含两种水特效的预制件,可将其直接拖曳到场景中,这两种水特效功能较为丰富,能够实现反射和折射效果,并且可以对其波浪大小、反射扭曲等参数进行修改,如下图所示。 Water(Basic)文件夹下也包含两种基本水的预制件,如下图所示。 基本水功能较为单一,没有反射、折射等功能,仅可以对水波纹大小与颜色进行设置,由于其功能简单,所以这两种水所消耗的计算资源很小,更适合移动平台的开发。 雾特效 Unity 3D 集成开发环境中的雾有 3 种模式,分别为 Linear(线性模式)、Exponential(指数模式)和

Unity 3D三维模型简介

二次信任 提交于 2021-01-04 10:12:09
三维模型是用三维建模软件建造的立体模型,也是构成 Unity 3D 场景的基础元素。 Unity 3D 几乎支持所有主流格式的三维模型,如 FBX 文件和 OBJ 文件等。 开发者可以将三维建模软件导出的模型文件添加到项目资源文件夹中,Unity 3D 会将其显示在 Assets 面板中。 主流三维建模软件 首先介绍当今主流的三维建模软件,这些软件广泛应用于模型制作、工业设计、建筑设计、三维动画等领域,每款软件都有自己独特的功能和专有的文件格式。 正因为能够利用这些软件来完成建模工作,Unity 3D 才可以展现出丰富的游戏场景以及真实的角色动画。 下面介绍 3 种主流的三维建模软件。 1) Autodesk 3D Studio Max Autodesk 3D Studio Max 简称 3ds Max,是 Autodesk 公司开发的基于 PC 系统的三维动画渲染和制作软件。 3ds Max 可谓是最全面的三维建模,有着良好的技术支持和社区支持,是一款主流且功能全面的三维建模工具软件,如上图所示。 2) Autodesk Maya Autodesk Maya 是 Autodesk 公司旗下的著名三维建模和动画软件。 Maya 2008 可以大大提高电影、电视、游戏等领域开发、设计、创作的工作流效率,同时改善了多边形建模,通过新的算法提高了性能

Checking internet connection at runtime in Unity

两盒软妹~` 提交于 2021-01-04 07:15:28
问题 How can I check internet connection inside Update Function in unity? I want to know whether the user is connected or not, and based on that just disable some functionality of my game. Seems like there is no question like this been asked here before or if it is, it just checking the connection in Start function. Here is the code I have so far: void Update () { if (Application.internetReachability == NetworkReachability.NotReachable) { Debug.Log ("No internet access"); } else { Debug.Log (