自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(125)
  • 资源 (11)
  • 收藏
  • 关注

原创 GPUAnimation的Mesh动画烘焙到贴图,学习笔记

低版本Unity5.6不支持在GPUInstance的blockproperty传入unit的格式,故把unit用float和floor取整来替代。注意,由于原项目中的SV_VertexID很多opengles低版本不支持,故不用这个方式。复制到URP项目中,并删掉多余报错的和GPUAnimation无关的模块。烘焙好的Mesh在TEXCOORD1和TEXCOORD2有相应的顶点信息。安装FBX Exporter把烘焙好的mesh导出成Fbx。把shader中的hlsl适配成cg。

2023-05-14 15:51:33 924 1

原创 unity基础学习二十,c#算法常用函数

1.Math有关Math.Abs() 计算绝对值Math.Acos() 计算反余弦值Math.Asin() 计算反正弦值Math.Atan() 计算反正切值Math.Atan2() 计算从x 坐标轴到点的角度Math.Ceil() 将数字向上舍入为最接近的整数Math.Cos() 计算余弦值Math.Exp() 计算指数值Math.Floor() 将数字向下舍入为最接近的整数Math.Log() 计算自然对数Math.Max() 返回两个整数中较大的一个Math.Min() 返回两

2022-05-27 11:43:08 1831 1

原创 unity基础学习十九,引导模块的设计

1.什么是XXX2.为什么要有XXX3.如何使用XXX,使用XXX的不同方案比较4.源码实现5.如何设计6.关键点,重要节点,疑难杂症场景

2022-05-23 19:04:14 1921

原创 算法学习一,基础查找算法和排序算法

1.排序算法1.1 插入排序//插入排序public static void InsertionSort(int[] dataArray){ for (int i = 1; i < dataArray.Length; i++) { for (int j = i; j > 0; j--) { if (dataArray[j] < dataArray[j - 1]) {

2022-05-18 17:27:02 288

原创 算法学习二,红黑树查找算法

二叉查找树,对于大多数情况下的查找和插入在效率上来说是没有问题的,但是他在最差的情况下效率比较低。红黑树保证在最坏的情况下插入和查找效率都能保证在对数(Log(n))的时间复杂度内完成。1.红黑树的性质:性质1.节点是红色或黑色 性质2.根是黑色 性质3.所有叶子都是黑色(叶子是NIL节点) 性质4.如果一个节点是红的,则它的两个子节点都是黑的(从每个叶子到根的所有路径上不能有两个连续的红色节点) 性质5.从任一节点到其叶子的所有路径都包含相同数目的黑色节点。注:清晰理解红黑树的性质,

2022-05-16 22:48:16 1155

原创 lua基础知识学习六,面向对象

1.面向对象特征1) 封装:指能够把一个实体的信息、功能、响应都装入一个单独的对象中的特性。 2) 继承:继承的方法允许在不改动原程序的基础上对其进行扩充,这样使得原功能得以保存,而新功能也得以扩展。这有利于减少重复编码,提高软件的开发效率。 3) 多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。 4)抽象:抽象(Abstraction)是简化复杂的现实问题的途径,它可以为具体问题找到最恰当的类定义,并且可以在最恰当

2022-05-07 15:13:06 145

原创 lua基础知识学习五,协同程序,Lua 错误处理,Lua 调试(Debug)

1.协同程序Lua 协同程序(coroutine)与线程比较类似:拥有独立的堆栈,独立的局部变量,独立的指令指针,同时又与其它协同程序共享全局变量和其它大部分东西。线程和协同程序区别线程与协同程序的主要区别在于,一个具有多个线程的程序可以同时运行几个线程,而协同程序却需要彼此协作的运行。在任一指定时刻只有一个协同程序在运行,并且这个正在运行的协同程序只有在明确的被要求挂起的时候才会被挂起。协同程序有点类似同步的多线程,在等待同一个线程锁的几个线程有点类似协同。基本语法方法.

2022-05-07 00:45:02 1301

原创 lua基础知识学习四,模块与包,元表

1.Lua 模块与包模块类似于一个封装库,从 Lua 5.1 开始,Lua 加入了标准的模块管理机制,可以把一些公用的代码放在一个文件里,以 API 接口的形式在其他地方调用,有利于代码的重用和降低代码耦合度。1.1 require 函数Lua提供了一个名为require的函数用来加载模块。要加载一个模块,只需要简单地调用就可以了。例如:require("<模块名>")或者:require "<模块名>"执行 require 后会返回一个由模块常量或函

2022-05-06 20:55:47 284

原创 unity基础学习十八,C# 多线程

线程 被定义为程序的执行路径。每个线程都定义了一个独特的控制流。如果您的应用程序涉及到复杂的和耗时的操作,那么设置不同的线程执行路径往往是有益的,每个线程执行特定的工作。线程是轻量级进程。一个使用线程的常见实例是现代操作系统中并行编程的实现。使用线程节省了 CPU 周期的浪费,同时提高了应用程序的效率。1.线程生命周期线程生命周期开始于 System.Threading.Thread 类的对象被创建时,结束于线程被终止或完成执行时。下面列出了线程生命周期中的各种状态:未启动状态:当线程实

2022-05-04 20:21:11 773

原创 unity基础学习十七,C#高级属性:不安全代码,匿名方法(Anonymous methods)

1.C# 不安全代码当一个代码块使用 unsafe 修饰符标记时,C# 允许在函数中使用指针变量。不安全代码或非托管代码是指使用了指针变量的代码块。1.1 指针变量指针 是值为另一个变量的地址的变量,即,内存位置的直接地址。就像其他变量或常量,您必须在使用指针存储其他变量地址之前声明指针。指针变量声明的一般形式为:type* var-name;下面是指针类型声明的实例:int* p p是指向整数的指针。 double* p p是指向双精度数的指针。 fl..

2022-04-26 23:35:38 326

原创 unity基础学习十六,C#高级属性:泛型(Generic),匿名方法(Anonymous methods)

1.C#泛型(Generic)泛型(Generic)允许您延迟编写类或方法中的编程元素的数据类型的规范,直到实际在程序中使用它的时候。换句话说,泛型允许您编写一个可以与任何数据类型一起工作的类或方法。您可以通过数据类型的替代参数编写类或方法的规范。当编译器遇到类的构造函数或方法的函数调用时,它会生成代码来处理指定的数据类型。下面这个简单的实例将有助于您理解这个概念:using System;using System.Collections.Generic;namespace Gene..

2022-04-26 21:01:22 685

原创 unity基础学习十五,C#高级属性:排序列表(SortedList),点阵列(BitArray)

1.C# 排序列表(SortedList)SortedList 类代表了一系列按照键来排序的键/值对,这些键值对可以通过键和索引来访问。排序列表是数组和哈希表的组合。它包含一个可使用键或索引访问各项的列表。如果您使用索引访问各项,则它是一个动态数组(ArrayList),如果您使用键访问各项,则它是一个哈希表(Hashtable)。集合中的各项总是按键值排序。SortedList 类的方法和属性下表列出了SortedList类的一些常用的属性:Capacity 获取或设置 S...

2022-04-26 20:50:05 651

原创 unity基础学习十四,C#高级属性:C# 委托(Delegate)和 事件(Event)

1.C# 委托(Delegate)C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针。委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。委托(Delegate)特别用于实现事件和回调方法。所有的委托(Delegate)都派生自 System.Delegate 类。1.1.声明委托(Delegate)委托声明决定了可由该委托引用的方法。委托可指向一个与其具有相同标签的方法。例如,假设有一个委托:public delegate

2022-04-20 23:05:07 515

原创 unity基础学习十三,C#高级属性:属性(Property)和索引器C# 索引器(Indexer)

1.C# 属性(Property)属性是一种类的成员,它的实现类似函数,访问类似字段。它的作用是提供一种灵活和安全的机制来访问,修改私有字段。所以属性必须依赖于字段private int dd; public int dd { get{ return xx*3;} set{ xx = value/3;} } 1.1 访问器(Accessors)private string name; // the name field public string ...

2022-04-19 23:08:51 778

原创 unity基础学习十二,C#高级属性:反射(Reflection)

1.C# 反射(Reflection)元数据(metadata):有关程序及其类型的数据,它们保存在程序的程序集中(dll,exe)反射:一个运行的程序查看本身的元数据或其他程序的元数据的行为。反射是.NET中的重要机制,通过反射,可以在运行时获得程序或程序集中每一个类型(包括类、结构、委托、接口和枚举等)的成员和成员的信息。有了反射,即可对每一个类型了如指掌。另外还可以直接创建对象,即使这个对象的类型在编译时还不知道。C#编译运行过程:高级语言->编译->dll/exe文件-&.

2022-04-19 20:12:54 4476

原创 unity基础学习十一,C#高级属性:特性

1.C# 特性(Attribute)特性,是用来给代码添加额外信息的一种手段,我们通常是将特性标记到方法,类或者属性上,在使用的这些结构的时候,通过反射(reflection)这一非常高级的技术,获取它们通过特性标记的信息(在编译好的程序集中,作为元数据),从而进行某些特殊的处理。.Net 框架提供了两种类型的特性:预定义特性和自定义特性。1.1 规定特性(Attribute)规定特性(Attribute)的语法如下:[attribute(positional_parameters,

2022-04-18 20:43:29 721

原创 unity基础学习十,c#垃圾回收机制(GC)

引用C#技术漫谈之垃圾回收机制(GC)(转) - nele - 博客园

2022-04-08 19:04:42 1303

原创 unity基础学习九,Unity常用API

1、Event Function:事件函数Reset() :被附加脚本时、在游戏物体的组件上按Reset时会触发该事件函数 Start() :在游戏初始化时会执行一次 Update() :每一帧都会运行这个方法 FixedUpdate(): 会在指定帧调用该方法多少次 LateUpdate(): 晚于Update的运行顺序,但是FPS和Update是一样的 Awake() Start() : 都是在游戏物体初始化运行一次,但是Awake的运行顺序高于Start的,并且只要脚本中存在Awake方

2022-03-30 23:21:15 4307

原创 unity基础学习八,相对于自身方位以及角度

//求角度 及前后左右方位 public void checkTargetDirForMe(Transform target) { //xuqiTest: target.position = new Vector3(3, 0, 5); Vector3 dir = target.position - transform.position; //位置差,方向 //方式1 点乘 //点积的计算方式为: a·b =| a |·| b | cos &lt.

2022-03-20 11:47:06 960

原创 Unity基础知识学习七,帧同步源码学习

前言视频地址:帧同步教程【合集】_哔哩哔哩_bilibiligithub地址:GitHub - JiepengTan/Lockstep-Tutorial: 帧同步 教程1.ServeraLifeCircle服务端服务端ServerLauncher.Main() 启动入口:

2022-02-19 14:20:48 5789

原创 Unity基础学习六,网络同步

1.什么是网络同步所谓同步,就是要多个客户端表现效果是一致的,比如我们玩王者荣耀的时候,需要十个玩家的屏幕显示的英雄位置完全相同、技能释放角度、释放时间完全相同,这个就是同步。2.为什么要有网络同步略3.如何使用网络同步,使用网络同步的不同方案比较。3.1状态同步将其他玩家的状态行为同步的方式(请求其他玩家的状态并显示在NPC上),一般情况下AI逻辑,技能逻辑,战斗计算都由服务器运算,将运算的结果同步给客户端,客户端只需要接受服务器传过来的状态变化,然后更新自己本地的动作状态、B..

2022-02-15 23:04:45 7644

原创 Unity基础知识学习五,UGUI优化相关

1.什么是UGUI优化2.为什么要有UGUI优化3.如何使用UGUI优化,使用UGUI优化的不同方案比较4.源码实现5.关键点,重要节点,疑难杂症场景参考资料记录最全面的ugui优化策略_bommy游戏的博客-CSDN博客对于Unity的UGUI的优化以及面试可能遇到关于UGUI的问题_头号理想的博客-CSDN博客...

2022-02-11 16:56:19 4961 3

原创 Unity基础知识学习四,UI框架设计

1.什么是UI框架2.为什么要有UI框架3.如何使用UI框架,使用UI框架的不同方案比较4.UI框架源码实现5.UI框架关键点,重要节点,疑难杂症场景

2022-02-10 18:03:58 4118

原创 Xlua热更框架策略,Unity基础知识学习三

1.什么是Xlua热更框架策略2.为什么要有Xlua热更框架策略3.如何使用Xlua热更框架策略,使用Xlua热更框架策略的不同方案比较4.Xlua热更框架策略源码实现5.Xlua热更框架策略关键点,重要节点,疑难杂症场景...

2022-01-25 21:40:17 384

原创 lua数据结构原理,lua基础知识学习二

1.什么是lua数据结构原理2.为什么要有lua数据结构原理3.如何使用lua数据结构原理,使用lua数据结构原理的不同方案比较4.lua数据结构源码实现5.lua数据结构关键点,重要节点,疑难杂症场景引用如何深入理解Lua数据结构和内存占用? - 知乎...

2022-01-25 11:56:05 3303

原创 Unity图集策略,Unity基础知识学习二

1.什么是Unity图集策略2.为什么要有Unity图集策略3.如何使用Unity图集策略,使用Unity图集策略的不同方案比较4.Unity图集策略源码实现5.Unity图集策略关键点,重要节点,疑难杂症场景

2022-01-21 23:26:11 3280

原创 Lua闭包,Lua基础学习一

1.什么是Lua闭包2.为什么要有Lua闭包3.如何使用Lua闭包,使用Lua闭包的不同方案比较4.源码实现5.Lua闭包关键点,重要节点,疑难杂症场景

2022-01-21 22:01:54 842

原创 Unity中的Assetbundle,Unity基础知识学习一

1.什么是Assetbundle2.为什么要有Assetbundle3.如何使用Assetbundle,使用Assetbundle的不同方案比较4.源码实现5.关键点,重要节点,疑难杂症场景

2022-01-20 00:43:19 2295

原创 Unity中的热更新的基础知识,Xlua与ILRuntime基础知识

1.什么是热更新2.为什么要有热更新3.如何使用热更新,使用热更新的不同方案比较4.Xlua源码实现5.Xlua关键点,重要节点,疑难杂症场景

2022-01-19 01:29:44 9341 1

原创 Learn OpenGL 笔记7.4 PBR-Specular IBL(Image based lighting-特殊的基于图像的照明)

在上一章中,我们通过预先计算辐照度贴图作为照明的间接漫反射部分,将 PBR 与基于图像的照明相结合。 在本章中,我们将关注反射方程的specular part镜面反射部分:您会注意到 Cook-Torrance 镜面反射部分(乘以 ks)在积分上不是恒定的,它取决于入射光方向,还取决于入射视图方向。尝试求解所有入射光方向(包括所有可能的视图方向)​​的积分是一种combinatorial overload组合过载,并且对于实时计算而言过于昂贵。 Epic Games 提出了一种解决方案,他们能够为p

2022-01-13 02:20:05 821

原创 Learn OpenGL 笔记7.3 PBR-IBL-Diffuse irradiance(Image based lighting-漫反射辐照度)

IBL,或image based lighting基于图像的照明,是一组照明对象的技术,不是像前一章那样通过直接分析光,而是将周围环境视为一个 big light source大光源。这通常通过操纵立方体贴图环境贴图(取自现实世界或从 3D 场景生成)来完成,以便我们可以直接在我们的照明方程中使用它:将每个立方体贴图纹素视为一个light emitter光发射器。通过这种方式,我们可以有效地捕捉环境的全局光照和总体感觉,让对象在其环境中拥有更好的归属感。由于基于图像的照明算法捕获某些(全局)环境的照明,

2022-01-13 00:04:59 671

原创 Learn OpenGL 笔记7.2 PBR Lighting(physically based rendering基于物理的渲染 光照)

在上一章中,我们为实现基于物理的逼真渲染器奠定了基础。 在本章中,我们将专注于将前面讨论的理论转化为使用直接(或分析)光源的实际渲染器:想想点光源、定向光源和/或聚光灯。让我们从重新审视上一章的最终反射率方程开始:我们现在大部分都知道发生了什么,但仍然是一个很大的未知数是我们将如何准确地表示irradiance辐照度,即场景的总radiance辐射度L。 我们知道,辐射度 L(如计算机图形领域中所解释的那样)测量给定solid angle立体角 ω 上光源的radiant flux辐射通量 φ

2022-01-11 23:53:59 624

原创 Learn OpenGL 笔记7.1 PBR Theory(physically based rendering基于物理的渲染 理论)

PBR,或更通常称为基于物理的渲染,是一组渲染技术,它们或多或少基于与物理世界更接近的相同基础理论。由于基于物理的渲染旨在以物理上合理的方式模拟光线,因此与我们的原始光照算法(如 Phong 和 Blinn-Phong)相比,它通常看起来更逼真。它不仅看起来更好,因为它与实际物理非常接近,我们(尤其是艺术家)可以根据物理参数创作表面材质,而无需诉诸廉价的黑客和调整来使照明看起来正确。基于物理参数创作材质的一大优势是,无论光照条件如何,这些材质看起来都是正确的;这在非 PBR 管道中是不正确的。尽管如此,

2022-01-11 19:15:04 841

原创 Learn OpenGL 笔记6.10 SSAO(Screen Space Ambient Occlusion屏幕空间环境光遮蔽)

我们在基本照明一章中简要介绍了该主题:ambient lighting环境光。 Ambient lighting环境光是一个固定的光常数,我们添加到场景的整体照明中以模拟光的scattering散射。 实际上,光以不同的强度向各种方向散射,因此场景的indirectly间接照明部分也应该具有不同的强度。 一种类型的间接照明近似称为ambient occlusion环境光遮蔽,它试图通过使彼此靠近的creases折痕、孔洞和表面变暗来近似间接照明。 这些区域很大程度上被周围的几何图形遮挡,因此光线可以逃逸的地

2022-01-09 22:55:24 2241

原创 Learn OpenGL 笔记6.9 Deferred Shading(延迟着色)

到目前为止,我们进行照明的方式称为forward rendering前向渲染或forward shading前向着色。我们渲染对象,根据场景中的所有光源对其进行照明。我们为场景中的每个对象分别为每个对象执行此操作。虽然很容易理解和实现,但它对性能的影响也很大,因为每个渲染对象都必须为每个渲染片段迭代每个光源,这很多!由于片段着色器输出被覆盖,forward rendering前向渲染也往往会浪费大量在深度复杂度高的场景(多个对象覆盖同一屏幕像素)中运行的片段着色器。Deferred Shading延迟着

2022-01-09 00:55:21 725

原创 Learn OpenGL 笔记6.8 Bloom(高动态范围)

由于monitor监视器的强度范围有限,明亮的光源和明亮的区域通常难以传达给观看者。 区分显示器上明亮光源的一种方法是让它们发光; 然后光线在光源周围流淌。 这有效地为观看者提供了这些光源或明亮区域非常明亮的错觉。这种光晕或发光效果是通过称为 Bloom 的后处理效果实现的。 Bloom 使场景的所有明亮区域都具有类似发光的效果。 下面是一个有光和没有光的场景示例(图片由 Epic Games 提供):Bloom 提供了关于物体亮度的明显视觉线索。当以一种微妙的方式完成时(有些游戏完全无法做到)

2022-01-08 00:35:25 768

原创 Learn OpenGL 笔记6.7 HDR(高动态范围)

默认情况下,亮度和颜色值在存储到帧缓冲区时被限制在 0.0 和 1.0 之间。 这个起初看似无害的声明让我们总是在这个范围内的某个地方指定光线和颜色值,试图让它们适应场景。 这工作正常并给出了不错的结果,但是如果我们走在一个非常明亮的区域,有多个明亮的光源,总和超过 1.0 会发生什么? 亮度或颜色总和超过 1.0 的所有片段都会被限制为 1.0,这看起来不太好:由于大量片段的颜色值被限制为 1.0,因此每个明亮片段在大区域内都具有完全相同的白色值,从而丢失了大量细节并使其看起来很假。这个问

2022-01-07 22:14:16 2244

原创 Learn OpenGL 笔记6.6 Parallax Mapping(视差贴图)

Parallax Mapping视差贴图是一种类似于法线贴图的技术,但基于不同的原理。Parallax Mapping视差贴图与 displacement mapping位移贴图(看样子是得位移顶点了)技术系列密切相关,这些技术基于存储在纹理中的几何信息来置换或偏移顶点。一种方法是取一个大约有 1000 个顶点的平面,并根据纹理中的一个值来置换每个顶点,该值告诉我们平面在该特定区域的高度。这种包含每个纹素高度值的纹理称为高度图。从简单砖表面的几何属性派生的示例高度图看起来有点像这样:当跨越平面时

2022-01-07 00:18:56 595

原创 Learn OpenGL 笔记6.5 Normal Mapping(法线贴图)

我们通过在这些平面三角形上包裹 2D 纹理来增强真实感,隐藏多边形只是很小的平面三角形的事实。从照明技术的角度来看,确定对象形状的唯一方法是通过其垂直法向量。这种使用每片段法线与每表面法线相比的技术称为法线贴图或凹凸贴图。 应用于砖平面它看起来有点像这样:如您所见,它以相对较低的成本在细节方面提供了巨大的提升。 由于我们只更改每个片段的法线向量,因此无需更改照明方程。基础知识:1.Normal mapping(法线贴图)虽然法向量是几何实体,纹理通常只用于颜色信息, 颜色向量表.

2022-01-06 00:07:18 1374

原创 Learn OpenGL 笔记6.4 Point Shadows(点光源阴影贴图)

我们学习了使用阴影贴图创建动态阴影。但它主要适用于定向(或聚光)灯,因为阴影仅在光源方向上生成。 因此,它也被称为directional shadow mapping定向阴影贴图,因为深度(或阴影)贴图仅从光所看到的方向生成。本章将重点关注的是在所有周围方向上动态阴影的生成。 我们使用的技术非常适合点光源,因为真正的点光源会向各个方向投射阴影。 这种技术被称为点(光)阴影或更早以前称为omnidirectional shadow maps全向阴影贴图。directional shadow mappi

2022-01-05 19:05:24 1022 1

RoadTest.hip

Houdini生成路面的一个简单实现

2021-12-31

DesignPattern.zip

在egret的项目工程里面实现24种常用的设计模式

2019-08-06

Websocek笔记三 egret+skynet使用protobuf

这是我的博客《Websocek笔记三 egret + skynet使用 protobuffer》中用到的源代码

2019-03-01

Websocek笔记二egret工程源代码

这是我的博客,《Websocek笔记二 搭建egret序列化字节流传输环境》中的源代码文件

2019-02-15

笔记十三 Egret拖拽对象与吸附对象

这是我的博客《笔记十三 Egret拖拽对象与吸附对象》中的源代码

2018-11-08

笔记十二Egret分帧加载图形对象

这是我的博客《笔记十二 :Egret分帧(frame)加载图形对象(基于通用MVC框架)》中的源代码

2018-11-02

笔记十快速建立基本界面 + Egret制作转盘效果

我的博客《笔记十快速建立基本界面 + Egret制作转盘效果》中的源代码

2018-11-01

笔记十Egret动画式加载场景

这是我的博客《笔记十 :Egret动画式加载场景(基于通用MVC框架)》中使用到的源代码

2018-11-01

笔记九Egret-折叠List源代码(包括笔记八).zip

我的博客笔记九和笔记八的源代码,由于时间比较紧,这次的博客更偏向笔记性质,而不是教程性质,必须打开源代码,接着再一步一步参考以下的笔记,不然很多细节上的东西漏掉了会出现大量错误。

2018-10-24

笔记一到笔记七的源代码

这个资源是我播客里面笔记一到笔记七中的源代码,EgretH5通用MVC框架的入门操作,包括基于这个框架编写的几个UI界面的,供学习以及今后快速开发使用。

2018-10-15

HFS http文件服务器软件

打开后,软件会建立一个简单的HTTP文件服务器,把相应的文件夹拖入里面,就可以实现浏览器访问

2018-08-22

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除