委托、Lambda表达式
委托的定义和使用如果我们要把方法当做参数来传递的话,就要用到委托。简单来说委托是一个类型,这个类型可以赋值一个方法的引用。
声明委托使用delegate关键字定义委托,告诉编译器这个委托可以指向哪些类型的方法,然后,创建该委托的实例。
定义委托:
1delegate void IntMethodInvoker(int x);
定义了一个委托叫做IntMethodInvoker,这个委托指向以int类型为参数,返回值为void的方法。delegate相当于class,IntMethodInvoker相当于class名,也就是说,定义了委托是需要实例的
其他案例:
12delegate double TwoLongOp(long first,long second);delegate string GetAString();
使用委托12345678910111213141516171819202122namespace DelegatesTest{ class DelegateTest1 { delegate string MyStri ...
事件Event和观察者模式
概念事件(Event)基于委托,为委托提供了一个发布/订阅机制,我们可以说事件是一种具有特殊签名的委托。
什么是事件? 事件(Event)是类或对象向其他类或对象通知发生的事情的一种特殊签名的委托事件的声明
1public event 委托类型(delegate、Action、Func) 事件名
事件使用event关键词来声明,他的声明类值是一个委托类型通常事件的命名,以名字+Event作为他的名称,在编码中尽量使用规范命名,增加代码的可读性。
为了更容易理解事件,我们还是以前面的动物的示例来说明,有三只动物,猫(名叫Tom),还有两只老鼠(Jerry和Jack),当猫叫的时候,触发事件(CatShout),然后两只老鼠开始逃跑(MouseRun)。接下来用代码来实现。(设计模式-观察者模式)
例子123456789101112131415161718namespace Observer_Pattern{ class OberverTest { delegate void MyDarling();//在类内建立委托,相当于类 ...
反射(Reflection)和特性(Attributes)
1. 反射和特性-Type类,用来访问单个类什么是元数据,什么是反射
程序是用来处理数据的,文本和特性都是数据,而我们程序本身(类的定义和BCL中的类)这些也是数据。
有关程序及其类型的数据被称为元数据(metadata),它们保存在程序的程序集中。
程序在运行时,可以查看其他程序集或其本身的元数据。一个运行的程序查看本身的元数据或者其他程序集的元数据的行为叫做反射。
下面我们来学习如何使用Type类来反射数据,以及如何使用特性来给类型添加元数据。Type位于System.Reflection命名空间下
BCL:Basic Class Library 基础类库
Type类预定义类型(int long 和 string等),BCL中的类型(Console,IEnumerable等)和程序员自定义类型(MyClass、MyDel等)。每种类型都有自己的成员和特性。
BCL声明了一个叫做Type的抽象类,他被设计用来取得类型的成员和特性。使用这个类的对象能让我们获取程序使用的类型信息。
由于Type是抽象类,因此不能利用它去实例化对象。关于Type的重要事项如下:
对于程序中用到的每 ...
线程(Thread)、任务(Task)和同步(sync)
1. 进程和线程的概念线程对于所有需要等待的操作,例如移动文件,数据库和网络访问都需要一定的时间,此时就可以启动一个新的线程,同时完成其他任务。
一个进程的多个线程可以同时运行在不同的CPU上或多核CPU的不同内核上。
线程是程序中独立的指令流。
在VS编辑器中输入代码的时候,系统会分析代码,用下划线标注遗漏的分号或其他语法错误,这就是用一个后台线程完成。
Word文档需要一个线程等待用户输入,另一个线程进行后台搜索,第三个线程将写入的数据存储在临时文件中。
运行在服务器上的应用程序中等待客户请求的线程称为侦听器线程。
进程进程包含资源,如WIndows句柄,文件系统句柄或其他内核对象。每个进程都分配了虚拟内存,一个进程至少包含一个线程。
一个程序启动,一般会启动一个进程,然后进程启动多个线程。
进程和线程的一个简单解释(资料来源-阮一峰)
计算机的核心是CPU,它承担了所有的计算任务。它就像一座工厂,时刻在运行。
如果工厂的电力有限一次只能供给一个车间使用。也就是说一个车间开工的时候,其他车间就必须停工。背后的含义就是单个CPU一次只能运行一个任务(多核CPU可以运行多个任务)。 ...
网络通信摘要
Protocol和TCP/IPTCP/IP定义的是传输方式
Protocol定义的是传输数据的具体内容,如“请求登录”、“请求改名”等
运行PESocket控制台示例需要先在“解决方案——Protocol——NetMsg.cs”中修改为计算机本地网路地址:
123456789101112131415using System;using PENet;namespace Protocol { [Serializable] public class NetMsg : PEMsg { public string text; } public class IPCfg { public const string srvIP = "127.0.0.1";//修改为本地地址 public const int srvPort = 17666; }}
VS中生成dll的方法
首先打开PESocket的sln,然后在解决方案资源管理器中 ...
第二章UI框架与配置文件摘要
UI逻辑介绍
分为四层:
逻辑服务层:提供全局服务
系统业务层:处理模块内部业务逻辑
界面表现层:控制UI界面交互表现
公共组件层:公共工具类、配置常量定义、数据模型类等
使用Queue来缓存Tips
在示例中使用了lock语句
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657using System;using System.Collections;using System.Collections.Generic;using TMPro;using UnityEngine;namespace DarknessWarGodLearning{ public class DynamicWnd : WindowRoot { public Animation tipsAni; public TextMeshProUGUI textTips; p ...
暗黑战神场景搭建部分摘要
Unity Built-in灯光Unity Built-in的环境光(Ambient)是通过“Light面板——Environment选项卡——Environment Lighting”设置的。
Built-in灯光组件参数如果一个灯光的Mode设为Realtime,那么这盏灯的灯光计算是实时的,实时光的GI效果可以在“Light面板——Scene选项卡——Realtime Lighting”开启,灯光的Indirect Multiplier参数表示这盏灯光的间接光强度。
如果一个灯光的Mode设为Mixed或Backed,那么这盏灯需要参与烘焙,此时GI可以在“Light面板——Scene选项卡——Mixed Lighting”开启(必须先开启Realtime Lighting的GI才能开启MixedLighting的GI),面板的Lightmapping Settings此时可以调节烘焙的光照贴图的参数。只有static物体才能参与烘焙。
有的时候光照贴图烘焙不正确,需要在三维物体的导入设置当中开启“Generate Lightmap UV”选项,这会为这个三维物体生成第二个UV ...
坐标系、向量
http://candycat1992.github.io/unity_shaders_book/unity_shaders_book_chapter_4.pdf
笛卡尔坐标系笛卡尔坐标系(Cartesian Coordinate System)
基矢量(basis vector):三维笛卡尔坐标系的三个坐标轴。
标准正交基(orthonormal basis):基矢量相互垂直且长度为1。
正交基(orthogonal basis):坐标系中坐标轴之间相互垂直但长度不为1.
左手坐标系(left-handed coordinate space)、右手坐标系(right-handed coordinate space)
同一种坐标系有相同的旋向性(handedness)
左手法则(left-hand rule)、右手法则(right-hand rule):在左手坐标系中,举起左手,握拳,伸出大拇指指向旋转轴的正方向,剩下4个手指弯曲的方向就是旋转的正方向。右手坐标系使用相似的判断方法。
Unity的坐标系
在模型空间和世界空间中,Unity使用的是左手坐标系。
在观察空间中, ...
UnityShader的形式
前面我们讲了UnityShader文件结构以及ShaderLab语法。接下来我们看看着色器代码应该写在哪里。
表面着色器可以写在SubShader语义块中;顶点/片元着色器和固定函数着色器可以写在Pass语义块中。
1234567891011121314Shader "MyShader"{ Properties{ //所需的各种属性 } SubShader{ //真正意义上的Shader代码会出现在这里 //Surface Shader //Vertex Shader/Fragment Shader //Fixed Function Shader } SubShader{ //和上一个SubShader类似 }}
Surface ShaderSurface Shader是Unity自创的,需要的代码量少,渲染代价比较大,在背后依旧会转变成相应的Vertex/Fragment Shader。Unity包装好的Surface Shader处理了很多光照细节, ...
本地打包位置
Addressable打包位置Editor环境在Window——Asset Management——Addressables——Profiles窗口中,我们可以看到Local和Remote(远程)的默认Path,我们可以自行配置
在Addressables Groups窗口中点击任意Group,会在Inspector中显示出当前Group的Setting,其中显示了这个Group的内容保存位置
Build Path:Addressable在Build时的文件位置。
Load Path:运行时Addressable的LoadPath。
我们回到Addressables Groups窗口中,点击Build——New Build——Default Build Script,就实现了编辑器环境下的打包,打包出的文件位置就是BuildPath的位置:
Windows打包后环境游戏名_Data文件夹——StreamingAssets——aa——StandaloneWindows64。
如果想要热更新,就是先在Editor环境下,使用Addressable来Build好,然后在编辑器的“Lib ...