Unity 3D 游戏开发 第二版 学习笔记
Unity 3D 游戏开发 第二版 学习笔记
码农小飞飞
在手游开发的路上越走越远!
展开
-
Unity 3D 3D坐标转换UI坐标(UGUI) 世界坐标转换UGUI坐标 以及Text Mesh使用
比如血条等的位置,实时跟随主角。using UnityEngine;public class Game3DPosToUIPosMyTest : MonoBehaviour{ public Transform targetTran; public RectTransform hpTran; public Camera uiCamera; public ...原创 2019-11-13 15:39:39 · 3223 阅读 · 0 评论 -
Unity 3D 资源导入 监听导入事件
API :https://docs.unity3d.com/ScriptReference/AssetPostprocessor.html常用的:using UnityEditor;using UnityEngine;public class AssetsImportMyTools : AssetPostprocessor{ //--导入声音前 public vo...原创 2019-11-13 11:53:51 · 2552 阅读 · 0 评论 -
Unity 3D 特殊的内置文件夹
1.Assets文件夹:游戏资源的顶层文件夹。AssetDatabase方法可以访问里面的任意资源。2.Editor文件夹:编辑器模式下的代码需要放在这里。打包后,会自动剥离它。3.Editor Default Resourcecs文件夹:资源文件夹。编辑器模式下的资源尽可能的放在这里。4.Gizmos文件夹:一般放一些工具类图标。使用Gizmos.DrawIcon()方法来显示它们。...原创 2019-11-13 10:40:19 · 228 阅读 · 0 评论 -
Unity 3D 运行状态下 资源的加载与优化 之 AssetBundle
在网络游戏中,可能需要在运行时再在并更行资源,而Unity提供了AssetBundle组件,可以将指定的一部分资源构建成AssetBundle文件。如果需要下载,那么需要将这些AssetBundle文件上传到CDN上。//--设置AssetBundle如图,在Project视图中选中需要构建AssetBundle的资源,在Inspector面板右下角可以写入它的资源名以及资源的后缀名...原创 2019-11-12 18:55:57 · 613 阅读 · 0 评论 -
Unity 3D 运行模式下 资源的加载与优化 之 Resources
运行模式和编辑模式是完全不同的,编辑模式下可以放很多很多资源,这些资源并不是全部打包到发布的游戏包中的。打包时,Unity会自动过滤掉没有引用的资源,注意:Resources目录和StreamingAssets目录下的会都打包。//--引用资源只有被引用到的资源Unity才会打包,那么如何分辨资源是否被引用?一张贴图被一个材质引用,这个材质被一个Cube引用,这个Cube被一个场景...原创 2019-11-08 17:44:40 · 816 阅读 · 0 评论 -
Unity 3D 版本管理
多人同时开发游戏时,需要对项目的版本进行管理,通常会将整个工程上传SVN或者Git。资源在导入Unity的时候,会自动生成很多中间资源,这些资源是不需要上传的。一般只需要将Assets projectSettings文件夹下的所有文件以及.meta文件上传即可。//--.meta文件.meta文件是Unity自动生成的。每个游戏资源都会有一个对应的.meta文件,它会标记资源在...原创 2019-11-06 18:37:44 · 1370 阅读 · 0 评论 -
Unity 3D 编辑器模式下 资源的加载与优化
注意,编辑器模式下可使用的大量代码在运行时无法使用。//--加载资源在编辑器模式下,Unity提供了一个标志性的类AssetDatabase,它专门负责读取工程内的资源。必须保证资源放在项目的Assets目录下,不然AssetDatabase是无法读取的,只能使用File类或者第三方工具类来读取。using UnityEditor;using UnityEngine;pub...原创 2019-11-05 15:50:49 · 3355 阅读 · 0 评论 -
Unity 3D 多媒体 视频
Unity 提供了Video Player组件来专门处理视频。//--视频文件Unity支持的视频文件包括 .mp4 .mov .webm 和 .wmv 。另外视频文件还支持从一个网址播放。Video Clip表示播放工程内的一个视频文件,URL表示播放工程外的视频或者从网上边下载边播放。//--视频渲染模式前两个选项需要指定摄像机3D或者UI摄像机。Camera...原创 2019-11-04 18:48:05 · 555 阅读 · 0 评论 -
Unity 3D 多媒体 音频
音频由多个Audio Source组件和一个Audio Listener组件组成,其中Audio Listener负责监听所有的Audio Source,最终通过设备的扬声器播放出来。同一个场景只能有一个Audio Listener组件启用,它会默认添加在主摄像机上。如果是3D音效,Unity会自动判断Audio Listener与音频的距离,从而增强或者减少音量。//--音频文件Unit...原创 2019-11-04 15:46:05 · 1383 阅读 · 0 评论 -
Unity 3D 静态对象 寻路网格
寻路就是提供一个目标点,根据障碍物自动计算出一条最优的路径,Unity寻路使用的是A*算法。寻路可分为动态寻路以及静态寻路两种。动态寻路就是障碍物的位置可以动态修改,而静态寻路表示障碍物永远都不会发生改变。静态寻路的效率会更高。//--设置寻路参与寻路计算的游戏对象需要选中Navigation Static 复选框。接着打开寻路烘培面板Window→AI→Navigation。...原创 2019-10-31 15:50:26 · 886 阅读 · 0 评论 -
Unity 3D 静态对象 Batching 静态合批 动态合批
比如游戏各个模型是独立的,它们的材质以及贴图很有可能是完全一样的,但是由于一些模型数据不一样,放入Unity中会占很多DrawCall,所以Unity提供了一个属性来做静态合批,可以将它们合并在一个Mesh里。//--设置静态合批首先在Edit→Project Settings→Player中勾选Static Batching静态合批和Dynamic Batching动态合批复选框。...原创 2019-10-31 11:25:58 · 2530 阅读 · 0 评论 -
Unity 3D 静态对象 遮挡剔除
游戏中元素很多,但是摄像机能看到的内容是有限的,并且有些元素会被另外一些元素挡住,例如墙,墙后面的元素会被墙挡住。如果不处理的话,这些元素也会带来一定的开销,此时可以使用遮挡剔除技术来剔除掉这些被挡住的元素,只有摄像机能看到的内容才会被动态保留下来。//--遮挡与被遮挡遮挡关系是由遮挡物与被遮挡物构成的。例如一面墙后面放了一些元素,那么墙属于遮挡物Occluder Static,元素属...原创 2019-10-29 14:56:15 · 1460 阅读 · 0 评论 -
Unity 3D 静态对象 Lightmap
Lightmap 技术的原理是将场景中的灯光与物体产生的光照与阴影信息烘培在一张或者多张Lightmap 贴图中,这些物体将不再参与实时光照计算,从而减少了大量的性能开销。它的缺点就是参与烘培计算的对象在游戏过程中不能发生移动。所以游戏中通常会将物体分成两类:一类是可发生位移变化的对象,他们使用实时光照计算;另一类是不可发生位移变化的,他们采取预先烘培Lightmap。//--设置烘培...原创 2019-10-28 15:28:33 · 2641 阅读 · 0 评论 -
Unity 3D 静态对象
静态对象是Unity提供的一个属性,它可以附加在游戏对象或者Prefab上。它的原理是限制物体在运行中不能发生位移变化,预先生成一些辅助的数据,从而达成一种用内存换时间的优化方式。静态元素的种类很多,选择任意游戏对象,Insoector面板单击右上角Static下拉框,即可选择设置。Lightmap Static :用来表示接受烘培光照计算,可烘培光照贴图。Occluder S...原创 2019-10-28 15:00:39 · 3824 阅读 · 0 评论 -
Unity 3D 持久化数据 XML
XML在开发中使用也很频繁,此时要以标签的形式来组织数据结构。C#提供了创建 解析 修改 和查询等方法,可以很方便的操作它。//--创建XMLusing System.IO;using System.Xml;using UnityEngine;public class CreateXML : MonoBehaviour{ private void Start() ...原创 2019-10-24 17:21:28 · 275 阅读 · 0 评论 -
Unity 3D 持久化数据 文件读取与写入 游戏存档
我们需要一个不影响开发的存档,并且查看要非常方便。我们可以自己写一个存档类,在编辑器模式下将存档保存在Assets同级目录下。在真是环境下将存档保存在Application.persistentDataPath下。using System;using System.Collections.Generic;using System.IO;using System.Text;...原创 2019-10-24 15:46:20 · 518 阅读 · 0 评论 -
Unity 3D 运行期间读写文本
在游戏运行期间,只有Resources 和 StreamingAssets 目录具有读取权限,其中Resources用来读取游戏资源,而StreamingAssets可使用File类来读取文件(除个别平台),但是都是只读的,并不能写。只有Application.persistentDataPath 目录是可读 可写的。using System;using System.IO;usin...原创 2019-10-24 11:26:20 · 395 阅读 · 0 评论 -
Unity 3D 编辑器模式下 读写文本
Unity 可以利用C# 的File类来读写文本,此时只需要提供一个目录即可。这里需要注意的是,编辑器模式下读写文本是很方便的,但是一旦打包发布,Assets/目录都不存在了,运行时是无法读取它目录下的文本的。using System.IO;using System.Text;using UnityEditor;using UnityEngine;public class Fi...原创 2019-10-23 17:47:06 · 1257 阅读 · 0 评论 -
Unity 3D 读取 TextAsset
TextAsset是Unity 提供的一个文本对象,它可以通过Resources.Load 或者 AssetBundle 来读取数据。其中数据是string格式的。当然也可以按byte[]读取。它支持读取的文本格式包括 .txt .html .htm .bytes .json .csv .yaml .fnt。新建一个文本拖入工程Resources下加载读取usi...原创 2019-10-23 17:16:26 · 3773 阅读 · 0 评论 -
Unity 3D 持久化数据 PlayerPrefs EditorPrefs
PlayerPrefs是Unity 自带的存档方法,它的优点是使用起来非常方便。引擎已经封装好GetKey 以及 SetKey 等的方法,并且还做保存数据的优化。由于保存数据可能是个耗时操作,频繁地保存可能会带来卡顿,所以Unity 默认会在应用程序切入后台时统一保存文件,开发者也可以强制调用 Save 来保存。缺点是编辑器模式下查看存档非常不方便。PlayerPrefs的储存位置在...原创 2019-10-23 15:56:11 · 801 阅读 · 2 评论 -
Unity 3D 持久化数据 JSON
游戏运行时我们无法通过EPPlus读取Excel,不过我们可以将它保存成自定义格式,例如CSV JSON ScriptableObject等。Unity 支持JSON的序列化和反序列化,需要注意的是,参与序列化的类必须在上方声明[Serializable]属性,并且支持对象的相互嵌套。我们可以使用JsonUtility.ToJson()以及JsonUtility.FromJson<T...原创 2019-10-23 15:23:36 · 464 阅读 · 0 评论 -
Unity 3D 使用 ExcelDataReader 读取Excel文件
Excel的第三方库https://github.com/ExcelDataReader/ExcelDataReader打开上面的Github地址。克隆库到本地,然后解压Zip后打开文件夹。用VS打开Vs解决方案.sln,生成解决方案。之后在工程目录下找到下面的这个文件夹中选中的三个文件,拖入Assets/Plugins/下。还有这个,Unity安装目录的System.Data...原创 2019-10-22 15:42:05 · 1813 阅读 · 0 评论 -
Unity 3D 创建和写入Excel
导入 EPPlus.dllusing System.IO;using OfficeOpenXml;using UnityEngine;public class CreateAndWriteExcelMyTools : MonoBehaviour{ private void Start() { //--路径以及名称 string f...原创 2019-10-22 17:40:46 · 864 阅读 · 0 评论 -
Unity 3D 动画系统 非运行状态(编辑器下)播放动画
using UnityEngine;#if UNITY_EDITORusing UnityEditor;using UnityEditor.Animations;using System.Linq;#endifpublic class EditorAnimationPlayMyTools : MonoBehaviour{}#if UNITY_EDITOR[CustomE...原创 2019-10-22 11:51:57 · 1755 阅读 · 0 评论 -
Unity 3D UGUI游戏界面 图集Atlas 以及图片显示错乱问题
每个Canvas 会自动合并下面所有元素到一个Mesh 里。Mesh 虽然可以合并在一起,但是如果贴图是分开的,那么每个贴图依然会多占用一个DrawCall。为了减少DrawCall,我们可以把多张图片合并在一个图片中,这称为Atlas(图集)。//--创建Atlas创建Atlas之前,请先确保 Sprite Packer 已开启。接着在Project视图中选择Create→Spr...原创 2019-10-21 17:35:06 · 8028 阅读 · 2 评论 -
Unity 3D UGUI游戏界面 事件系统
UGUI 所有的事件系统都是依赖 EventSystem 组件完成的,全面取代之前的SendMessage 系统了。这是运行状态下的EventSystem。//--UI事件UI事件依赖于 Graphic Raycaster 组件,它必须绑定在Canvas 组件上,表示这个Canvas 下的所有UI元素支持的事件。若有多个Canvas ,想让某个Canvas 下的UI不接受点击事...原创 2019-10-21 11:24:09 · 343 阅读 · 0 评论 -
Unity 3D UGUI游戏界面 基础元素
Unity 4.6 推出了全新的UI系统,称为UGUI。配合UI还提供了强大的EventSystem 事件系统来管理UI元素。从Unity 2017开始还引入了图集的概念。//--Text在 Hierarchy 中创建文本组件。 Create → UI →Text 。Rect Transform:用于控制UI物体的基本属性,Canvas Renderer:画板UI渲染器,必...原创 2019-10-18 19:01:00 · 869 阅读 · 0 评论 -
Unity 3D 捕获错误日志 打印在屏幕上
错误日志的现场往往是非常珍贵的,我们需要尽可能的将错误日志保存下来。如果是移动平台,保存和提取日志其实不方便。所以可以监听错误以及异常,并及时打印在屏幕上。using System.Collections.Generic;using UnityEngine;public class ErrorLogOnGUIMyTools : MonoBehaviour{ private...原创 2019-10-17 13:04:02 · 4449 阅读 · 0 评论 -
Unity 3D 游戏脚本 脚本编译
在编辑器下,每次修改完代码后,就会自动编译,最终所有代码将编译成DLL文件。一共4个。//--编译规则脚本分为 运行时脚本 和 编辑时脚本 两大类,运行时脚本最终会编译进游戏包中,而编辑时脚本仅用于编辑器模式下,不会被打进游戏包。脚本存放的目录决定了它将编译在哪个DLL 文件中。Plugins 目录下的脚本优先编译,然后才编译其他目录,最后会编译 Editor 目录下的脚本,最...原创 2019-10-16 17:46:11 · 2120 阅读 · 0 评论 -
Unity 3D 游戏脚本 脚本序列化
using UnityEngine;public class ScriptSerializeTestMyTools : MonoBehaviour{ public int id; public string myname; public GameObject prefab;}脚本可以通过序列化和反序列化来保存游戏数据,话句话说,就是脚本自身并没有保存数据,而...原创 2019-10-15 14:18:07 · 1750 阅读 · 0 评论 -
Unity 3D 游戏脚本 多脚本管理
Unity 脚本可以灵活地挂在多个游戏对象上,一个游戏对象也可以挂在多个脚本。那么:脚本多了,如何来管理,如何控制不同脚本执行的先后顺序?启动游戏后,Unity 会同时处理所有脚本。比如,执行脚本中的 Awake() 方法时,Unity 会先找到此时需要初始化的所有脚本,然后同时(先后顺序)执行这些脚本的所有 Awake() 方法。//--脚本的执行顺序脚本既可以在运行时动态添加在游戏...原创 2019-10-14 18:14:46 · 1541 阅读 · 0 评论 -
Unity 3D 游戏脚本 脚本的生命周期
生命周期中的所有方法都是Unity 系统自己回调的,不需要手动调用。//--脚本绑定事件在编辑器模式下,把脚本拖拽到一个游戏对象上,即为绑定。Unity 并没有提供脚本的绑定事件,但是我们可以通过生命周期中的Reset()方法来实现。using UnityEngine;public class ScriptBindEventMyTools : MonoBehaviour...原创 2019-10-14 15:11:14 · 492 阅读 · 0 评论 -
Unity 3D 游戏脚本 创建脚本
在开发模式下,Unity 使用 Mono 来跨平台地编译和解析C# 脚本。因为Mono是跨平台的,所以Unity的编辑器可以同时部署在Windows macOS 和 Linux 操作系统上。游戏发布后,Unity还提供了自动将DLL转成IL2CPP的方式,这可以提升代码编译后的执行效率以及稳定性。//--脚本模板在Project 视图中点击 Create→ C# Script 菜单项,即...原创 2019-10-14 10:50:24 · 1568 阅读 · 0 评论 -
Unity 3D 监听资源创建 删除 移动 保存等事件
using UnityEditor;using UnityEngine;public class OnAssetsEvent : UnityEditor.AssetModificationProcessor{ [InitializeOnLoadMethod] static void EditorApplication_projectChanged() { ...原创 2019-10-09 11:00:04 · 3081 阅读 · 0 评论 -
Unity 3D 拓展编辑器 拓展 Hierarchy 视图
拓展菜单using UnityEditor;using UnityEngine;public class HierarchyCreateMyTools{ [MenuItem("GameObject/拓展Hierarchy视图/创建Cube", false, 1)] static void CreateCube() { GameObject.Cr...原创 2019-10-09 15:05:30 · 573 阅读 · 0 评论 -
Unity 3D 拓展编辑器 拓展 Inspector 视图
//--拓展源生组件using UnityEditor;using UnityEngine;[CustomEditor(typeof(Camera))]public class InspectorCameraMyTools : Editor{ public override void OnInspectorGUI() { if (GUILayou...原创 2019-10-09 18:44:48 · 478 阅读 · 0 评论 -
Unity 3D 拓展编辑器 拓展Scene视图
//--辅助元素using UnityEngine;public class DrawGizmosMyTools : MonoBehaviour{ //--挂在相机上 //--依赖选择对象 private void OnDrawGizmosSelected() { Gizmos.color = Color.red; ...原创 2019-10-10 11:53:34 · 694 阅读 · 0 评论 -
Unity 3D 拓展编辑器 拓展 Game 视图
using UnityEngine;#if UNITY_EDITOR[ExecuteInEditMode]public class GameExpandMyTools : MonoBehaviour{ private void OnGUI() { //if (GUILayout.Button("拓展Game视图")) //{ ...原创 2019-10-10 14:54:12 · 607 阅读 · 0 评论 -
Unity 3D 拓展编辑器 MenuItem 菜单
//--覆盖系统菜单using UnityEditor;using UnityEngine;public class GameObjectUITextMyTools{ [MenuItem("GameObject/UI/Text")] static void CreateMyText() { Debug.Log("覆盖原有系统的创建Text");...原创 2019-10-10 16:41:01 · 681 阅读 · 0 评论 -
Unity 3D 拓展编辑器 面板拓展
//--Inspector面板脚本挂在游戏对象上时,右侧会出现它的详细信息面板,这些信息是根据脚本中声明的public可序列化变量而来的。using UnityEditor;using UnityEngine;[CustomEditor(typeof(InspectorExpandTestScript))]public class InspectorExpandTestE...原创 2019-10-10 17:29:28 · 2775 阅读 · 0 评论