- 博客(32)
- 收藏
- 关注
原创 变量、数据、值类型&引用类型的存储方式
数据是实际存储的内容:对于值类型,数据直接存储在变量对应的栈内存位置。对于引用类型,数据存储在堆内存中,变量存储的是指向这个数据的地址。这就解释了为什么:值类型赋值会复制数据:因为是直接复制栈上的内容。引用类型赋值只复制地址:因为只是复制了指向堆内存的地址。修改引用类型时多个变量会看到同样的变化:因为它们指向同一个堆内存位置。
2025-04-08 16:46:37
307
原创 空值处理操作符
当值类型使用?可空操作符时,它依然是值类型,只是被包装成了结构体,并不会变成引用类型。内存分配值类型:直接在栈上分配可空值类型:在栈上分配,但有额外的标志位引用类型:在堆上分配,栈上存储引用性能特征值类型:最高性能略有性能开销引用类型:需要垃圾回收。
2025-04-07 17:13:50
189
原创 DOTween序列
/ 路径点改变时回调。.InsertCallback(2f, () => {}) // 在指定时间点插入回调。.OnStep(() => {}) // 每步更新时回调。.OnStepComplete(() => {}) // 每步完成时回调。.OnStart(() => {}) // 开始时回调。.OnComplete(() => {}) // 完成时回调。.OnKill(() => {}) // 销毁时回调。
2025-03-25 14:41:20
313
原创 QFramework笔记
其中,"Register"方法是将一个回调函数注册到BindableProperty对象上,当BindableProperty的值发生改变时,这个回调函数会被触发,并且会接收到新的值作为参数。BindableProperty是QFramework的核心组件之一,它实现了数据绑定的功能,可以将UI控件的属性和ViewModel的属性进行绑定。在这种模式下,可以通过将UI控件的属性与ViewModel中的属性进行绑定,当属性值发生变化时,即可实现数据的双向传递。前者接收的是新的值,后者接收的是初始的旧值。
2025-03-03 16:06:38
247
原创 C#闭包分析
C#闭包原理:编译器在背后生成了一个私有的密封类,它将外部变量包装成私有密封类的成员变量,而委托方法包装成私有密封类的方法。涉及到外部变量的地方都替换成了私有密封类的成员变量,所以,每次循环修改的始终是私有密封类的成员变量的值,那么调用委托时输出的自然都是相同的值了。捕获迭代变量:当捕获的外部变量为for循环(注意是for而不是foreach)的迭代变量时,C#认为变量i是定义在循环体外的。捕获变量:捕获的变量会在真正调用委托时“赋值”,而不是在捕获时“赋值”,即总是使用捕获变量的最新的值。
2025-02-28 11:22:53
134
原创 事件、委托与回调
事件是一种用于在对象之间进行通信的方法,它允许一个对象通知其他对象某个事件发生。事件通常包含一个方法,当事件发生时,该方法会被调用。事件可以有一个或多个订阅者,订阅者可以在事件发生时执行相应的操作。:委托是一种表示方法指针的类型,它可以将方法作为参数传递给其他方法。委托可以看作是一种特殊的函数指针,它可以用来封装方法,以便在需要时调用。:回调是一种在特定事件发生时由另一个对象调用的方法。回调函数通常作为参数传递给事件处理程序,当事件发生时,回调函数会被自动调用。方法作为事件的处理方法。
2024-01-12 11:45:35
742
1
原创 关键字ref、out、in的区别
初始化要求1)ref:必须初始化2)out:不需要初始化3)in:必须初始化方法内部行为1)ref:可读可写2)out:必须写(赋值)3)in:只读使用场景1)ref:需要在方法内修改参数值时2)out:需要返回多个值时3)in:传递大型结构体提升性能时。
2023-12-22 20:27:58
890
原创 C#反射的理解
C#反射(Reflection)是.NET Framework中提供的一种机制,它允许程序在运行时获取关于程序及其元素(如类、接口、枚举、属性、方法、参数等)的类型信息,并能动态创建实例,调用方法和访问字段。C#反射是一种在运行时检查和操作程序集、类型、成员等的技术。通过反射,可以在运行时获取类的信息,如属性、方法、事件等,并动态地调用它们。:通过反射,我们可以获取到类型的信息,包括类名、方法名、属性名、参数类型等。示例1是一个简单的C#反射示例,该示例展示了如何使用反射获取类的信息和方法。
2023-12-20 21:47:28
362
原创 使用ScriptableAsset加载数据
注意:ScriptableAsset不能在编辑器以外进行修改,可以在游戏运行前在Unity中部署数据,运行后的游戏不能使用ScriptableAsset来保存修改后的数据!我们经常用Json、CSV等文件为数据做初始化,我们也可以使用Unity中自带的ScriptableAsset类实现这一流程。在Unity中就可以右键Create这个资产数据啦!
2023-12-11 19:29:26
405
1
原创 游戏时间轴
时间数据类、单例类、时间操作类型枚举、时间处理键枚举(时间对象管理的数据结构选用字典)委托(Action带不带参数取决于具体操作)时间轴用于实现游戏中时间延迟、循环的操作。延迟时间的次数(int)延迟时间(float)时间操作类型(枚举)开始时间(long)3、时间操作类型枚举、时间处理键枚举。创建空物体,挂载到空物体上。
2023-12-04 10:51:48
656
原创 带描边雷达图的另一种思路
Pink游戏对象脚本中的关联脚本为Green脚本,通过调用Green脚本中封装好的方法(本案例中为ChangeValue方法)给Green脚本中的集合传值,因为当Pink的Scale缩放改变时,Green的Scale缩放也要进行相同的改变方能实现描边效果。每个游戏对象身上的RectTransform组件中的Scale缩放不同,实现层级效果。颜色单词对应上面雷达图底图颜色和相应游戏对象身上的脚本名称。Green中的Board字段为描边用线的线宽。脚本中的Num字段为多边形的边数。
2023-10-26 16:19:41
112
原创 SkinnedMeshRenderer 和 MeshRenderer 区别
MeshRenderer 用于渲染静态的、不带有骨骼动画的模型,而 SkinnedMeshRenderer 用于渲染带有骨骼动画的模型并支持模型的网格变形。SkinnedMeshRenderer:SkinnedMeshRenderer 适用于带有骨骼动画的模型,通常用于角色模型和其他需要变形的模型。SkinnedMeshRenderer:SkinnedMeshRenderer 可以通过关联的骨骼进行网格的变形,使模型实现各种形状的变化,例如角色的动画。
2023-10-25 09:36:53
997
1
原创 2D轮转图实现蒙皮、骨骼换装
首先是2D轮转图与蒙皮脚本的关联,下面代码中的changeAvator.Change()方法。首先你要会2D轮转图。
2023-10-24 20:28:31
286
原创 GetComponentsInChildren与GetComponentInChildren区别
获取对应组件,按层级返回最先包含的对应组件(获取对应组件,返回对应组件的数组(范围:从自己开始直到子子孙孙。范围:从自己开始直到子子孙孙。激活、失活无关,失活的。激活、失活无关,失活的。
2023-10-24 15:00:50
949
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人