整理笔记 2025.6.20
This commit is contained in:
94
.obsidian/workspace.json
vendored
94
.obsidian/workspace.json
vendored
@@ -4,39 +4,24 @@
|
|||||||
"type": "split",
|
"type": "split",
|
||||||
"children": [
|
"children": [
|
||||||
{
|
{
|
||||||
"id": "1890c7ad64a39d65",
|
"id": "023535fd6fa2e67d",
|
||||||
"type": "tabs",
|
"type": "tabs",
|
||||||
"children": [
|
"children": [
|
||||||
{
|
{
|
||||||
"id": "3e6f0931816b44e6",
|
"id": "c3a1fa114f02064b",
|
||||||
"type": "leaf",
|
"type": "leaf",
|
||||||
"state": {
|
"state": {
|
||||||
"type": "markdown",
|
"type": "markdown",
|
||||||
"state": {
|
"state": {
|
||||||
"file": "1Project/开发文章/将开发文章阅读并分类.md",
|
"file": "1Project/宠物宇宙/地图编辑器/需要支持的地图功能.md",
|
||||||
"mode": "source",
|
"mode": "source",
|
||||||
"source": false
|
"source": false
|
||||||
},
|
},
|
||||||
"icon": "lucide-file",
|
"icon": "lucide-file",
|
||||||
"title": "将开发文章阅读并分类"
|
"title": "需要支持的地图功能"
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "e0316e2f70484fe5",
|
|
||||||
"type": "leaf",
|
|
||||||
"state": {
|
|
||||||
"type": "markdown",
|
|
||||||
"state": {
|
|
||||||
"file": "3Projects/Unity/loxodon/loxodon-framework Public.md",
|
|
||||||
"mode": "source",
|
|
||||||
"source": false
|
|
||||||
},
|
|
||||||
"icon": "lucide-file",
|
|
||||||
"title": "loxodon-framework Public"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
]
|
||||||
"currentTab": 1
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"direction": "vertical"
|
"direction": "vertical"
|
||||||
@@ -229,51 +214,52 @@
|
|||||||
"copilot:Open Copilot Chat": false
|
"copilot:Open Copilot Chat": false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"active": "4c191f6555b427bd",
|
"active": "c3a1fa114f02064b",
|
||||||
"lastOpenFiles": [
|
"lastOpenFiles": [
|
||||||
"1Project/战斗",
|
"1Project/11/最近需要处理的事情.md",
|
||||||
"1Project/开发文章/将开发文章阅读并分类.md",
|
|
||||||
"1Project/宠物宇宙/地图编辑器/需要做的优化.md",
|
|
||||||
"1Project/宠物宇宙/地图编辑器/地图工作流.canvas",
|
|
||||||
"1Project/宠物宇宙/地图编辑器/需要支持的地图功能.md",
|
"1Project/宠物宇宙/地图编辑器/需要支持的地图功能.md",
|
||||||
"1Project/宠物宇宙/版本需求.md",
|
"1Project/11",
|
||||||
|
"1Project/宠物宇宙/地图编辑器/需要做的优化.md",
|
||||||
|
"1Project/战斗编辑器/随想/各个动作组件优劣.md",
|
||||||
|
"1Project/战斗编辑器/随想/动作时间轴 随想.canvas",
|
||||||
|
"1Project/战斗编辑器/参考文章/战斗系统 - 3C相关.md",
|
||||||
|
"1Project/战斗编辑器/随想",
|
||||||
|
"1Project/战斗编辑器/参考文章/游戏知识学习——【战斗系统】.md",
|
||||||
"1Project/战斗编辑器/参考文章/如何实现一个强大的MMO技能系统——BUFF.md",
|
"1Project/战斗编辑器/参考文章/如何实现一个强大的MMO技能系统——BUFF.md",
|
||||||
"1Project/战斗编辑器/参考文章",
|
"1Project/战斗编辑器/参考文章/独立游戏-万字解析游戏战斗系统开发.md",
|
||||||
"1Project/战斗编辑器",
|
"1Project/战斗编辑器/参考文章/还需要做的事.md",
|
||||||
"3Projects/UE/UE-CORE-002 TickTaskManager.md",
|
"2Areas/开发感悟/管道模式/管道模式.md",
|
||||||
"3Projects/Unity/Log插件/Log插件.md",
|
"2Areas/开发感悟/依赖环节的流程管线.md",
|
||||||
"3Projects/UE",
|
"2Areas/开发感悟/接口与抽象类区别.md",
|
||||||
"3Projects/Unity/loxodon/loxodon-framework Public.md",
|
|
||||||
"3Projects/Unity/Log插件",
|
|
||||||
"1Project/宠物宇宙/硬件交互/用户卡及游戏信息处理过程设计文档.md",
|
"1Project/宠物宇宙/硬件交互/用户卡及游戏信息处理过程设计文档.md",
|
||||||
"1Project/宠物宇宙/硬件交互/业务插件(RTwoGameBusiness)TCP接口设计说明.md",
|
"1Project/宠物宇宙/硬件交互/业务插件(RTwoGameBusiness)TCP接口设计说明.md",
|
||||||
"2Areas/哲学/目的论与原因论.md",
|
"2Areas/开发感悟/管道模式/未命名.canvas",
|
||||||
"2Areas/哲学/他者贡献.md",
|
"2Areas/开发感悟/管道模式",
|
||||||
"2Areas/哲学",
|
"1Project/网络/封装可扩展网络请求框架.md",
|
||||||
"InBox/loxodon-framework.md",
|
"2Areas/开发感悟",
|
||||||
"3Projects/Unity/loxodon",
|
|
||||||
"3Projects/Unity",
|
|
||||||
"3Projects",
|
|
||||||
"InBox/网络同步.md",
|
|
||||||
"InBox/obsidian右键扩展.md",
|
|
||||||
"InBox/接口与抽象类区别.md",
|
|
||||||
"InBox/【Unity插件 - 图标轮廓渲染插件 SDF Image - Quality UI Outlines and Shadow-哔哩哔哩】.md",
|
"InBox/【Unity插件 - 图标轮廓渲染插件 SDF Image - Quality UI Outlines and Shadow-哔哩哔哩】.md",
|
||||||
"InBox/资源/资源导入.md",
|
"InBox/架构腐化之谜.md",
|
||||||
|
"3Resources/游戏开发/帧同步总结.md",
|
||||||
|
"3Resources/游戏开发/loxodon/loxodon-framework Public.md",
|
||||||
|
"3Resources/游戏开发",
|
||||||
|
"InBox/loxodon-framework.md",
|
||||||
|
"InBox/obsidian右键扩展.md",
|
||||||
|
"1Project/宠物宇宙/版本需求.md",
|
||||||
|
"1Project/开发文章/将开发文章阅读并分类.md",
|
||||||
|
"2Areas/哲学与心理/打球不敢往里突的人,球技很难增长,人生亦如此.md",
|
||||||
|
"2Areas/心理/未命名.md",
|
||||||
|
"2Areas/心理",
|
||||||
|
"2Areas/哲学/未命名.md",
|
||||||
|
"1Project/战斗",
|
||||||
|
"1Project/宠物宇宙/地图编辑器/地图工作流.canvas",
|
||||||
|
"1Project/战斗编辑器/参考文章",
|
||||||
|
"1Project/战斗编辑器",
|
||||||
|
"3Resources/UE",
|
||||||
"InBox/编辑器/时间轴编辑器/Timeline TODO.canvas",
|
"InBox/编辑器/时间轴编辑器/Timeline TODO.canvas",
|
||||||
"InBox/编辑器/图片/Pasted image 20221025121100.png",
|
"InBox/编辑器/图片/Pasted image 20221025121100.png",
|
||||||
"InBox/GAS",
|
|
||||||
"1Project/宠物宇宙/bug.md",
|
|
||||||
"1Project/宠物宇宙/未命名 1",
|
|
||||||
"渲染/软渲染/图片/业务插件(RTwoGameBusiness)TCP接口设计说明.md",
|
|
||||||
"InBox/网络/封装可扩展网络请求框架.md",
|
|
||||||
"2Areas/提升效率/未命名.md",
|
|
||||||
"渲染/软渲染/图片/img_v3_02n6_ff40a1a4-d813-45f7-b132-6f14a74cfd7g.jpg",
|
"渲染/软渲染/图片/img_v3_02n6_ff40a1a4-d813-45f7-b132-6f14a74cfd7g.jpg",
|
||||||
"InBox/自动化生成文档/uml.md",
|
|
||||||
"InBox/自动化生成文档/docfx.md",
|
|
||||||
"InBox/战斗/输入框架/游戏输入框架的设计(基于Unity).md",
|
|
||||||
"InBox/TODO.canvas",
|
"InBox/TODO.canvas",
|
||||||
"渲染/软渲染/图片/Pasted image 20250609171235.png",
|
"渲染/软渲染/图片/Pasted image 20250609171235.png",
|
||||||
"InBox/战斗/动作时间轴 随想.canvas",
|
|
||||||
"InBox/渲染/GPU/Pasted image 20230413163234.png",
|
"InBox/渲染/GPU/Pasted image 20230413163234.png",
|
||||||
"InBox/Mesh/图片/Pasted image 20221021171104.png",
|
"InBox/Mesh/图片/Pasted image 20221021171104.png",
|
||||||
"InBox/渲染/软渲染/图片/Pasted image 20230613102109.png",
|
"InBox/渲染/软渲染/图片/Pasted image 20230613102109.png",
|
||||||
|
|||||||
@@ -45,5 +45,3 @@
|
|||||||
需要清晰的关系以及生命周期
|
需要清晰的关系以及生命周期
|
||||||
###### MapBlock和RoomBase
|
###### MapBlock和RoomBase
|
||||||
二者相互引用且耦合
|
二者相互引用且耦合
|
||||||
|
|
||||||
###### 先抽象工作流,在开始构建管道
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
- UI名字
|
- UI名字
|
||||||
- [x] C:\Users\1\Desktop\cache\皮肤
|
- [x] C:\Users\1\Desktop\cache\皮肤
|
||||||
- [x] 枪械宠物UI导入
|
- [x] 枪械宠物UI导入
|
||||||
- [ ] 测试网络点数 开机检测
|
- [x] 测试网络点数 开机检测
|
||||||
- [x] 地图编辑器 [[需要支持的地图功能]]
|
- [x] 地图编辑器 [[需要支持的地图功能]]
|
||||||
- [x] Boss立绘
|
- [x] Boss立绘
|
||||||
- [x] C:\Users\1\Desktop\cache\雷鸟血条UI
|
- [x] C:\Users\1\Desktop\cache\雷鸟血条UI
|
||||||
|
|||||||
9
1Project/战斗编辑器/随想/动作时间轴 随想.canvas
Normal file
9
1Project/战斗编辑器/随想/动作时间轴 随想.canvas
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"nodes":[
|
||||||
|
{"id":"61edc211325da480","type":"text","text":"动作时间轴","x":-1206,"y":2853,"width":906,"height":60,"color":"4"},
|
||||||
|
{"id":"a7f14817e1497be2","type":"text","text":"不可打断","x":-1206,"y":2940,"width":586,"height":60,"color":"6"},
|
||||||
|
{"id":"e8d1678f431e2ee0","type":"text","text":"缓存输入","x":-870,"y":3020,"width":250,"height":60,"color":"6"},
|
||||||
|
{"id":"8fc0985df93fdde7","type":"text","text":"可切换的后摇","x":-620,"y":3020,"width":320,"height":60,"color":"6"}
|
||||||
|
],
|
||||||
|
"edges":[]
|
||||||
|
}
|
||||||
30
1Project/战斗编辑器/随想/各个动作组件优劣.md
Normal file
30
1Project/战斗编辑器/随想/各个动作组件优劣.md
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### Animator
|
||||||
|
- 优势
|
||||||
|
- Unity原生支持
|
||||||
|
- 劣势
|
||||||
|
- 源码黑盒
|
||||||
|
- 不可编辑帧事件
|
||||||
|
- 意味着不可编辑打击感,不可编辑运动方向位移
|
||||||
|
- 帧事件可能被跳过的bug
|
||||||
|
- 混合也在黑盒里
|
||||||
|
|
||||||
|
|
||||||
|
### Timeline
|
||||||
|
- 优势
|
||||||
|
- 自定义Track Clip Behaviour
|
||||||
|
- Clip可以支持Inspector
|
||||||
|
- 自定义混合
|
||||||
|
- 劣势
|
||||||
|
- Inspector不可编辑某一帧的事件
|
||||||
|
- 没有Animator的状态可视化切换,需要所有切换动作都在代码中写
|
||||||
|
|
||||||
|
|
||||||
|
### AnimacerComponent
|
||||||
|
- 优势
|
||||||
|
- 劣势
|
||||||
|
|
||||||
|
|
||||||
|
### 自定义Playable动作系统
|
||||||
6
2Areas/哲学与心理/打球不敢往里突的人,球技很难增长,人生亦如此.md
Normal file
6
2Areas/哲学与心理/打球不敢往里突的人,球技很难增长,人生亦如此.md
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
|
||||||
|
恐惧的原因
|
||||||
|
|
||||||
|
为何形成
|
||||||
|
|
||||||
|
应该怎么做
|
||||||
16
2Areas/开发感悟/依赖环节的流程管线.md
Normal file
16
2Areas/开发感悟/依赖环节的流程管线.md
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
|
||||||
|
|
||||||
|
### 调试和测试的便捷性问题
|
||||||
|
- 大部分场景美术的跑测需求是无需任何game play元素
|
||||||
|
- A角色的B技能MotionBlur存在异常,他需要在真实的游戏场景中观察某个角色释放某个技能观察MotionBlur是否符合预期
|
||||||
|
- 负责3C的QA希望单次测试只加载3C相关的游戏子系统,任何与之无关的子系统都是关闭状态以提高游戏加载和运行速度,以提高测试效率
|
||||||
|
|
||||||
|
### 在宠物宇宙中的例子F9
|
||||||
|
- 数据端插入了测试模式的变量以及模拟了一批玩家数据
|
||||||
|
- 下个环节根据测试模式的变量和这些玩家数据进行
|
||||||
|
|
||||||
|
|
||||||
|
### 思考,如何抽象出来
|
||||||
|
- 流程[[管道模式]]
|
||||||
|
- 每个流程都能热插拔
|
||||||
|
- 当获取流程所需要的数据为空的时候,在else方法中应该从IOC里面获取测试的对象
|
||||||
6
2Areas/开发感悟/接口与抽象类区别.md
Normal file
6
2Areas/开发感悟/接口与抽象类区别.md
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
|
||||||
|
#### 接口不指定构造函数
|
||||||
|
抽象类可以统一用反射来构造函数 接口不可以
|
||||||
|
|
||||||
|
#### 时机
|
||||||
|
需要反射构造函数的时候需要用抽象类
|
||||||
18
2Areas/开发感悟/管道模式/管道模式.md
Normal file
18
2Areas/开发感悟/管道模式/管道模式.md
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
---
|
||||||
|
tags:
|
||||||
|
- 设计模式
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
``` csharp
|
||||||
|
public class Seq<T>{
|
||||||
|
public Command<T>[] cmds;
|
||||||
|
public T Context;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
``` csharp
|
||||||
|
public class Command<T>{
|
||||||
|
public void Excute(T context){}
|
||||||
|
}
|
||||||
|
```
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
|
|
||||||
|
|
||||||
Source:[loxodon-framework/Loxodon.Framework.TextUGUI at master · vovgou/loxodon-framework · GitHub](https://github.com/vovgou/loxodon-framework/tree/master/Loxodon.Framework.TextUGUI)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
|
|
||||||
单向绑定
|
|
||||||
``` csharp
|
|
||||||
[OnValueChanged(viewModel=>viewModel.hp, value=>string.Format("{0:D4}"))]
|
|
||||||
CustomText text;
|
|
||||||
|
|
||||||
public class CustomText
|
|
||||||
{
|
|
||||||
public Text text;
|
|
||||||
public void SetText(string str)
|
|
||||||
{
|
|
||||||
text.text = str;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
deepseek扩展:
|
|
||||||
[DeepSeek - 探索未至之境](https://chat.deepseek.com/a/chat/s/a42c8fe7-2dd9-44a4-9854-e1ec34f3e2cf)
|
|
||||||
148
3Resources/游戏开发/帧同步总结.md
Normal file
148
3Resources/游戏开发/帧同步总结.md
Normal file
@@ -0,0 +1,148 @@
|
|||||||
|
## 一、逻辑与表现分离
|
||||||
|
|
||||||
|
①、逻辑层仅处理数据,准备好用于渲染的数据。
|
||||||
|
|
||||||
|
②、表现层对已有的数据,进行插值表现,且不会改动数据。
|
||||||
|
|
||||||
|
③、两者的帧率可以不同。
|
||||||
|
|
||||||
|
## 二、时间相关
|
||||||
|
|
||||||
|
①、客户端通过Ping包方式预测服务器的战斗时间。
|
||||||
|
|
||||||
|
②、RTT计算方式,发一个Ping包,包含发送时的本地时间戳,服务器接收到以后,返回这个时间,客户端接收到后,用最新的本地时间戳减去这个时间,就可以得到RTT。
|
||||||
|
|
||||||
|
③、RTT计算时,服务器还会返回一个服务器的战斗时间,取最低RTT的一半,加上服务器返回的战斗时间,即可以估算为战斗时间。
|
||||||
|
|
||||||
|
④、多次模拟,越来越接近服务器的战斗时间。
|
||||||
|
|
||||||
|
## 三、预输入
|
||||||
|
|
||||||
|
①、非锁步同步中,客户端先于服务器运行,比如快个3帧。
|
||||||
|
|
||||||
|
②、理想状态下,服务器因为有收包缓冲在,每帧都能收到每个客户端的输入。
|
||||||
|
|
||||||
|
③、但网络延迟高时,客户端发送的输入,可能超过了服务器的收包缓冲。
|
||||||
|
|
||||||
|
④、所以基于RTT的计算,在延迟高时:
|
||||||
|
|
||||||
|
客户端会增大预输入的帧数,比如原本发送超过服务器3帧的输入,改成6帧。
|
||||||
|
|
||||||
|
服务器也会增大收包缓冲,在收到最新的同帧号输入时,会替换之前的输入。
|
||||||
|
|
||||||
|
缓冲可以动态调整。
|
||||||
|
|
||||||
|
⑤、一般预输入只处理预测失败概率低的操作,比如持续移动。
|
||||||
|
|
||||||
|
⑥、客户端冗余发送
|
||||||
|
|
||||||
|
## 四、预测
|
||||||
|
|
||||||
|
①、客户端先行于服务器,所以需要预测其他客户端的行为。
|
||||||
|
|
||||||
|
②、一般基于连续输入原则,比如连续的移动输入等。
|
||||||
|
|
||||||
|
③、对于高敏感操作,一般不进行预测。
|
||||||
|
|
||||||
|
## 五、回滚
|
||||||
|
|
||||||
|
①、在本地帧输入数据与服务器发送过来的帧输入不一致时,发生回滚。
|
||||||
|
|
||||||
|
②、找到最近可用的快照,进行推进。
|
||||||
|
|
||||||
|
③、逻辑层回滚技巧:
|
||||||
|
|
||||||
|
基于帧索引的可序列化数据,比如随机数状态,属性等。
|
||||||
|
|
||||||
|
针对于大型的,序列化成本较高的数据,可记录每帧变动的指令,在回滚时,逐帧逐条回滚这些指令。
|
||||||
|
|
||||||
|
④、表现层回滚技巧:
|
||||||
|
|
||||||
|
表现层一般设计为可插值,而非多帧状态累加。
|
||||||
|
|
||||||
|
有一些效果,可等到逻辑帧确认后再表现。
|
||||||
|
|
||||||
|
插值回滚,而不是瞬间表现到位。
|
||||||
|
|
||||||
|
⑤、ECS回滚参考:
|
||||||
|
|
||||||
|
Entity/Component不增删时,拷贝整个Entity/Component的数据块。
|
||||||
|
|
||||||
|
Entity删除时,可标记为禁用,等确定不回滚后再删除,增加时,操作记录回退。
|
||||||
|
|
||||||
|
Component增删时,操作记录回退。
|
||||||
|
|
||||||
|
## 六、追帧
|
||||||
|
|
||||||
|
①、落后太多时,可选择最近目标帧的快照进行处理。
|
||||||
|
|
||||||
|
②、一般会设置当前帧可用于追帧的时间,避免追帧卡顿。
|
||||||
|
|
||||||
|
## 七、快照
|
||||||
|
|
||||||
|
①、较大的间隔生成全量快照,比如1秒。
|
||||||
|
|
||||||
|
②、较小的间隔生成增量快照,记录基于全量快照的变动。
|
||||||
|
|
||||||
|
③、OOP中,一般通过标签,或者内建数据结构类实现序列化、反序列化、数据变动记录。
|
||||||
|
|
||||||
|
④、ECS中,一般关注Entity数量、Component数量和数据即可。
|
||||||
|
|
||||||
|
⑤、序列化一般使用自定义二进制,且数据一般为整数,如果对大小有要求,可以参考整数压缩方案。
|
||||||
|
|
||||||
|
## 八、日志
|
||||||
|
|
||||||
|
①、常规日志,比如输入,行为,随机数,属性等。
|
||||||
|
|
||||||
|
②、自动日志,大致实现思路:
|
||||||
|
|
||||||
|
遍历所有涉及逻辑的代码文件,通过正则表达式,查找到所有的有值类型参数的方法。
|
||||||
|
|
||||||
|
生成记录代码,包括宏开关,记录方法ID(方法名经过映射后的ID),参数数量,每个参数大小的代码和记录值的泛型接口代码。
|
||||||
|
|
||||||
|
③、哈希相关:
|
||||||
|
|
||||||
|
每次记录可算哈希,每帧可算哈希,多帧哈希可叠加。
|
||||||
|
|
||||||
|
哈希计算是可能会有冲突的,尽可能的降低计算成本与哈希冲突。
|
||||||
|
|
||||||
|
④、不一致定位,定位哈希不同的帧和定位同帧下的不同步点。
|
||||||
|
|
||||||
|
## 九、不同步
|
||||||
|
|
||||||
|
①、基于日志定位。
|
||||||
|
|
||||||
|
②、可能的原因:
|
||||||
|
|
||||||
|
使用了浮点数相关的模块,比如内置数学API、物理模拟、动作、自定义库等。
|
||||||
|
|
||||||
|
使用了字典,遍历顺序不一致。
|
||||||
|
|
||||||
|
多线程操作数据先后,执行结果处理先后。
|
||||||
|
|
||||||
|
“我”的开发角度,使得逻辑倾向于其中一方。
|
||||||
|
|
||||||
|
工具类、单例类有未纳入序列化的数据。
|
||||||
|
|
||||||
|
## 十、定点数
|
||||||
|
①、选择合适精度,这涉及计算性能与内存开销。
|
||||||
|
|
||||||
|
②、开方,快速近似查表代替循环。
|
||||||
|
|
||||||
|
③、反三角函数,查表代替泰勒展开(循环)。
|
||||||
|
|
||||||
|
## 十一、多世界
|
||||||
|
|
||||||
|
①、尽量不要使用有状态(数据)的单例类。
|
||||||
|
|
||||||
|
②、可以存在无状态(数据)的静态类,工具类,辅助类等。
|
||||||
|
|
||||||
|
## 十二、其他
|
||||||
|
|
||||||
|
①、帧同步中,没有秒的概念,只有帧的概念,秒的相关数据都需要转换成帧。
|
||||||
|
|
||||||
|
②、逻辑帧中的延迟模块,一定是由逻辑帧去轮询,比如自定义协程、延迟模块等。
|
||||||
|
|
||||||
|
③、客户端和服务器都有帧缓冲,客户端快照也会有缓冲,以减少内存使用。
|
||||||
|
|
||||||
|
④、预测帧数高时,预输入帧数可对应降低。
|
||||||
@@ -1,260 +0,0 @@
|
|||||||
在Obsidian中,右键菜单(上下文菜单)可以通过插件进行扩展。如果你想要在文本格式的右键菜单中添加自定义操作,你需要编写一个Obsidian插件。以下是一个简单的步骤指南,帮助你开始:
|
|
||||||
|
|
||||||
### 步骤1: 创建插件项目
|
|
||||||
|
|
||||||
1. 打开Obsidian,进入设置 -> 社区插件 -> 浏览,然后搜索并安装“Obsidian Plugin DevTools”插件(如果尚未安装)。
|
|
||||||
|
|
||||||
2. 使用该插件可以快速生成插件模板:在命令面板中运行“Create new plugin”命令。
|
|
||||||
|
|
||||||
### 步骤2: 理解插件结构
|
|
||||||
|
|
||||||
生成的插件项目包含以下关键文件:
|
|
||||||
|
|
||||||
- `main.ts`: 插件的入口文件。
|
|
||||||
|
|
||||||
- `manifest.json`: 插件的元数据,如ID、名称、版本等。
|
|
||||||
|
|
||||||
### 步骤3: 添加上下文菜单项
|
|
||||||
|
|
||||||
在`main.ts`中,你可以使用`registerEvent`来监听编辑器上下文菜单事件,并添加自定义菜单项。
|
|
||||||
|
|
||||||
以下是一个示例代码,展示如何在右键菜单中添加一个自定义菜单项:
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
|
|
||||||
import { App, Editor, Menu, Plugin, PluginManifest } from 'obsidian';
|
|
||||||
|
|
||||||
export default class MyPlugin extends Plugin {
|
|
||||||
|
|
||||||
constructor(app: App, manifest: PluginManifest) {
|
|
||||||
|
|
||||||
super(app, manifest);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
async onload() {
|
|
||||||
|
|
||||||
// 注册编辑器上下文菜单
|
|
||||||
|
|
||||||
this.registerEvent(
|
|
||||||
|
|
||||||
this.app.workspace.on('editor-menu', (menu: Menu, editor: Editor, view: any) => {
|
|
||||||
|
|
||||||
// 添加一个菜单项
|
|
||||||
|
|
||||||
menu.addItem((item) => {
|
|
||||||
|
|
||||||
item
|
|
||||||
|
|
||||||
.setTitle("我的操作")
|
|
||||||
|
|
||||||
.setIcon("document") // 可选:设置图标
|
|
||||||
|
|
||||||
.onClick(async () => {
|
|
||||||
|
|
||||||
// 当点击菜单项时执行的操作
|
|
||||||
|
|
||||||
const selectedText = editor.getSelection();
|
|
||||||
|
|
||||||
// 示例:将选中的文本转换为大写
|
|
||||||
|
|
||||||
if (selectedText) {
|
|
||||||
|
|
||||||
editor.replaceSelection(selectedText.toUpperCase());
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
// 如果没有选中文本,可以在光标处插入文本
|
|
||||||
|
|
||||||
editor.replaceRange("Hello World!", editor.getCursor());
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
onunload() {
|
|
||||||
|
|
||||||
// 清理工作
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
### 步骤4: 测试插件
|
|
||||||
|
|
||||||
1. 将你的插件文件夹放在`.obsidian/plugins/`目录下(如果没有该目录,可以手动创建)。
|
|
||||||
|
|
||||||
2. 在Obsidian的设置 -> 社区插件中,启用你的插件。
|
|
||||||
|
|
||||||
3. 打开一个笔记,选中一些文本,然后右键单击,你应该能看到“我的操作”菜单项。点击它,选中的文本应该会变成大写。
|
|
||||||
|
|
||||||
### 步骤5: 完善功能
|
|
||||||
|
|
||||||
根据你的需求,你可以修改点击事件的处理逻辑。例如,你可以添加更复杂的文本操作,如插入特定格式的文本、调用外部API等。
|
|
||||||
|
|
||||||
### 步骤6: 发布插件(可选)
|
|
||||||
|
|
||||||
如果你希望分享你的插件,可以将其发布到Obsidian的社区插件市场。你需要将代码托管在GitHub上,并按照Obsidian的发布指南操作。
|
|
||||||
|
|
||||||
### 注意事项:
|
|
||||||
|
|
||||||
- Obsidian的API可能会随着版本更新而变化,请关注官方文档:https://obsidian.md/developers
|
|
||||||
|
|
||||||
- 在编写插件时,请确保处理各种边界情况(如没有选中文本的情况)。
|
|
||||||
|
|
||||||
如果你需要更复杂的操作,比如添加多个菜单项,或者根据条件显示不同的菜单项,可以在`editor-menu`事件回调中添加多个`menu.addItem`调用,并在回调函数中编写相应的逻辑。
|
|
||||||
|
|
||||||
希望这能帮助你在Obsidian中添加自定义的右键菜单操作!
|
|
||||||
|
|
||||||
要在 Obsidian 的右键菜单中添加自定义文本操作,可以通过以下两种主要方法实现(推荐使用插件开发):
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 方法 1:使用现成插件(推荐新手)
|
|
||||||
|
|
||||||
安装以下社区插件可快速添加文本操作:
|
|
||||||
|
|
||||||
1. **QuickAdd**
|
|
||||||
|
|
||||||
- 创建自定义脚本/命令并绑定到右键菜单
|
|
||||||
|
|
||||||
2. **cMenu**
|
|
||||||
|
|
||||||
- 直接添加格式化按钮到右键菜单
|
|
||||||
|
|
||||||
3. **Context Menu Extended**
|
|
||||||
|
|
||||||
- 扩展右键菜单选项
|
|
||||||
|
|
||||||
|
|
||||||
**操作步骤**:
|
|
||||||
|
|
||||||
1. 设置 → 社区插件 → 浏览 → 搜索插件名 → 安装并启用
|
|
||||||
|
|
||||||
2. 根据插件文档配置自定义操作(如用 QuickAdd 添加脚本)
|
|
||||||
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 方法 2:开发自定义插件(高阶)
|
|
||||||
|
|
||||||
若需深度自定义,可创建自己的插件:
|
|
||||||
|
|
||||||
#### 步骤 1:创建插件项目
|
|
||||||
|
|
||||||
1. 安装 **Obsidian Plugin DevTools**
|
|
||||||
|
|
||||||
2. 命令面板执行 `> Create new plugin` 生成模板
|
|
||||||
|
|
||||||
|
|
||||||
#### 步骤 2:修改代码(示例)
|
|
||||||
|
|
||||||
在 `main.ts` 中添加以下代码:
|
|
||||||
|
|
||||||
typescript
|
|
||||||
|
|
||||||
复制
|
|
||||||
|
|
||||||
下载
|
|
||||||
|
|
||||||
import { App, Editor, Menu, Plugin } from "obsidian";
|
|
||||||
|
|
||||||
export default class TextActionsPlugin extends Plugin {
|
|
||||||
async onload() {
|
|
||||||
// 注册右键菜单
|
|
||||||
this.registerEvent(
|
|
||||||
this.app.workspace.on("editor-menu", (menu: Menu, editor: Editor) => {
|
|
||||||
// 添加自定义操作 1
|
|
||||||
menu.addItem((item) =>
|
|
||||||
item
|
|
||||||
.setTitle("转换为大写")
|
|
||||||
.setIcon("uppercase")
|
|
||||||
.onClick(() => {
|
|
||||||
const sel = editor.getSelection();
|
|
||||||
editor.replaceSelection(sel.toUpperCase());
|
|
||||||
})
|
|
||||||
);
|
|
||||||
|
|
||||||
// 添加自定义操作 2
|
|
||||||
menu.addItem((item) =>
|
|
||||||
item
|
|
||||||
.setTitle("插入时间戳")
|
|
||||||
.setIcon("clock")
|
|
||||||
.onClick(() => {
|
|
||||||
const cursor = editor.getCursor();
|
|
||||||
editor.replaceRange(new Date().toLocaleString(), cursor);
|
|
||||||
})
|
|
||||||
);
|
|
||||||
})
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#### 步骤 3:启用插件
|
|
||||||
|
|
||||||
1. 将插件文件夹放入 `.obsidian/plugins/`
|
|
||||||
|
|
||||||
2. 设置 → 社区插件 → 启用你的插件
|
|
||||||
|
|
||||||
|
|
||||||
#### 效果:
|
|
||||||
|
|
||||||
右键文本时会出现新选项:
|
|
||||||
|
|
||||||
- **转换为大写**:选中的文本变为大写
|
|
||||||
|
|
||||||
- **插入时间戳**:在光标处插入当前时间
|
|
||||||
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 自定义操作示例(可扩展)
|
|
||||||
|
|
||||||
在插件代码中可添加更多操作:
|
|
||||||
|
|
||||||
typescript
|
|
||||||
|
|
||||||
复制
|
|
||||||
|
|
||||||
下载
|
|
||||||
|
|
||||||
// 添加删除线
|
|
||||||
menu.addItem((item) => item
|
|
||||||
.setTitle("添加删除线")
|
|
||||||
.onClick(() => {
|
|
||||||
const sel = editor.getSelection();
|
|
||||||
editor.replaceSelection(`~~${sel}~~`);
|
|
||||||
})
|
|
||||||
);
|
|
||||||
|
|
||||||
// 复制为Markdown链接
|
|
||||||
menu.addItem((item) => item
|
|
||||||
.setTitle("复制为链接")
|
|
||||||
.onClick(() => {
|
|
||||||
const sel = editor.getSelection();
|
|
||||||
navigator.clipboard.writeText(`[${sel}](https://)`);
|
|
||||||
})
|
|
||||||
);
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 调试提示
|
|
||||||
|
|
||||||
1. 按 `Ctrl/Cmd + Shift + I` 打开开发者工具
|
|
||||||
|
|
||||||
2. 在控制台查看插件日志
|
|
||||||
|
|
||||||
3. 修改代码后重新加载 Obsidian(`Ctrl/Cmd + R`)
|
|
||||||
|
|
||||||
|
|
||||||
通过以上方法,你可以为 Obsidian 的右键菜单添加任意文本操作,从简单的格式转换到复杂的自定义逻辑均可实现。开发插件需要 TypeScript 基础,但 Obsidian 提供了完善的 [API 文档](https://docs.obsidian.md/Reference/TypeScript+API/Editor) 和社区支持。
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
{
|
|
||||||
"nodes":[
|
|
||||||
{"id":"cb35f36500051eb6","x":-533,"y":-472,"width":1093,"height":60,"type":"text","text":""},
|
|
||||||
{"id":"61edc211325da480","x":-1206,"y":2853,"width":906,"height":60,"color":"4","type":"text","text":"动作时间轴"},
|
|
||||||
{"id":"a7f14817e1497be2","x":-1206,"y":2940,"width":586,"height":60,"color":"6","type":"text","text":"不可打断"},
|
|
||||||
{"id":"e8d1678f431e2ee0","x":-870,"y":3020,"width":250,"height":60,"color":"6","type":"text","text":"缓存输入"},
|
|
||||||
{"id":"8fc0985df93fdde7","x":-620,"y":3020,"width":320,"height":60,"color":"6","type":"text","text":"可切换的后摇"}
|
|
||||||
],
|
|
||||||
"edges":[]
|
|
||||||
}
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
|
|
||||||
正常流程
|
|
||||||
1、攻击 - 扣血 - 死亡
|
|
||||||
2、攻击附加buff
|
|
||||||
3、技能
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
|
|
||||||
接口不指定构造函数
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
|
|
||||||
Source:[Unity网络请求封装实战:手把手教你打造一套可扩展的网络请求框架](https://mp.weixin.qq.com/s/p9qDdJqHj-7x58XAPNNabA)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
todo
|
|
||||||
Reference in New Issue
Block a user