async、await总结
关键字的真正含义
当执行返回参数为Task或者Task<>类型的函数时,假如该函数没有用async标识,那么开启新线程执行该方法
当有async标识时,当前线程会把该方法当成同步函数执行,直到运行到await关键字的地方,开启新线程
await关键字表示会开辟新线程来执行后面的方法,但是该线程会等待新线程执行完返回,然后继续执行
函数的执行途中是根据await关键字来判断是否需要开辟线程来执行代码(Async void方法调用时不能加await,所以它必定是在主线程中被调用),假如一个async标识的方法里面没有await,那么这个方法会被当成同步方法来调用
Async void的缺点Async void 主要用于Async event handler,其他时候请不要使用,在async void方法中,一定要加try catch来捕捉异常。
Async void 方法具有不同的错误处理语义。 当 async Task 或 async Task 方法引发异常时,会捕获该异常并将其置于 Task 对象上。 对于 async void 方法,没有 Task 对象,因此 a ...
Task、asyn和await
什么是异步同步和异步主要用于修饰方法。当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法;当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务,调用者不用等待该方法执行完毕,我们称这个方法为异步方法。
异步的好处在于非阻塞(调用线程不会暂停执行去等待子线程完成),因此我们把一些不需要立即使用结果、较耗时的任务设为异步执行,可以提高程序的运行效率。net4.0在ThreadPool的基础上推出了Task类,微软极力推荐使用Task来执行异步任务,现在C#类库中的异步方法基本都用到了Task,这称为基于任务的异步模式(TAP)
异步编程模式 | Microsoft Docs
net5.0推出了async/await,让异步编程更为方便。本篇主要介绍Task、async/await相关的内容。
ThreadPool介绍Task是在ThreadPool的基础上推出的,我们简单了解下ThreadPool。ThreadPool中有若干数量的线程,如果有任务需要处理时,会从线程池中获取一个空闲的线程来执行任务,任务执行完毕后线程 ...
PlayerPrefs、TextAsset、通用存档
游戏中有很多数据需要在运行时读取或者写入,最典型的就是游戏的存档功能。Unity自己也提供了一套存档API,但是功能比较单一,只支持保存int、float、和string这三种类型。不过C#支持文件的读写,我们可以灵活拓展它。
PlayerPrefsPlayerPrefs是Unity自带的存档方式,它的优点是使用起来非常方便。引擎已经封装好GetKey()以及SetKey()方法,并且还做保存数据的优化。由于保存数据可能是个耗时操作,频繁地保存可能会带来卡顿,所以Unity默认会在应用程序切入后台时统一保存文件,开发者也可以强制调用PlayerPrefs.Save()来保存
然而它的缺点就是,编辑模式下查看存档非常不方便,MacOS的存档在~/Library/Preferences/folder目录下,Windows存档在HKCU\Software[company name][product name]注册表中
新建PlayerPrefsDataTest脚本
1234567891011121314151617181920212223242526272829 ...
Excel和Json
游戏中持久化数据一般可分为两种:
第一种是静态数据,例如Excel数据表中由策划人员编辑的数据,其特点是运行期间程序只需要读取,不需要修改;
第二种是存档数据,例如记录玩家在游戏过程中的进度,其特点是运行期间既需要读取,也需要修改,并且在版本升级的时候还需要考虑存档的删除或重置
Excel策划人员通常都会在Excel中配置静态数据,例如道具表,它由主键、道具名称、描述、功能和参数等一系列数据组成。前后端使用道具主键来进行数据的通信,最终前端将主键所包含的整个数据信息展示在游戏中
EPPlusEPPlus是一个可以有跨平台解析Excel能力第三方DLL库,目前已经升级到EPPlus5且收费
官网
Excel spreadsheet library for .NET Framework/Core - EPPlus Software
从网上找到比较古早的3.0.0.2,X86版本的DLL,直接放在了Assets——Plugins文件夹内
提供一个下载网址:epplus.dll File Download & Fix For All Windows OS (pconlif ...
Playables API和Constrat约束
在Unity新版的动画系统中,必须创建Animator Controller文件,在音频系统中,也需要创建Audio Mixer文件用来编辑数据。如果游戏中模型动画很多,每一个都要用Animator Controller来连线的话太麻烦了。我们使用Playable API来更灵活地控制新版动画,像老版动画一样方便并且支持Avatar Mask、Blend Tree等新版动画的功能
播放动画Playables提供了工具类来直接控制播放动画,我们新建PPlayAnimation脚本,将待播放的动画剪辑通过AnimationPlayableUtilities.PlayClip()传递就可以
1234567891011121314151617181920212223242526272829303132333435using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.Playables;public class PPlayAnimation : MonoBehav ...
TimeLine编辑器
TimeLine编辑器可以用来编辑游戏内剧情动画,可以添加模型、动画、声音和Prefab等常用组件。
拖动时间线,可以编辑它们的Transform信息,控制动画的播放与关闭、模型的隐藏或显示。此外,还可以动态创建Prefab。另外,它还提供了自定义脚本来拓展编辑内容,这样将大幅度提高编辑的灵活度。
创建Timeline在Project视图中,选择Create——Timeline命令即可创建Timeline。可见timelines是一个Assets,一个asset就需要scene中有相应的能接受这个asset的instance(实例)的component。(就像我们的animationclip和animator controller都需要在animator组件当中引用)
在hierarchy中添加一个GameObject,添加Playable director组件,将创建的timeline资源拖入Playable中。这样的话,我们点击此GameObject,timeline窗口就能自动响应(Windows——Sequence——timeline)。Update Method表示时间线更 ...
C#文件操作
文件操作-查看文件属性FileInfo
创建文本文件,并在其中编辑内容“Hello World!!!”。
修改复制到输出目录选项为如果较新则复制。123456789101112131415161718192021222324252627282930313233343536 static void Main(string[] args) { //FileInfo提供创建、复制、删除、移动和打开文件的属性和实例方法 //并且帮助创建System.IO.FileStream对象 //相对路径,找出当前程序所在路径 FileInfo fileInfo = new FileInfo("TextFile1.txt"); //绝对路径,加上完整文件名 //FileInfo fileInfo = new FileInfo(@"D:\Visual Studio Projects\FileManage\FileManageLearning\TextFile1.txt&q ...
动画控制器Animator
Unity动画控制器的原理就是状态机。
传统的状态机需要在代码里写一个很大的Switch…Case来处理状态,Unity以可视化的形式简化了。而且还提供了子状态机和动画混合功能。由于状态机的原理是同一时刻只能有一个状态,所以Unity还提供了层的概念来将动画分成两个层来同时编辑
系统状态动画控制器默认提供Any State、Exit、Entry三种状态,我们无法删除默认的三种状态。除了Exit状态以外,自定义的动画状态无法连接到Any State和Entry状态,只能反向连接。
首先是entry状态,他表示当前控制器的初始状态,右击该状态,选择Make Transition命令,即可连接新的状态。状态机会按照连线的状态一次切换动画。橘黄色的状态表示默认状态,如果想切换默认状态,选择另一个状态,然后右键——Set as Layer Default State
接着是Any State状态,比如角色死亡一类的,需要从现有状态切换到另一个动画。可以从Any State状态连线到立刻播放的状态,等它的状态处理完后,再连线回到默认状态,继续原有逻辑
最后是Exit状态,状态机可以创建子状态。如 ...
模型和动画编辑器导入动画
Unity动画系统支持引擎内编辑动画,也支持外部导入FBX动画。引擎内置的动画编辑器没有骨骼动画的概念,只能编辑每一帧模型的Transform信息。可以在外部3D类软件编辑动画并导出fbx,来让Unity使用。(FBX (Filmbox) 是自 2006 年以来由 Kaydara 开发并归 Autodesk 所有的专有文件格式 (.fbx)。它用于提供数字内容创建应用程序之间的互操作性。)
Unity支持FBX网格文件的优化,动画重定向等功能。由于每个模型可能有很多动画,这样它们的管理就比较复杂。Unity提供了Animator组件,它是可视化的状态机编辑工具,可以更方便地预览自身动画之间的切换关系,以及动画混合方式。游戏中可能同时会有跟多模型,Unity又提供了TimeLine编辑工具,它用时间线来管理模型的进度关系,像游戏中常用的过场动画,技能编辑器或者3D动画片等。
模型Unity显示模型必须给游戏对象提供Mesh Filter和Mesh Renderer组件。Mesh Filter表示模型基础的mesh数据,Mesh Renderer通过材质贴图和Shader最终将模型渲染出来 ...
2D碰撞检测
Unity2D和3D的物理引擎是基于PhyX的,内置的碰撞检测也是基于PhyX的。PhyX可以模拟很真实的物理效果。但是对于游戏来说太过真实的物理效果反而看起来很假,游戏需要的是可配置性的“物理效果”,例如按帧或者时间线的方式来编辑产生类似物理的效果,所以目前大量的游戏几乎都是不使用物理引擎的。在Unity中可以关闭物理效果,只用它的碰撞功能,或者整理的碰撞功能都自己编写代码来完成
Collider 2D任何的碰撞现象都有两个载体,一个是发起碰撞的,另一个是接受碰撞的,所以我们首先要明确哪些物体是可以接受碰撞的。Collider2D并不依赖Sprite组件,就好比一个空气墙
capture Collider一般用于主角,其他形状用于场景或者动态阻挡等。composite Collider表示将Box Collider和Polygon Collider的外形合并,
Tilemap Collider 2D专用于tile,它经常与composite Collider合并使用,来消除无用的tile碰撞边界
Rigidbody 2d表示2D刚体组件,表示当前物体启动物理引擎。如果希望操控的角色 ...