- 博客(43)
- 收藏
- 关注
原创 C#文件(夹)读取相关(完善中。。。)
阅读项目编辑器的代码时,发现好多与文件(夹)路径相关代码。本来自己之前对路径相关的东西就模模糊糊,希望通过这篇笔记能让自己模糊的地方明朗一下。
2025-08-21 11:30:42
379
原创 Unity常用工具及默认快捷键
轴心(Pivot),建模软件中确定的一个点,这个物体的移动、旋转、缩放都会基于这个点执行。中心(Center),指物体的几何中心,Unity根据游戏对象的形状自动计算的中心点。本地坐标系(Local),会随着游戏对象的旋转更改,即对象自身的坐标系。Left/RightArrow => 折叠/展开选中对象的。全局坐标系(Global),不会随着游戏对象的属性更改。Alt+鼠左 => 围绕对象转动视角。鼠右 + WASD => 自由移动视角。Alt+鼠右 => 拉近(远)视角。鼠左 => 框选3D游戏对象。
2025-08-19 15:38:42
375
原创 ++i与i++
但是一旦有中间变量去接收,比如var tempValue = ++i 或者 i++;tempValue中间值就是不一样的。1) i = 9,那经过i++或者++i,i的值都为10。如果还没理解,下面附带案例代码,看下Log或者断点看下即可。对于i的最终值,二者结果是一样的。
2025-08-11 17:30:08
167
原创 程序设计原则(SOLID)
S:Single,单一职责原则。O:Open,开闭原则。L:Liskov,里氏替换原则。I:Interface,接口隔离原则。D:Depend,依赖倒置原则。
2025-08-11 13:22:52
333
原创 开闭原则代码示例
对于上面的计算方法,考虑这样一种场景,用户想要计算一些其它形状的面积总和,比如三角形、矩形、五边形等等…… 您将不得不反复编辑此类以添加更多的if/else块,这就违反了开闭原则。
2025-08-11 10:49:29
322
原创 初识C#元组(Tuple)
看项目代码时,偶然间看见一个这样定义的数据结构,顿时人傻了(这啥玩楞)。我记着之前整理过Tuple,但是找不见了,而且之前整理的时候,对Tuple已经小彻小悟了。如今再回想Tuple,只记得有这么一个名词。那就重新再整理一次吧。。。其实在我看过元组的示例代码后有了新的感悟:元组就是一个临时构建的匿名对象(个人理解)。元组的创建可以使用基本的Tuple类或ValueTuple(推荐)创建元组。// 使用 Tuple 类创建元组// 使用 ValueTuple 创建元组元组的访问。
2025-08-09 10:51:28
228
原创 小白浅析Unity生命周期函数
OnEnable逻辑在游戏对象激活时,组件重复激活就重复执行;组件始终激活,游戏对象重复激活也重复执行。OnDisable与OnEnable执行相反。组件处于激活态销毁时,OnDestroy与OnDisable同一帧执行逻辑;组件非激活态销毁则只触发OnDestroy逻辑。OnEnable、Start:游戏对象和组件同时激活才生效。Awake:游戏对象激活就生效,与组件是否激活无关。Awake逻辑在挂载脚本后运行期间只执行。OnDestroy:是组件销毁的回调。游戏对象与组件处于激活态时。
2025-08-05 13:34:19
387
原创 QFramework框架底层逻辑学习
先是这行代码,通过CounterAppController层获取CounterAppModel层,在我看来,整个CounterApp架构的构建由此开始,为了方便管理,架构整体使用依赖注入的方式将各个子模块注入整个CounterApp的Architecture中。使用QF框架重构后的代码,给我这种小白一种很抽象的感觉,但好的代码就是抽象的,这是不可否认的。接下来初始化所有已经注入到CounterApp架构中的Model、System,并打上“已经初始化”标识。//TODO 未完待续...
2025-05-15 17:44:56
610
原创 C#强类型枚举的入门理解
并不是一个官方的术语,但它通常用来描述。假设有一个非泛型的容器,存储的是。的作用就是将筛选出的。实例转换为具体的类型。中取出元素时,默认是。为什么需要强类型枚举?
2025-05-14 17:00:09
306
原创 C#扩展方法的入门理解
在学习QFramework时,看底层框架代码注意到这个函数,对于我一个小白来说不明所以,于是GPT了一下,才知道这是一个对ICanGetModel接口的扩展方法,于是想对C#扩展方法进行拆解理解一下,遂笔。示例代码Animal使用扩展方法。使用扩展方法前后代码对比。
2025-05-14 15:37:07
262
原创 关键字where
(Generic Constraints)中,目的是对泛型类型参数限制其必须满足的条件,从而保证类型参数具备特定的能力或特性,增强类型安全和代码可读性。表示类型参数必须有无参构造函数,必须放在所有其他约束的最后。可以有多个接口约束,写在基类约束之后,接口之间用逗号分隔。),它必须写在所有接口约束之前。如果存在继承类的约束(如。更严格,也只可单独使用。
2025-05-08 17:41:53
615
原创 obj = null; 赋值null之前没有其他引用指向obj对象,那么,当obj=null时,会被垃圾回收机制立即回收吗?
只是表示“该对象可回收了”,但什么时候回收,时间是不确定的,
2025-05-08 17:02:20
580
原创 事件的入门理解
event`关键字定义的事件会自动生成私有的“add”和“remove”访问器用于外部订阅(+=、-=等)(raise),这是一种封装机制,防止外部代码随意调用事件,保持了事件发布者对事件的控制权。但“raise”访问器(触发事件调用)是不公开的,只能在事件声明的类内部访问。`MyEvent`只能在`Publisher`类内部被调用(触发),这段代码在类外部订阅了事件,可以自由订阅,不受限制。事件的订阅者(Subscriber)在C#中,事件(event)1)事件的声明和触发限制。
2025-05-08 10:41:42
274
原创 为什么相机跟随逻辑在LateUpdate处理?
FixedUpdate(固定时间间隔) => Update(每帧) => LateUpdate(每帧最后)因为在Update中,目标可能还在移动中,如果在Update里更新相机位置,可能会造成画面抖动。在LateUpdate中,目标已经完成了当前帧的所有移动,相机跟随会更平滑。
2025-05-07 22:50:18
144
原创 为什么Update不受timeScale影响,但是加上了Time.deltaTime就被影响?
【代码】为什么Update不受timeScale影响,但是加上了Time.deltaTime就被影响?
2025-05-07 22:49:33
163
原创 public delegate void Action<in T>(T obj);这里in关键字的作用是什么?
in` 关键字是泛型中的协变(Covariance)修饰符。协变允许你使用比原始类型更具体的类型。简单来说,`in` 让泛型类型转换更宽松。- 不能将子类型的委托赋值给父类型的委托。- 允许将子类型的委托赋值给父类型的委托。- 委托类型必须完全匹配。- 提供更灵活的类型转换。
2025-05-07 09:21:28
218
原创 C#中不能通过new关键字创建实例的情况
6. 没有无参构造函数的类(如果要求必须使用特定参数的构造函数)- 抽象类、接口、静态类是最典型的不能new的类型。- 私有构造函数的类需要看是否提供了创建实例的方法。4. 带私有构造函数且没有提供创建实例方法的类。- 泛型类的实例化依赖于具体的类型参数。1. 抽象类(abstract)2. 接口(interface)5. 未指定具体类型的泛型类。
2025-05-06 14:06:19
413
原创 关键字sealed
sealed` 是一个重要的类型安全和性能优化关键字,- 防止类被继承、防止类被作为基类。- 提高性能(编译器可以进行优化)- 确保类的行为不被改变。- 防止方法被子类重写。- 不希望类被继承修改。2. 阻止方法被重写。- 明确类的设计意图。
2025-05-06 11:20:02
296
原创 水平布局组 (Horizontal Layout Group)
7)Child Force Expand(子对象强制展开)4)Reverse Arrangement(反向排列)3)Child Alignment(子对象对齐)1)Padding(内边距)2)Spacing(间距)
2025-04-29 17:38:22
342
原创 网格布局组 (Grid Layout Group)
6)Child Alignment(子对象对齐)4)Start Corner(起始角落)2) Cell Size(单元格大小)5)Start Axis(其实轴)7)Constraint(约束)3)Spacing(间距)
2025-04-29 14:07:23
250
原创 LitJson
序列化API:JsonMapper.ToJson(object);反序列化API:JsonMapper.ToObject<T>(string);注意:JsonMapper.ToObject(string);如果不指定转换类型结果是JsonData类型并非T类型!JsonType枚举值:JsonData操作:SetJsonType()必须使用的情况:不需要使用SetJsonType()的情况:记住:尽管直接赋值基本类型不需要SetJsonType(),但如果要创建对象或数组结构,SetJsonType
2025-04-23 16:07:32
438
原创 C#条件判断语句中分别有两个相同命名的var变量,表没问题但是读表后对var变量赋值,结果为null并且后续逻辑执行混乱
解决方案:将变量向上提取。
2025-04-23 14:28:30
404
原创 Canvas的3种渲染模式
Screen Space - Overlay (默认模式)UI可以被3D物体遮挡,取决于UI和3D物体与相机的距离。UI变成3D世界中的一个物体,完全遵循3D空间规则。UI永远显示在3D物体之上,不会被遮挡。
2025-04-22 19:50:41
163
原创 变量、数据、值类型&引用类型的存储方式
数据是实际存储的内容:对于值类型,数据直接存储在变量对应的栈内存位置。对于引用类型,数据存储在堆内存中,变量存储的是指向这个数据的地址。这就解释了为什么:值类型赋值会复制数据:因为是直接复制栈上的内容。引用类型赋值只复制地址:因为只是复制了指向堆内存的地址。修改引用类型时多个变量会看到同样的变化:因为它们指向同一个堆内存位置。
2025-04-08 16:46:37
446
原创 空值处理操作符
当值类型使用?可空操作符时,它依然是值类型,只是被包装成了结构体,并不会变成引用类型。内存分配值类型:直接在栈上分配可空值类型:在栈上分配,但有额外的标志位引用类型:在堆上分配,栈上存储引用性能特征值类型:最高性能略有性能开销引用类型:需要垃圾回收。
2025-04-07 17:13:50
280
原创 DOTween序列
/ 路径点改变时回调。.InsertCallback(2f, () => {}) // 在指定时间点插入回调。.OnStep(() => {}) // 每步更新时回调。.OnStepComplete(() => {}) // 每步完成时回调。.OnStart(() => {}) // 开始时回调。.OnComplete(() => {}) // 完成时回调。.OnKill(() => {}) // 销毁时回调。
2025-03-25 14:41:20
572
原创 C#闭包分析
C#闭包原理:编译器在背后生成了一个私有的密封类,它将外部变量包装成私有密封类的成员变量,而委托方法包装成私有密封类的方法。涉及到外部变量的地方都替换成了私有密封类的成员变量,所以,每次循环修改的始终是私有密封类的成员变量的值,那么调用委托时输出的自然都是相同的值了。捕获迭代变量:当捕获的外部变量为for循环(注意是for而不是foreach)的迭代变量时,C#认为变量i是定义在循环体外的。捕获变量:捕获的变量会在真正调用委托时“赋值”,而不是在捕获时“赋值”,即总是使用捕获变量的最新的值。
2025-02-28 11:22:53
325
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅