在 .Net 中关于 Dictionary (哈希表) 的一些细节
- 2024-12-01
- 98
- 0
- 2
- 37.8℃
本文详细解析了C#中`Dictionary`类的内部设计与实现原理。其底层采用“数组+链表”结构存储键值对,通过哈希值与容量取余确定索引,桶数组处理哈希冲突,理想情况下操作时间复杂度为O(1)。若哈希函数不合理导致所有冲突集中于同一桶,则退化为链表(O(n)),部分语言使用红黑树优化至O(log n)。
此外,文章探讨了`Dictionary`的扩容机制,由于涉及重新哈希与桶重建,建议预设初始容量以减少扩容开销。对于遍历性能,通过源码分析与基准测试对比直接遍历键值对与遍历值集合两种方式,结果显示两者在时间和内存分配上无明显差异,均通过迭代器直接访问内部数组实现,避免了额外内存分配。
[问题记录] 在 Unity 中使用 Animancer + Animation Rigging 出现权重随机重置的问题
本文解释了在Unity中使用Animancer插件结合Animation Rigging进行IK瞄准动画时,切换动画状态会导致Rigging参数重置为场景默认值的“鬼畜”问题。其根本原因是Animancer底层使用Playable API,在运行时切换状态或动态添加动画片段时会修改Playable Graph,进而触发Animator.Rebind(),强制重置相关参数。解决方案核心是防止Playable Graph被修改:一是设置`Animancer.Playable.KeepChildrenConnected = true`,避免状态切换时断开Playable连接;二是提前通过`Animancer.Play(ITransition)`初始化所有动画状态,防止进入新状态时修改Graph。目前尚无其他方法能在修改Playable Graph的同时避免触发Rebind。
Yarn 脚本语法指南 (编写中)
- 2024-05-25
- 349
- 0
- 10
- 78.9℃
Yarn 脚本是专用于 Yarn Spinner 进行用于游戏的对话内容脚本编写的一种脚本语言(具开发文档所言,是完备的编程语言),除了书写基础的对话文本内容内容之外,还拥有分支、函数和命令等功能。本文中,我们以程序向的角度,介绍该语言的基本语法和使用。
在 Unity 中安装和使用 Yarn Spinner
本文介绍了Yarn Spinner在Unity中的安装与使用方法。插件支持付费(Itch.io或Unity Asset Store)与免费(GitHub或通过OpenUPM注册表安装)两种方式,后者更灵活但需注意版本兼容性。核心部分解释了Yarn脚本(.yarn文件)、Yarn工程(用于管理脚本与本地化)及关键组件:Dialogue Runner(对话运行器)、Variable Storage(变量存储)和Line Provider(本地化文本提供者)。文章通过快速入门演示了创建脚本与工程、配置Dialogue Runner并运行对话的基本流程,并详细指导了如何定制对话UI,包括创建自定义Line View实现文本输出、通过按键/鼠标/按钮控制对话前进,以及使用Option List View和Option View构建选项系统,最终实现一个可完全自定义的对话界面。
解析Obj模型文件格式
- 2023-06-17
- 283
- 0
- 1
- 54.3℃
本文以 Blender 导出的立方体模型为例,系统解析了 OBJ 三维模型文件格式的结构与数据构成。文章首先指出 OBJ 是一种开源的纯文本模型规范,并通过立方体文件展示了其包含的顶点、法向、纹理坐标与面的定义方式。具体介绍了模型中的各类标记:注释(“#”)、材质库链接(“mtllib”)、网格对象(“o”)、顶点坐标(“v”)、法向量(“vn”)、纹理坐标(“vt”)、平滑组(“s”)及面的索引组织(“f”)。文中还提及了关联的 MTL 材质文件,简要说明了材质参数(如环境光、漫反射、镜面反射等)对模型渲染效果的影响。整体上,文章以实例结合图示,清晰说明了 OBJ 格式如何通过文本数据描述三维模型的几何与外观信息。