【Unity】创建一个自己的AR脸部特效安卓程序

这篇具有很好参考价值的文章主要介绍了【Unity】创建一个自己的AR脸部特效安卓程序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 创建一个换脸AR场景

接着上篇文章的创建一个简单的AR安卓程序,这次来创建一个自己的AR换脸程序。同样使用之前的项目,在Assets的Scene文件夹下使用Ctrl+N新建一个Scene(或者File→New Scene),选择AR场景,点击Create创建:unity3d实现ai换脸,unity,ar,android
这样,就可以直接在配置好AR环境的AR Scene中添加自己的模型了,使用Ctrl+S保存该场景并为其命名。

2 下载官方提供的BasicFaceFilterAssets资源

zip下载位置在此,点击即可下载。
下载完成解压后,即可将BasicFaceFilterAssets.unitypackage导入工程的Assets文件夹下。

导入方法
菜单栏选择Assets → Import Package → Custom package,接着选择刚才zip文件解压的文件夹位置,找到其中的unitypackage,双击后会跳出一个导入资源的窗口,点击右下角的Import导入。

3 设置AR面部追踪

由于要制作一个换脸程序,那么首先需要实现面部追踪。这部分工作官方已经做好了,我们只需要添加到场景中并在程序中可视化。这里使用到AR Default Face来追踪面部,因此,需要将AR Default Face做成预制体。当摄像机识别到面部时,该预制体被激活。为了可视化面部捕捉,需要为AR Default Face预制体添加一个材质。

  1. 在Hierarchy面板中右键选择XR → AR Default Face 为场景添加一个 AR Default Face 物体:
    unity3d实现ai换脸,unity,ar,android

  2. 由于该项目是URP管线,因此需要确保AR Default Face物体的材质有效。在Assets下找到_BasicFaceFilter → Materials,并将Materials下的Face Debug MAT材质拖拽至AR Default Face物体的Inspector中:
    unity3d实现ai换脸,unity,ar,android

  3. 将处理好的AR Default Face物体做成预制体放到Assets → _BasicFaceFilter → Prefabs下:
    unity3d实现ai换脸,unity,ar,android

4 配置AR Face Manager

这一步中,我们将使用AR Face Manager来告知AR Session Origin,当检测到面部时,脸上将会显示什么特效。

  1. 将Hierarchy中的Cube物体删除,它只是用于测试的。

  2. 选中AR Session Origin物体,在其Inspector窗口中搜索并添加AR Face Manager组件:
    unity3d实现ai换脸,unity,ar,android
    AR Face Manager组件用于增删改代表面部的GameObject。

  3. 将上一步制作好的AR Default Face预制体拖拽至AR Face Manager组件的Face Prefab:
    unity3d实现ai换脸,unity,ar,android

  4. 在Hierarchy中删掉AR Face Manager预制体,因为我们只想它在实际检测到人脸时再显示。

5 配置AR Camera为前置摄像头

之前的正方体旋转AR程序用到的是手机的后置摄像头,而脸部特效AR程序需要使用到的是手机的前置摄像头。

  1. 在Hierarchy中找到AR Session Origin物体,展开其折叠物体并找到AR Camera物体。
  2. 在AR Camera的Inspector面板中找到AR Camera Manager组件,将其中的Facing Direction属性设置为User:
    unity3d实现ai换脸,unity,ar,android

6 打包并测试

菜单栏File → Build Settings,将AR脸部特效场景添加至Scenes In Build中,项目配置参考上篇文章的第3.2节。
手机打开该程序,可以发现脸上被覆盖了绿色的材质。

7 添加自己的材质

7.1 更改脸部检测的显示材质

一种方式是直接在之前的绿色材质上使用取色器替换其他的颜色:
unity3d实现ai换脸,unity,ar,android

另一种方式是新建一个材质,也可以复制之前的绿色材质,在其之上再做修改。
unity3d实现ai换脸,unity,ar,android

可修改的参数还包括Metallic Map、Smoothness以及Emission:

unity3d实现ai换脸,unity,ar,android

  • Metallic Map:金属性贴图。该值越高,材质就越具有金属性。金属性越强,越能反射更多的光线。
  • Smoothness:平滑程度。该值越高,材质就越光滑。越光滑,越能反射更多的光线。
  • Emission:自发光。启用这个属性时,物体会根据选取的颜色自发光。

7.2 添加自定义纹理

由于之前的调试中AR Default Face物体被制作成预制体,只有当程序运行起来并检测到人脸时才会显示。因此为了方便添加我们自定义的纹理,这里使用Face_Reference_Mesh模型将人脸可视化,它将作为面部参考网格,用于可视纹理、配饰以及特效等。

  1. 在Assets中找到_BasicFaceFilter → Prefabs下的Face_Reference_Mesh预制体,将其拖拽至场景中:
    unity3d实现ai换脸,unity,ar,android
  2. 在Materials文件夹下右键Create → Material新建一个材质,把新建的材质命名为“FaceTexture”,选中该新建的材质,在Inspector面板中找到Base Map,它又叫Albedo(反射率),表示一个物体在受到任何灯光影响前的颜色。点击Base Map左侧的小圆圈图标进行导航,在弹出的面板搜索并找到“FaceTexture_Waves”,双击以适配。
    unity3d实现ai换脸,unity,ar,android
  3. 将该材质拖拽至场景中的Face_Reference_Mesh上以应用新的材质:
    unity3d实现ai换脸,unity,ar,android
    4.可以对材质进行色调的微调。当在Base Map右侧选择一个颜色时,它会以纯色的形式应用到材质中;而当一个纹理也被添加到Base Map中时,Base Map右侧的颜色会被作为纹理的一个色调融合到纹理中。
    unity3d实现ai换脸,unity,ar,android

7.3 设置透明

材质的透明度是由其Alpha通道决定的。Alpha图是用于控制材质透明度的灰度图,越深的像素点透明度越高,反之越浅的像素点透明度越低。
由于Alpha图只使用灰度值,它们包含在一个通道中。Unity中使用Base Map图像的Alpha通道的灰度值来控制透明度。

  1. 选中Assets中刚刚新建的材质,在Inspector窗口中将其 Surface Type 属性修改为Transparent:
    unity3d实现ai换脸,unity,ar,android

  2. 可以观察到场景中的面部也变成了水纹的特效:
    unity3d实现ai换脸,unity,ar,android

如果想自己设计纹理,那么可以在这里下载psd贴图文件使用PhotoShop或者Gimp(Photoshop的开源替代品,可用于图像的创建、修改以及导出)来对其进行编辑。

7.4 应用修改

需将新建的材质应用到AR Default Face 预制体,才能在运行时检测到人脸显示上述效果:

  1. 在 Assets → _BasicFaceFilter → Prefabs下找到AR Default Face,双击它以打开预制体,在其Inspector面板中找到Mesh Renderer组件,并在Element 0的右侧点击小圆圈图标导航,选择制作好的FaceTexture材质,编辑好退出Prefab回到Scene窗口。
    unity3d实现ai换脸,unity,ar,android

2.在Hierarchy窗口中隐藏Face_Reference_Mesh物体。
unity3d实现ai换脸,unity,ar,android

7.5 打包测试

注意在Player Settings面板中修改一下程序迭代的版本号,打包项目上机测试,可以观察到当检测到人脸时,水纹面具覆盖在你的脸上。

8 图像优化

图像优化对AR体验至关重要,因为移动设备的处理能力有限。当涉及到为AR创建纹理时,需要考虑到图像的大小、图像的类型以及纹理是否需要有透明度。

8.1 图像大小

图像的纹理尺寸大小通常是用2的幂次数来表示的,如512 x 512, 1024 x 1024, 2048 x 2048 (2K) and 4096 x 4096 (4K)。较老旧的显卡需要固定是2的幂次数尺寸才能运行良好,大多新的显卡已然没有这个限制,但使用2的幂次数大小的尺寸仍被认为是最佳的做法。

8.2 图像类型

图像的类型对于优化也有较大的影响。需要考虑到如下的因素:

  • 目标平台上的可用存储空间
  • 读取速度(即目标平台将图像从磁盘获取到系统内存的速度)
  • 从系统内存到GPU的读取速度
  • 目标平台的视频RAM存储预算

对于不同类型的图像,它们各有优劣,我们应当考虑最适合我们的策略:

  • PNG:PNG格式以合理的小文件尺寸保留了质量,包括一个alpha通道。然而,PNG文件是压缩的,所以它们在阅读过程中需要解压缩。小文件的好处往往大于读取文件所花费的额外时间,因此在大多数情况下,PNG是一种理想的文件类型。
  • TGA:TGA格式是有较好的质量,因为它是未压缩的,包括一个alpha通道。然而,TGA是一个大文件格式,所以它的加载速度很慢。TGA文件是支持预加载纹理的较好选择,比如AR应用中的背景图像。
  • JPG:JPG格式的文件大小较小,但在这个过程中每次压缩都会有质量损失。JPG不包含alpha贴图,所以它们不能用于任何需要透明的东西。

9 添加自己的模型

9.1 使用官方提供的模型

我们可以观察到在Assets 中的 _BasicFaceFilter → Prefabs下还有其他已经做好的预制体:

unity3d实现ai换脸,unity,ar,android
同样的,要添加这些特效,我们需要先将AR Default Face可视化。

  1. 在Prefabs文件夹中找到AR Default Face预制体,双击打开它。接着将Face_Reference_Mesh拖拽至AR Default Face下作为它的子物体,我们就可以双击Face_Reference_Mesh看到它了。

unity3d实现ai换脸,unity,ar,android
2. 将提供的预制体拖拽至Face_Reference_Mesh下作为AR Default Face的子物体,接着使用移动工具拖拽该预制体至合适位置:
unity3d实现ai换脸,unity,ar,android

  1. 接着,隐藏Face_Reference_Mesh物体,因为它只是作为一个位置参考用。
    unity3d实现ai换脸,unity,ar,android

  2. 最后,退出预制体编辑回到场景中,所做的更改会自动保存。

  3. 打包并测试效果,如果感觉位置不满意,还可以再继续调整修改。

9.2 使用自己的模型

也可以使用自己在Blender、3dsMax或Maya软件中建立的模型导入Unity中,这些软件通常会将材质和纹理嵌入模型。而导入Unity后,如果这些材质和纹理没有显示,那么需要做如下设置:

  1. 在Assets文件夹下先找到导入的FBX格式模型,在Inspector面板中,选择Materials标签。
    unity3d实现ai换脸,unity,ar,android

  2. 选择Extract Textures和Extract Materials并选择纹理和材质要保存地路径。

注:还可以使用ProBuilder这样的Unity工具在编辑器中创建一些复杂的图形。

9.3 使用Unity资源商店的模型

Unity资源商店中有很多不同种类的资源,我们可以直接下载后导入Unity使用。但是最好找一些低多边形(low-poly)的模型,以便在移动设备上的良好性能。比如,这个帽子资源就比较推荐使用。

10 网格优化

网格优化是也是保证游戏和应用程序有更好性能的重要方法之一。游戏或应用中每个模型的网格(如我们刚刚添加到AR应用中的模型)都是由多边形组成的。游戏资产中的多边形数量很大程度上影响了游戏性能。高多边形数量需要大量的实时计算和管理,导致帧率下降。

对于移动硬件,将每个网格的多边形数量保持在300到1500个之间会产生良好的效果;而对于桌面平台,理想的范围是1500到4000个多边形。注意,场景中的整体多边形数量也很关键,这意味着一个有很多人物的场景需要使用更低的多边形数量的模型。

11 添加动画

11.1 使用官方提供的动画控制器

Unity中动画相关的有两个重要的东西:

  • Animation Clips:动画片段可用于简单动画的制作,如一个角色的行走、运行或站立动画。
  • Animator Controller:动画控制器用于控制动画片段的播放。可以使用动画控制器来为一个角色或一个游戏物体切换一组动画片段。

在Assets文件夹下找到_BasicFaceFilter → Animations文件夹,其中带三角形图标的是Animation Clips;而带有两个相连方框图标的是Animator Controller。
unity3d实现ai换脸,unity,ar,android

  1. 在Assets下的_BasicFaceFilter → Prefabs中找到AR Default Face预制体,双击打开它,并找到需要做动画的模型,点击它右边的箭头以打开模型的预制体。
    unity3d实现ai换脸,unity,ar,android
  2. 接着可以在其Inspector面板看到有一个Animator组件,在Controller属性右侧点击小圆圈图标导航动画控制器。
    unity3d实现ai换脸,unity,ar,android
  3. 最后,退出预制体的编辑以保存更改。

11.2 打包测试

打包出来测试,我们会发现当程序检测到人脸时,模型动画会播放。

11.3 其他尝试

  • 可以尝试修改动画的关键帧或添加自己的关键帧;

    • 选择模型后,使用快捷键Ctrl+6可以打开Animation面板,对动画的关键帧进行更改:
      unity3d实现ai换脸,unity,ar,android
  • 除了修改动画的常规属性如位置、旋转和大小,还可以尝试通过修改Mesh Renderer.Material.Base Color实现物体在动画中颜色的变换;
    unity3d实现ai换脸,unity,ar,android

  • 还可以尝试自己制作动画。

12 添加粒子特效

12.1 使用官方提供的粒子特效

我们还可以为项目添加粒子特效。粒子是用来模拟一些常见的运动效果如水花溅射和火光炸裂效果等等。
在Assets文件夹下找到_BasicFaceFilter → Particle Effects文件夹,并双击其中一个粒子特效打开它预览。
由于粒子系统是由若干个模块组成的,用来控制粒子的行为和外观,因此需要选择其子物体才能预览到其效果(如要预览多个粒子特效,使用Ctrl键将它们同时选中预览。):
unity3d实现ai换脸,unity,ar,android
要添加粒子特效,同样的,需要把AR Default Face可视化。

  1. 在Assets中的 _BasicFaceFilter → Prefabs下找到AR Default Face预制体,并双击打开它。

  2. 将之前添加的模型隐藏,并显示Face_Reference_Mesh,这样我们就能更好地定位粒子特效应该放在哪里合适。
    unity3d实现ai换脸,unity,ar,android

  3. 在Hierarchy面板中右键Create Empty新建一个空物体,命名为“Particle Effects”把它作为粒子特效的父物体,这个点就是粒子系统的出生点。

  4. 将该空物体调整至合适位置,接着将Particle Effects文件夹下的合适粒子特效拖拽到该空物体下。
    unity3d实现ai换脸,unity,ar,android

12.2 修改粒子特效

粒子特效的最大特性就是其无与伦比的可定制性,每个粒子特效都可以是一个独有的创作。

  1. 我们可以先从修改已有的粒子特效开始着手,比如可以选中粒子特效修改它的Start Color:
    unity3d实现ai换脸,unity,ar,android

  2. 需要注意Simulation Space是设置为World:
    unity3d实现ai换脸,unity,ar,android
    粒子可以以各种方式运动,这取决于它们是在怎样的模拟空间中被创造的。World的Simulation Space将使得粒子会随着脸部的移动而改变其位置!

  3. 还可以修改Emission模块中的Rate Over Time属性来改变粒子产生的数量,但是需要注意如果过多的粒子会导致运行性能的下降!
    unity3d实现ai换脸,unity,ar,android

  4. 还可以试着调整以下的模块属性:

    • Emission:影响粒子特效生成的速度和时间。
      unity3d实现ai换脸,unity,ar,android

    • Shape:定义了发射粒子的体积或表面。
      unity3d实现ai换脸,unity,ar,android

    • Color over Lifetime:规定了粒子的颜色和透明度在其生命周期中的变化。
      unity3d实现ai换脸,unity,ar,android

  5. 当调整完粒子特效的效果后,需要把Face_Reference_Mesh隐藏,接着退出预制体编辑以应用修改。

12.3 使用资源商店的粒子特效

Unity资源商店中也有很多的粒子特效,比如Unity官方的Particle Pack和Legacy Particle Pack,但需要编辑其中的一些材质以保证其正常显示。

当然也可以自己制作粒子特效,比如能发射出激光的眼睛,向上浮动的爱心,围绕着脸转动的星星特效等等。

12.4 打包测试

打包出来测试,我们会发现当程序检测到人脸时,粒子特效会播放。同时,当我们的位置移动时,粒子特效也会随之移动。

13 添加后期处理效果(Post-processing)

13.1 改变全局色调

后期处理是全屏图像处理中的一个专业术语,它发生在相机捕捉到场景之后,但在场景被渲染到屏幕上之前。后期处理效果可以改变相机的焦点,使场景中的明亮区域发光,或使相机视图的边缘变暗……还可以提供许多其他不同的效果。总之,这是一种能提升应用视觉效果的处理方法。

我们可以通过不同的方式为Unity项目添加后期处理效果,这将取决于项目的类型,本项目采用的是URP渲染管线。可以配置一个名为volume的东西为URP项目添加后处理,如果一个场景中有多处需要不同的后处理效果,那么可以配置多个volume在不同区域显示不同的后处理效果。

  1. 首先,在hierarchy面板中找到AR Session Origin下的AR Camera子物体:
    unity3d实现ai换脸,unity,ar,android

  2. 在其Inspector面板中,找到相机组件的Rendering模块,确保Post Processing启用:
    unity3d实现ai换脸,unity,ar,android

  3. 在Hierarchy面板中右键选择Volume → Global Volume,这表示该后期处理效果将全局应用于整个场景。接着,在Volume组件的Profile右侧点击New按钮,创建一个volume配置文件:
    unity3d实现ai换脸,unity,ar,android

  4. 在Volume组件下选择Add Override为Volume添加一个单独的特效:
    unity3d实现ai换脸,unity,ar,android

  5. 首先添加Color Adjustments后期处理,它将对相机看到的所有东西应用一个颜色的色调,它也是最明显的后期处理效果之一。
    点击ALL启用所有的选项,并选择Color Filter的颜色来对场景整体的颜色微调:
    unity3d实现ai换脸,unity,ar,android

13.2 移动设备的限制

虽然后期处理可以使得应用程序更具视觉冲击力,但由于它们会占用大量的资源,因此会导致严重的性能问题。目前大多AR应用都是在移动设备上运行,因此在选择后期处理效果时,需要考虑到硬件的限制。
如果项目是URP渲染管线,那么以下的效果是推荐使用的:

  • Bloom (禁用High Quality Filtering):发光
    unity3d实现ai换脸,unity,ar,android

  • Chromatic Aberration:色差
    unity3d实现ai换脸,unity,ar,android

  • Color Grading:颜色分级

  • Lens Distortion:镜头失真
    unity3d实现ai换脸,unity,ar,android

  • Vignette:晕影。晕影可以使用户聚焦于屏幕的中心,或在边缘增加一个柔和的淡化效果。这个术语来自于摄影,晕影指的是图像边缘的变暗或去饱和。
    可以修改Vignette的以下属性:
    unity3d实现ai换脸,unity,ar,android

    • Color:使用颜色选择器来设置晕染的颜色。
    • Intensity:设置晕影效果的强度。
    • Smoothness:设置光晕边框的平滑度。
  • Color Curves:颜色曲线。我们可以使用色相与饱和度( Hue vs Saturation )曲线来调整场景中颜色和饱和度的特定范围。可以做以下的尝试:

    • 制作单色场景,使用去除饱和度实现;
    • 只剩下一个颜色,去除其他所有的颜色。
      unity3d实现ai换脸,unity,ar,android

14 资源合集下载

Unity创建一个自己的AR安卓程序资源合集文章来源地址https://www.toymoban.com/news/detail-794207.html

到了这里,关于【Unity】创建一个自己的AR脸部特效安卓程序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 1、《创建您自己的NFT集合并发布一个Web3应用程序来展示它们》什么是NFT

    我看到很多教程使都讲的比较复杂。所以,我会尽量保持简单。 NFT是一个人可以拥有的一种“token”,它链接到某个“数据”(例如,指向数字艺术、视频、图像等的链接)。NFT的诀窍在于,每个“token”都有一个唯一的标识符,让所有者证明它是独一无二的。稍后我们将看

    2024年02月14日
    浏览(46)
  • 2、《创建您自己的NFT集合并发布一个Web3应用程序来展示它们》启动并运行您的本地环境

    首先,我们需要让本地以太坊网络正常工作。就是我们如何编译和测试我们的智能合约代码!你知道你需要如何启动一个本地环境来工作吗?这里也一样! 现在,你只需要知道,智能合约是存在于区块链上的一段代码。区块链是一个公共场所,区块链是一个公共场所,任何人

    2024年02月05日
    浏览(74)
  • 自己写一个svg转化为安卓xml的工具类

    自己写一个svg转化为安卓xml的工具类_张风捷特烈的博客-CSDN博客 svg资源阿里巴巴矢量资源网站:iconfont-阿里巴巴矢量图标库 感觉一般的svg到Android可用的xml差异有点规律,主要的就是path 秉承着能用代码解决的问题,绝对不动手。能够靠智商解决的问题,绝对不靠体力的大无畏

    2024年02月11日
    浏览(43)
  • AR贴纸特效SDK,无缝贴合的虚拟体验

    增强现实(AR)技术已经成为了企业和个人开发者的新宠。它通过将虚拟元素与现实世界相结合,为用户提供了一种全新的交互体验。然而,如何将AR贴纸完美贴合在人脸的面部,同时支持多张人脸的检测和标点及特效添加,一直是AR技术面临的挑战。今天,美摄科技带来了一

    2024年02月04日
    浏览(33)
  • Unity制作二次元卡通渲染角色材质——5、脸部的特殊处理

    Unity制作二次元材质角色 回到目录 大家好,我是阿赵。 这里继续讲二次元角色材质的制作。这次是讲头部的做法。 之前在分析资源的时候,其实已经发现了这个模型的脸部法线有问题,导致在做光照模型的时候,脸部很奇怪。 把fbx文件导入到3DsMax里面,可以发现 这个模型

    2024年02月09日
    浏览(38)
  • 如何自己创建一个工具项目并上传到npm上使用

    选择框架:   选择语言: 在项目中使用命令安装项目依赖:   运行项目:  运行成功界面: 注意: version:当前发布的版本号,项目每次改动后需要修改版本后再发布,  默认要0.0.1开始才能上传,相同版本是传不上去的,一定要记得每次更改了代码都改下版本号。 name: 包

    2024年02月12日
    浏览(40)
  • ARToolKitPlus是一个开源的Python库,用于实现增强现实(AR)应用程序

    ARToolKitPlus是一个开源的Python库,用于实现增强现实(AR)应用程序。它提供了一组工具和API,使开发人员能够轻松地创建AR应用程序,并与各种AR硬件设备集成。 要开始使用ARToolKitPlus,您需要安装它。您可以使用pip来安装ARToolKitPlus: ```shell pip install artoolkitplus ``` 一旦安装完成,

    2024年02月04日
    浏览(48)
  • GPTs 初体验 - 1 分钟就能创建一个自己的 ChatGPT?

    就在 11.10 号早上,ChatGPT 已经偷摸的把 GPTs 功能,开放给所有尊贵的 Plus 用户了。 随着这波的功能开放,界面也是改了不少。点击左侧的 Explore 或者左下角的用户处,就可以直接进入新的 GPTs 功能: 这里可以看到我们自己创建的 GPT,下面呢还有 OpenAI 官方出品的 GPTs : 不过

    2024年02月05日
    浏览(40)
  • 手把手教你实现一个JavaWeb项目:创建一个自己的网页博客系统(前端+后端)(一)

    一篇博客带你实现一个真正的项目!  先来看看它是什么样式的: 目录: 1、大体步骤🦖:         1、创建Maven项目🦕         2、引入依赖🦕         3、创建必要的目录🦕         4、编写代码🦕         5、打包部署(基于SmartTomcat)🦕         

    2024年02月06日
    浏览(55)
  • 创建你自己的ERC-721代币:一个简单的以太坊游戏智能合约模板

    区块链游戏正在成为一种新兴的游戏形式,其中代币化的游戏资产成为了一个重要的组成部分。今天,我们将介绍一个简单的ERC-721智能合约模板,这个模板可以帮助你在以太坊区块链上创建你自己的ERC-721代币,让你的游戏更有趣。 源码下载 ERC-721是一种免费的开放标准,它

    2024年02月07日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包