- 博客(83)
- 资源 (2)
- 收藏
- 关注
原创 Huatuo热更新--如何使用
比如即使在Unity编辑器中运行,若代码修改了,也需要依次执行生成dll,复制dll,打ab包这个过程,否则编辑器运行也会存在问题,若想修改则需要修改LoadDllManager,PrefabsLoadManager,SceneLoadManager脚本,改为非编辑器环境加载AB包,编辑器环境下不加载的方式。注意,Main里的脚本是框架类脚本,不做具体功能需求,所以不支持热更新,一般实现后不会再做修改,一旦修改了就需要重新Build。后续根据需求还会有图集的AB包,材质的AB包等,在此不做详细扩展。
2025-02-18 16:41:17
628
原创 Huatuo热更新--安装HybridCLR
手动下载上述git地址工程然后解压,同样在Window- Package Manager选择Add package from disk,然后选择解压文件中的package.json即可安装。安装号HybridCLR的package包后就可以正式安装HybridCLR了,选择unity顶部编辑栏的HybridCLR-Installer,然后点击Install即可。除了使用git安装外,官方还支持本地安装,但实测很麻烦,而且容易版本不对,导致后续打包等出错,所以推荐直接使用git安装。至此,安装彻底完成。
2025-02-14 17:06:47
271
原创 力扣题库-掷骰子模拟详细解析
d[3][i][1] = d[2][a][1]+d[2][b][1]+d[2][c][1]+d[2][d][1]+d[2][e][1] + d[2][a][2]+d[2][b][2]+d[2][c][2]+d[2][d][2]+d[2][e][2],可以转变为下面的代码。= X,所以只考虑第二次投掷1~6,连续1次点数相同的情况即d[2][i][1]的情况,只需考虑前一次的情况,即X的值,X有6-1种选择,即d[2][i][1] = d[1][j][1] * 5 ,此处。
2024-12-06 17:09:09
1043
1
原创 Blender骨骼创建
在编辑骨骼时,没有相连的骨骼间若存在约束关系比如下图,中间胸口的骨骼若转动,应该会带动左右的肩部的骨骼,则需要建立约束关系,先选中受约束的骨骼,再选中另一个骨骼,按Ctrl + P,选择保持偏移量即可(类似创建父子关系),此时进入姿态模式,转动父骨骼,会发现子骨骼会一起转动。进入姿态模式,选中某骨骼控制器,移动/旋转,会发现添加的骨骼没有跟随变化,因为生成控制器时并非直接在原骨骼上添加控制,关闭原骨骼显示,会有一个绿色的骨骼,该骨骼会受到控制器影响。
2024-06-13 13:27:07
3695
3
原创 Blender帧动画
多条曲线显示时,由于不同曲线的变化范围不一致,导致曲线观察不方便,可以开启曲线规格化,使所有曲线纵轴范围为-1~1。定义一个帧动画类似unity的Timeline,只需定义关键帧,过渡帧会自动差值计算。变量为发生变化的量,如坐标X/Y/Z的位置,一个变量对应一个通道。关键帧Key-frame,记录了一个关键数据。曲线值插值函数曲线(F曲线/F-Curve)-绿色,普通帧,其数值由插值计算而来。-橙色,此帧被修改,但未记录(保存)-视图:方法,平移,框显全部。-选择一个通道,外插一个循环。
2024-06-13 13:20:42
841
原创 Blender雕刻建模_UV展开
注意绘制纹理前需要确保UV正确展开以及分辨率要足够,分辨率包括贴图的分辨率以及模型面在UV中所占的分辨率(例如一块区域UV展开时十分密集,导致其面占用UV的分辨率太小即面所占像素太少,则绘制时无法绘制出想要的效果)纹理绘制模式,在物体表面直接绘制(即纹理绘制工作区右侧的窗口,或在左侧选择纹理绘制如图)在图像编辑器中可以查看新建的纹理贴图或进入纹理绘制工作区。在图像编辑窗口可以绘制贴图(纹理绘制工作区左侧的窗口)在着色器编辑器中,添加图像纹理节点,点击新建。-进入纹理绘制工作区,显示纹理绘制UV。
2024-06-13 13:18:14
1584
1
原创 Blender雕刻建模_重拓扑
选中边数少的边,使用描边工具画出一条边(边的起点与终点在边数多的边的顶点上),使上下嘴唇的边数一致(此步骤可重复多次以增加面的密度,增加细节,只需要最后一次时上下嘴唇的边数一致即可)-然后将桥接出的面的另外两个侧边与取消选中的边用钢笔工具填充,填充方式为将取消选中的边除两端的点外,分别于桥接面侧边的从两端第3个开始的点进行连接。-R与Shift + R,旋转(轴不同,R是面的中心轴,Shift + R是视图平面轴)-Shift + 滚轮,调整段数(圆的顶点数,独立的圆,没有与其他圆桥接)
2024-05-17 17:27:56
2832
1
原创 Blender雕刻建模_笔刷纹理和顶点绘制
笔刷绘制的纹理默认方向不变与问题贴图一致,若要使其绘制方向与笔刷刷的方向一致可以在纹理中勾选变向。使用笔刷纹理时,每个点的强度计算公式:笔刷强度 = 最大强度*压感*衰减*纹理强度。用一张纹理来定义笔刷各个点的强度。其中白色为1,黑色为0。-强度,设为0.15(可以根据需求修改)-笔刷纹理常设置于刷子工具,膨胀工具。-分辨率要够,动态拓扑对锚定不起作用。-笔画,设为锚定(常用值,可更改)-衰减,设为常量(常用值,可更改)此时还看不见结果,需要定义纹理。主要用于皮肤,纹理的雕刻。-纹理,新建一个空白纹理。
2024-05-15 15:55:18
882
原创 Blender雕刻建模_笔画,镜像,动态拓扑
例如:笔刷半径50,笔画间隔100%(笔刷直径的百分比),则鼠标每走100对一个点应用一次结果。镜像是应用笔刷效果,即使物体不是对称的也可以使用。例如方向选择“-X到+X”即表示用物体-X区域的形状应用到物体+X区域。使用的是局部坐标,以自身原点为中心(使用局部坐标系)。-动态拓扑的分辨率(细节大小-像素),是视图单位(即拉近拉远效果不同)例如将Z改为6,则效果是笔刷效果会绕Z轴复制6份。比如X镜像即X轴的左右两侧同时应用笔刷效果。-直线:画出一条直线,在直线上应用效果。形状固定,位置可变(拖拽改变位置)
2024-05-15 15:53:24
488
原创 Blender雕刻建模_衰减
遮罩(蒙版)将需要操作的区域使用遮罩笔刷刷上,然后反选,之后笔刷操作就不会影响到其他区域。衰减曲线定义好后不能单独保存,只能将该笔刷保存为新的笔刷从而使该自定义衰减曲线保存。指法向朝着观察者一侧的顶点,观察者看不见的顶点不会受到影响,对于有的笔刷并不实用。从中心点向外的一个球形空间(不仅是看见的2D球,而是一个3D球形的空间)自定义衰减曲线是和笔刷绑定的,切换到其他笔刷后自定义的衰减曲线是没有的。自定义的衰减曲线常配合刷子(自由线),抓起工具。-高级|仅前面的面(不如前两种方法好用)
2024-05-15 15:51:08
325
原创 Blender雕刻建模流程
若物体存在缩放,则在重构网格时,重构的网格也会有缩放效果,不方便进行雕刻,且笔刷也会有缩放效果,显得怪异。-添加细分修改器并应用(也是需要的,因为曲线倒角转的网格物体其实并不是平滑的,只是默认为平滑着色方式使其看起来平滑,若将其改为平直着色方式就会发现其有明显的棱角)-重构网格(这一步也是必不可少的,因为就算物体表面细分过,但是其面的分布可能并不均匀,雕刻需要使用面分布均匀的物体)-曲线倒角,封盖(必须,重构网格是按照体积的,为封盖的物体是没有体积的),修该分辨率。-多边形:表面细分,布尔。
2024-05-15 15:48:14
664
原创 Blender雕刻建模_笔刷
下图为“使用统一半径”与“使用统一强度”按钮,一般各个笔刷应该有各自的强度设定,所以都应该取消选中,这样在切换笔刷时,各笔刷的半径与强度就会使用各自调整好的值。-按Ctrl临时切换方向(比如原本是向外提,按住Ctrl后变为向内压,注意要先按Ctrl再落笔画,若已经落笔再按Ctrl则无效),点击下图中的+-号效果一致。-拖拽的幅度:幅度太大时,顶点拉伸太多,导致抓起区域面变大,其他操作时精细度下降,需重构网格(直接Ctrl + R,可以不调整体素)。-框选隐藏,仅隐藏选中的面,并不是删除。
2024-05-15 15:44:07
2597
原创 Blender细节补充
在Unity中使用的模型经常需要先有一个空物体作为父节点,然后具体的模型作为子节点,便可以使用该方法,先添加一个空物体,然后将其作为具体模型的父节点,再导出FBX文件。移动,缩放的快捷键分别是G和S,然后按下X/Y/Z可以在对应轴上进行编辑,除此以外还可以按Shift + X/Y/Z,分别表示在YZ/XZ/XY平面内进行编辑。注意,对于外部依赖的文件(比如材质中使用了某张图片),需要在原Blender文件中勾选文件|外部数据|自动打包资源。操作:选中一个物体,添加约束,选择子级,然后指定目标(如下图)
2024-05-09 16:36:11
2864
原创 Blender材质,纹理,UV
左边窗口点击 同步,然后再右侧窗口选中一个顶点,由于一个顶点可能关联了多个面,所以左侧窗口有多处对应。UV展开后调整UV布局(使用移动,旋转,缩放工具,一般在孤岛模式下进行调整),使绘制贴图时更加方便。选中一组顶点,X/Y轴对齐(右键选择X向拉直或Y向拉直,也可以在UV|对齐中选择X向拉直或Y向拉直)在右侧3D视图中选中任意面,会在左侧显示该面的线框,以及该面使用了贴图的哪一部分。2)左侧UV编辑器:-UV选区同步,不选中 -点,边,面,孤岛选择模式。3)添加一个材质,包括材质的名称,基础色,金属度等。
2024-05-08 17:28:21
6693
原创 Blender修改器
每个修改器的顶部都有如下样式,从左到右分别为:展开/折叠,修改器类型,修改器名称,编辑模式按钮,实时按钮,渲染按钮,下拉选项(如下图),删除按钮。使用网格基本体节点即不适用物体自身的网格数据,而是使用网格基本体节点选择的网格数据作为输入,此时就会发现物体显示为一个圆,即网格圆节点的网格。-透视模式,选中一个顶点,按Ctrl + A可以修改截面尺寸,或按N键,调整面板中的半径,如下图。默认的节点(组输入)是以网格自身的数据作为输入,其中几何数据即点,边,面,法向等数据。
2024-05-08 17:20:02
3872
1
原创 解决Blender导出FBX文件到Unity坐标轴错误的问题
此方法能解决大部分物体旋转后导出FBX文件到unity引起的朝向问题,但有些情况下不行(目前我试出来不行的情况为物体在多个轴上都有旋转时不行,如果只在一个轴上有旋转是没问题的,我怀疑和万向节死锁有关).发现Blender的模型导入到Unity里面有问题,简单研究了下发现是坐标系不同,Unity使用的是左手坐标系,Blender使用的是右手坐标系。然后看当前物体的朝向为A坐标系下的哪个轴,最后将“前进”选项的值设置为该轴值即可,向上也是同样。
2024-04-29 14:03:38
3458
原创 Blender曲线操作
3)转换时,可以保留原始备份(转化时在微调面板内勾选保留备份即可创建一个曲线的备份)该曲线默认为多线段类型,在编辑该曲线时,可以将其转化为贝塞尔曲线再编辑。-多边形建模:Blender,C4D,3DsMax,MaYa。-半径(倍数值),调整半径的倍数,倒角后的管子在此处变细/粗。3)选中需要设置倒角的曲线,选择物体为添加的封闭曲线。-倾斜,只法平面的倾斜,倒角后的管子在此处有扭曲。-对齐(将控制柄两端都改为曲线,且承180°)-在菜单 曲线-设置样条类型-贝塞尔。3)选中一个控制点,G,S,R。
2024-04-28 17:46:30
4715
原创 Blender常见操作
当某些模型不方便选中顶点时,可以使用“选中相连项”,还是先进入编辑模式,然后选中要拆分物体的任意一个顶点,然后在菜单 选择-选择相连元素-关联项 即可选中相关联的所有顶点,快捷键Ctrl + L。拆分的顶点内部的线不变,会断开与其他顶点的连线(就像用刀切西瓜,断开刀切处顶点的联系,变为两个部分,只是还属于一个物体),此时移动拆分的顶点能看见明显效果。1.局部视图:Local View,也可称作Solo模式,按快捷键 “/”进入,在按退出,只显示选中的物体(可多选),方便编辑。-Esc回到原位,右键分离。
2024-04-28 17:43:32
6038
原创 Blender点操作
按F键,连接顶点,形成一条边,若是连接的是面的两个顶点,则该面不会被切割,只多出一条边。打开自动合并,当两个顶点重叠时,自动焊接,一般与顶点吸附联用。首先需要统计信息,当前Mesh中点,线,面的个数。-右键(或按M键),合并顶点-到中心点(或其他)-快捷键 Ctrl + X,移走顶点,融合邻边。-右键(或按M键),合并顶点-到中心(或其他)-按J键,连接顶点,并切割平面(或K键切割)顶点合并,即“焊接”,合并邻边或重叠的顶点。衰减曲线,用于衰减的方式,如平滑,尖锐等。
2024-04-26 17:54:32
3589
原创 Blender边操作
2)Ctrl + Alt + 鼠标左键(鼠标点击约靠近哪个边,就选中哪个边的并排边)2)Alt + 鼠标左键(默认情况,若无效,则可能和其他操作的快捷键重复了)其中,滑移时,是以两侧的邻边为轨道,滑移的边线无法越过轨道尽头。2)边数相同时桥接的面为四边面,不相同时,桥接的面为三角面。(鼠标点击约靠近哪个边,就选中哪个边方向的并排面)1)选中一条边, 菜单 选择-选择循环-循环边。1)选中一条边, 菜单 选择-选择循环-并排边。比如-内折的墙角,外突的墙角,平面内的线,先切换到面编辑,然后操作与并排边一致。
2024-04-26 17:51:14
1919
原创 Blender面操作
各面:选中共边的多个面进行内插时,内插面会也会共边,选中各面后,每个面会独立进行内插不共边。-填充面,按F键,填充为一个面,按Alt+F使用三角面进行填充,填充的面为多个三角面。-按C,切穿,开关键(切到正交试图),切穿指切割的操作都会延伸到该面之后的面,-栅格填充(要求偶数边),使用四边形的面进行填充,填充完的面由多个四边面组成、-按A,进行角度约束(切到正交试图),开关键(按一次开,再按一次关)-快捷键挤出,E(沿法向),E+X/Y/Z(轴向)选择多个面,将多个面合并为一个面。
2024-04-26 17:48:47
2639
原创 Blender基础操作
在不使用插件的前提下,先将游标定位到需要设置基准点的位置,然后在 物体模式下,选中物体,右键选择设置原点,设置到3D游标即可完成。2)吸附定位-先切换到编辑模式,然后选择点模式,然后选中一个点,最后在网格-吸附-游标到选中项。若再按X,则只沿X轴移动,同理可按Y与Z。若再按X,则只绕X轴旋转,同理可按Y与Z。若再按X,则只沿X轴缩放,同理可按Y与Z。若再按X,则只沿X轴移动,同理可按Y与Z。选中一个物体,按G,之后可以任意移动。选中一个物体,按G,之后可以任意移动。3)选中物体点击X(确认后删除)
2024-04-26 17:44:01
943
原创 unity计算三维空间下点到线,点到面,线到线,线到面,面到面最短距离的点的方法
unity计算三维空间下点到线,点到面,线到线,线到面,面到面最短距离的点
2024-04-24 17:13:47
379
1
原创 unity实现使不同尺寸物体总能较完整的显示在相机范围内
最后是简单的鼠标控制相机拖拽,旋转,缩放观察模型,若需要射线监测点击物体则需要注意射线发射的位置为鼠标位置减去RawImage左下角位置,具体代码如下。unity通常会有将一个模型展示在界面上用于旋转缩放观察的功能,通常是使用相机看向模型,然后使用RawImage显示相机看到的画面。但很多时候展示的模型尺寸与中心点是差别较大的,就需要自适应的修改模型的位置使其能够完整的显示在屏幕中心位置,下面就是相关代码。最后就是展示模型时调用上述方法即可。首先将物体的子物体进行网格合并。然后计算物体的几何中心点。
2024-02-27 10:08:19
1083
原创 Unity插件-Cinemachine
(例如vc1混合到vc2,一项是From:vc1,To:vc2,一项是From:vc1,To:ANY CAMERA,那么前面那项是更符合要求的,会被使用)若有多条最符合要求的,则选择最先找到的那一条。在设置VirtualCamera的时候,我们知道,当给VirtualCamera设置了Follow目标时,Camera就可以跟随着我们设置的目标移动,而通过设置Body属性,可以设置相关的跟随方式。我们可以将除了正在使用的VirtualCamera都关闭,来达到最佳的性能。这步操作的快慢,我们可以通过。
2023-10-19 11:12:30
1665
原创 A星寻路优化方案
对于地图信息已知且各障碍位置固定的情况下,可以将常用的位置及其之间的路径信息保存,然后寻路时分别找到离开始点,结束点较近的位置,分别进行寻路,再将路径组合得到最终路径,不过此路径可能较正常寻路出的路径较远但寻路用时较少。
2023-10-13 17:05:38
781
原创 FinalIK反向动力学插件学习
CCDIK适用于非人体骨骼,存在多个关节的物体,如多关节机械臂。其中Target、Weight、等参数与之前的无异,主要是Bones需要将机械臂的关机分别加载进入并调节Weight即可,有时需要限制机械臂个骨骼节点的旋转,可以添加Rotation Limit Angle(锥形范围限制),Rotation Limit Hinge(扇形范围限制)
2023-09-19 13:38:57
855
原创 Unity粒子系统ParticleSystem各模块及其参数学习
用户可以使用回调作为一种简单的方式来在粒子进入碰撞器时消除它(例如防止雨滴穿透屋顶),或者此模块用来修改任何或所有粒子的属性。它将粒子的开始寿命乘以一个值,该值取决于生成粒子的对象的速度对于大多数粒子系统,这是游戏对象速度,但对于子发射器,速度来自子发射器粒子源自的父粒子。根据粒子的初始行进方向定向粒子。如果一个粒子与帧中的多个碰撞器交互,则会返回与该粒子交互的碰撞器列表中的第一个碰撞器。锥体在其顶点处的角度,角度为0时呈圆柱体发散粒子,角度为90时呈圆盘形状发散粒子(此时粒子在平面内发射)
2023-09-13 15:54:09
2897
原创 Unity实现MQTT服务器
到这服务器与客户端脚本完成,接下来只需要写一些测试脚本,调用上面脚本的接口,即可完成服务器的开启/关闭,客户端连接,收发消息等功能。然后再/Source/MQTTnet/bin/Debug/net452 文件夹中找到生成的文件。解压好后使用vs打开,并生成.dll文件(我这里下载的是4.1.2.350版本)新建unity工程,创建Plugins文件夹,将文件复制到该文件夹内。然后新建脚本MyMqttServer,代码内带有注释。创建脚本MyMqttClient,代码内带有注释。
2023-09-01 11:30:48
1971
29
原创 设计模式-单例模式
很多时候我们的单例是只有访问时才会加载的,属于懒汉式,这个单例的生命什么时候结束脱离了GC的掌控,只能靠我们自己去释放,如果忘记释放或者提前被释放容易产生各种问题,(其他开发者不知道你什么时候释放单例,所以就无法释放)使用单例可能会让一个类复杂多种职责,容易让单一文件过大,代码复杂性上升,一个GameManager统计分数还计时,还存玩家信息,又存地图信息…我们在全局都能通过静态访问单例,容易让用户误操作,而且让代码散乱不安全,如果有100个单例…根据创建的时机可以分为饿汉式和懒汉式。
2023-08-15 13:15:01
1685
原创 设计模式-抽象工厂模式
抽象工厂模式:该模式是对工厂模式的拓展,因为工厂模式中创建的产品都需要继承自同一个父类或接口,创建的产品类型相同,无法创建其他类型产品,所以抽象工厂模式对其进行拓展,使其可以创建其他类型的产品。缺点:当新增一大类产品时需要修改工厂脚本,违反开闭原则。优点:创建的产品种类不单一。
2023-08-15 12:12:34
625
原创 设计模式-工厂模式
工厂模式:该模式是将简单工厂模式中的工厂作为一个基类(接口),当需要创建的产品(具体子类实例)增加时,不修改原工厂的创建方法,而是增加一个具体工厂子类,由该子类去创建新增的产品,将产品子类的实例化延迟到工厂子类中。优点:降低了耦合性,只需要知道要什么产品,不用管创建过程;缺点:代码复杂度提高。
2023-08-15 11:58:42
868
1
原创 设计模式-简单工厂模式
简单工厂模式又称为静态工厂模式,其实就是根据传入参数创建对应具体类的实例并返回实例对象,这些类通常继承至同一个父类,该模式专门定义了一个类来负责创建其他类的实例。缺点:违反了开闭原则(即对修改关闭,对拓展开放),当有新的具体类需要创建时都需要修改工厂类中的创建方法,多增加判断。优点:将对象的创建于使用分离,创建完全交给工厂类来实现。这就是工厂类,提供一个方法创建具体类的实例。
2023-08-15 11:32:12
644
原创 自定义UI界面inspector面板(Editor)以及自定义参数在inspector面板内显示效果(PropertyDrawer)
若要修改参数在inspector面板显示,需要新建一个脚本继承PropertyDrawer,然后添加特性[CustomPropertyDrawer(typeof(参数类名))],然后实现OnGUI()方法,示例如下。该脚本继承Editor,加上特性[CustomEditor(typeof(具体界面类))],然后实现OnInspectorGUI()方法即可自定义inspector显示面板,效果图如下。平时我们在搭建一个界面后都会给这个界面添加一个界面脚本,一般情况下都是普通的MonoBehaviour的。..
2022-08-11 12:38:02
1434
原创 Unity中List的底层源码剖析
1、list底层代码剖析List是C#中一个最常见的可伸缩数组组件,我们常用它来代替数组。因为它是可伸缩的,所以我们在编写程序的时候不用手动去分配大小,接下来我们来看看list的底层实现。public class list<T> :IList <T>,System.Collections.IList, IReadOnlyList <T>{private const int _ defaultCapacity = 4;private T...
2022-05-24 19:28:21
1165
原创 英雄联盟血条效果Shader
由于不会使用Step和Clip方法,所以使用了更消耗性能的if**else**下面为自己实现的ShaderShader "MyShader/MyLifeBarGap"{ Properties { [HideInInspector] _Width("每100血的宽度", float) = 10 _Color("血条颜色", Color) = (1,1,1,1) _BlackWidth("分隔线宽度", float) .
2022-04-29 17:07:42
778
原创 反射和特性之特性学习
特性是将额外数据关联到属性(以及其他构造)的一种方式。它不依赖与选项名与属性名的完全匹配,可利用特性指定与被修饰的构造有关的额外元数据。可用特性将一个属性修饰为Required(必须),并提供选项别名。特性要放到所修饰构造前的一对方括号里,例如:public class Person{ [CommandLineSwitchAlias("name")] public string name; [CommandLineSwitchRequired] public i
2022-04-28 17:08:51
199
原创 反射和特性之反射学习
反射:访问程序集中类型的元数据,其中包括像完整类型名和成员名这样的构造,以及对一个构造进行修饰的任何特性。通俗点将就是可以通过object.GetType()或typeof()方法来得到一个变量的Type类型,然后获取该类型数据的所有属性、方法以及特性。反射是指对该类型数据内所有属性、方法和特性进行检查访问的过程。可以通过object.GetType()或typeof()方法来获取数据类型;通过Type.GetProperties()方法来获取数据类型内的属性;通过Type.GetMet
2022-04-28 11:52:06
322
原创 Unity Shader学习之Unity Shader中常用变量、文件等说明
1.顶点/片元函数声明#pragma vertex name#pragma fragment name其中name为函数名2.常用语义POSITION语义告诉Unity,用模型空间的顶点坐标填充变量NORMAL语义告诉Unity,用模型空间的法线方向填充变量TEXCOORD0语义告诉Unity,用模型的第一套纹理坐标填充变量TANGENT语义告诉Unity,用模型空间中顶点的切线方向填充变量COLOR语义用来存储颜色信息其中TEXCOORD语义支持TEXCOORD0~
2022-04-26 11:54:41
1872
1
与unity相似的颜色面板
2023-12-12
基于socket网络编程的聊天室
2018-09-25
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人