CLR Via C#个人笔记5 - 基本类型
大章14:字符、字符串和文本处理字符Char类型System.Char
Char类型,在.NET中总是表示成16位Unicode代码值。
Char类型,提供2个静态只读字段:MinValue = \0 和 MaxValue = \uffff。
Char类型,提供GetUnicodeCategory方法,它返回枚举类,表明该字符是Unicode标准定义的控制字符、货币符号、小写字母、大写字母、标点符号、数学符号还是其它字符。
Char类型,在使用ToLower和ToUpper方法时,会需要使用到语言文化来转换,语言文化通过System.Threading.Thread.CurrentCulture静态方法获取。
Char转换数值类型
强转,效率最高。
用Convert类的静态方法。
用IConvertible接口,效率最低,因为要装箱。
123456789101112131415161718Main(){ char c; int n; // 1.强转 c = (Char) 65; n = (int) c; Console.WriteLine(c);// output: ...
王者荣耀复刻项目 模型控制篇
模型预处理淘宝、网上资源搞到的人物FBX,全都是一个FBX对应一个动作或者集成在一起。所以需要预先处理一下,这里记录过程。
最终的目的是一个model里带有所有的animation clip动作。因为直接用代码调用播放动画,所以也不需要动画状态机。
导入导入之后,先把动画模式改成Legacy。
动作未切片如果动画clip没有处理,那就自己在Animation里给动作切片就行。
一个fbx对应一个切片这类资源其实蛮麻烦的,需要在场景里拖拽任意一个带动作的model,然后把他作为新的prefab,才能对它的fbx进行编辑。
之后先把其他FBX动画模式改成Legacy!!!这点很重要,否则后面动作用不了的。
最后把其他fbx文件的animation clip用 ctrl+d 拷贝出来,拖到前面做的prefab的animation里,就可以了。
切片规范切片时长最好是要统一的,比如普攻随机动画总时长必须统一。还有诸如死亡动画。技能动画则不用。
代码生成
人物模型角色
主要内容
Arthur: 主节点,用来控制角色的位置移动。
arthur: Model,内附人物骨骼等,用来控制角色的旋转。 ...
C#精要 - 堆栈篇
先说一下什么是栈?数据结构中的栈是一种先进后出的数据结构。
在C#的内存中有用到栈结构,一个线程拥有一个大概1mb的线程栈。一般拿来存放引用指针、值类型、方法的局部变量和实参等。
内存管理栈是一种内存自我管理的结构,压栈自动分配内存,出栈自动清空所占内存。
但因此栈只能在一端对数据进行操作,也就是栈顶端进行操作。
方法调用与线程栈方法的调用追踪就是在栈上完成的。比如我们有一个main方法(程序入口), 在main方法中会调用一个GetPoint的方法。在线程执行时,会将main方法压入栈底(包括编译好的方法指令,参数,和方法内部变量),然后再将GetPoint的方法压入栈底,GetPoint中没有调用其它方法,压栈完毕。出栈顺序是先进后出,也就是后进先出,栈顶的方法GetPoint先执行完毕,然后出栈,所占内存清空,接着main方法执行后出栈,所占内存清空。
再说一下什么是堆?数据结构中的堆,是用数组实现的二叉树,所以它没有使用父指针或者子指针。堆根据“堆属性”来排序,“堆属性”决定了树中节点的位置。
CLR的堆是和栈对立的内存概念,而不是二叉树。一个程序用一个托管堆。托管堆一般拿来存 ...
王者荣耀复刻项目 战斗篇
全流程
代码结构
技能模块见技能篇:// TODO link
一些小功能的实现摄像机跟随要点是将 人物的位置 映射成 相机的位置。这里简单实现。
将相机的初始偏移值设置好,将角色初始位置能很好的放在中间显示。
Update中进行position对齐
1234void FightMgr.Update(){ // transCameraRoot物体下有一个旋转调整过初始值的相机。 mapRoot.transCameraRoot.position = transFollow.position;}
技能UI映射到地图非指向技能1:后羿的2技能
要点是将 UI拖拽的位置 映射成 地图向量的位置。
将技能UI拖拽起始点做记录,根据 拖动的点 - 拖拽起始点 = dir 获得一个初始的Vector2值。
将dir进行映射,具体做法是方向直接用dir.x和dir.y来作为地图的x、z轴,y轴取0;距离用一个倍乘器乘dir的模。映射好放到一个Vector3里。
将映射好的Vector3,偏转45度,因为相机偏转,技能也一起偏转以便与UI拖拽的方向对其。
123456 ...
王者荣耀复刻项目 网络同步篇
帧同步what什么是同步
在不同的客户端上表现相同。
目前市面上的游戏,一般分为帧同步和状态同步。
什么是帧同步
是一种网络同步技术。
由客户端A发送请求到服务端,再轮播给所有客户端各自在本地进行计算。
帧同步需要确保不同平台运算结果统一。
什么是状态同步
与帧同步最大的区别就是,它不需要按逻辑帧(固定时间间隔)去同步数据,而是根据数据发生改变后才进行同步数据。
why
王者荣耀就是用帧同步方式实现的网络同步。另外LOL用的是状态同步。
帧同步vs状态同步
战斗逻辑。帧同步是在客户端(或移到服务端)进行计算;状态同步一般只在服务端进行计算。
开发压力。帧同步因为在客户端算,要解决不同平台浮点数的差异,需要额外开发定点数替换浮点数;状态同步是在服务端算,相对安全,但对服务端负载要求更为高。
战斗重连。帧同步,玩家重连只能从服务端获取操作序列帧加速运算来恢复重连;状态同步可以随时获取到一个时间点的状态,所以mmo采用这个为主,可以瞬间恢复。
更新频率。帧同步,服务端必须保持定时推送同步信息给客户端,即使没有任何变更;状态同步,可以等某个状态发生变化了才推送同步信息给客户端。
...
CLR Via C#个人笔记4 - 类型和成员基础
大章6:类型和成员基础类型的各种成员
常量(大章7) 数据值恒定不变的符号。public const bool isBoy = true;
字段(大章7)
实例构造器(大章8)
类型构造器(大章8) 是将类型的静态字段初始化为良好初始状态的特殊方法。static ClassName() {}
方法(大章8) 更改或查询类型或对象状态的函数。分静态方法和实例方法。
操作符重载(大章8) 实际是方法,由于不是所有编程语言都支持操作符重载,所以它不是CLS(公共语言规范) 的一部分。
转换操作符(大章8) 是定义如何隐式或显式将对象从一种类型转型为另一种类型的方法。同操作符重载,由于不是所有编程语言都支持,所以它不是CLS(公共语言规范) 的一部分。
属性(大章10) 可以无参,也可以多参。public Int32 this[String s]{get;set;} // 实例有参属性(索引器)
事件(大章11) public event EventHandler SomeEvent; // 实例事件
类型 可以定义其他嵌套类型。通常 ...
CLR Via C#个人笔记3 - 基元类型、引用类型和值类型
大章5:值类型与引用类型基元类型什么是基元类型?
有些数据类型太常用了,为了方便程序员书写,C#编译器允许代码以简化语法来操纵。这些编译器直接支持的数据类型叫做基元类型(primitive type)。
注意一下,一般国人说的类型是指值类型和引用类型的分类,和这里的类型不是一个意思。
比如以下的代码
1234int a = 0;System.Int32 a = 0;int a = new int();System.Int32 a = new System.Int32();
他们4个生成的IL代码是完全一样的。
基元类型一览
基元类型的映射
string和String都是直接映射System.String,所以他们是完全一样的,所以基元类型的本质是映射到FCL(.NET 的 Framework Class Library)类型。
不同语言编译器,对于映射的处理不同,比如C#会将long映射到System.Int64而C++是映射Int32。
隐式转换,C#只会在转换安全的情况下才允许。所谓安全,就是说不会发生数据丢失的情况,比如从低精到高精。显式转换可以允许数据丢失,C#总是会选 ...
CLR Via C#个人笔记2 - 类与分配
大章4:类的根基所有类都从System.Object派生 CLR要求所有类最终都从System.Object类派生。无论你的类写不写父类,都会继承自此。注意,通过反编译看构造比较难看出这一点,但是很重要。
System.Object的方法public:
Equals: 没啥好说,如果不重写默认就是判断值是否相等,==判断的是引用地址是否相等。String的比较特殊,微软重写了,所以”AAA” == “AAA”是会返回true的。
GetHashCode: 返回对象的值得哈希码。用的少。
ToString: 返回类型的完整名称(this.GetType().FullName)。经常重写。
GetType: 获取类型,反射常用的。注意它是非虚,目的是不推荐修改。
protected:
MemberwiseClone: 非虚方法。书里讲得不好,简单来说本方法就是浅拷贝。浅拷贝简单理解为只对类里的值类型字段进行逐位复制,而引用类型字段则拷贝引用。引用也新造,就是深拷贝了。
Finalize: 在被GC前,会调用一次这个虚方法。
new Object() ...
王者荣耀复刻项目 UI篇
跳字优化对象池优化制作一个对象池来缓存跳字专用的prefab。
123456789101112131415161718// ---------整体流程方法名(以下只展示方法签名)---------class HPWindow : void SetJumpUpdateInfo(JumpUpdateInfo jui); // 先使用 pool.PopOne() 从对象池获取一个GameObject,再 Show()。class JumpNumPool : JumpNum PopOne(); // Queue弹出一个prefab实例化后的GameObject对象。如果Queue已经空了,就执行CreateOne()新插入一个JumpNum到Queue并初始化,然后弹出返回。class JumpNum : void Show(JumpUpdateInfo ji); // 根据JumpUpdateInfo配置 显示跳字。最后执行Recycle()。class JumpNum : void Recycle(); // 0.75s后执行回收,将GameObject塞回Queue中。// ------ ...
如何使用Hexo?
一.Markdown个人约束
一级标题:# <center>大章:XXX</center>
二级标题:### XXX
三级标题:#### ① XXX
有序内容:1. XXX
无序内容:* XXX
内容:XXX
二.Markdown常用语法
引用内容:> XXX
单行代码:``
多行代码:``````
其他:https://www.jianshu.com/p/a6a6a22e9393
三.Hexo文件头123456789101112title: 如何使用Hexo?cover:https://cdn.jsdelivr.net/gh/CodingCodingK/CodingCodingK.github.io.ImageHost/img/~.pngtags: - Hexo - 技术categories: - Hexo - Hexo1 Hexo2 cover: 文章封面图 top_img: 文章Top图---



