Unity3D中OpenGL2怎么中办四号文修改党章

最近发现有很多人不知道在unity中可以创建和修改mesh,以为mesh只能从3dmax等软件中导入,所以这篇就相当于科普了。
首先介绍如何创建mesh。
先创建一个空物体,名为test。
然后为这个物体增加 meshrender 和 meshfilter 两个组件
下面就要写将要赋给它的脚本了,先贴上代码,解释在下面。
using UnityE
using System.C
public class Test: MonoBehaviour
void Start()
Vector3[] newVertices = { new Vector3(0, 0, 0), new Vector3(0, 1, 0), new Vector3(1, 1, 0), new Vector3(1, 0, 0) };
Vector2[] newUV = { new Vector2(0, 0), new Vector2(0, 1), new Vector2(1, 1), new Vector2(1, 0) };
int[] newTriangles = {0,2,1,0,3,2};
Mesh mesh = new Mesh();
GetComponent&MeshFilter&().mesh =
mesh.vertices = newV
mesh.uv = newUV;
mesh.triangles = newT
要创建一个mesh必须要准备好三个数组分别是顶点数组,三角形数组,uv数组。
包括这个mesh中所有的顶点,如
Vector3[] newVertices = { new Vector3(0, 0, 0), new Vector3(0, 1, 0), new Vector3(1, 1, 0), new Vector3(1, 0, 0) };
其中有四个顶点,分别为正方形四个角。
三角形数组
指定如何构成每个三角形,同时也确定了三角形的个数,如
int[] newTriangles = {0,2,1,0,3,2};
这行代码表示0,2,1(对应着newVertices[0],newVertices [2],newVertices [1]),构成第一个三角形的三个角,数字的顺序表示顺逆时针,同时确定了三角形的正反面,后面的0,3,2同理,这就代表此mesh有两个三角形。
这是一个vector2数组,用来确定顶点数组中每个顶点的uv坐标,这在下面将演示给大家看。
代码写好之后,把脚本贴到Test物体上,然后设置一个material,如下图:
下面是运行后的图片:
至于为什么uv数组是什么,你可以认为这张图片的四个角的uv坐标分别为(0,0),(1,0),(1,1),(1,0),如果我把上面代码中的uv数组改成
Vector2[] newUV = { new Vector2(0, 0), new Vector2(0, 1), new Vector2(0.5f, 1), new Vector2(0.5f, 0) };
那就会变成下面这个样子:
有一点要注意的是,顶点数组中的顶点坐标都是在模型坐标系中的,就是以刚开始创建的Test空物体的坐标为原点。
以上只是简单创建了一个平面mesh,至于如何创建3d mesh和修改mesh,相信聪明的你一定会啦。
如果有错误或疑问,请评论,如果觉得还不错或有帮助,请关注或顶一下,谢谢啦~~~ (??ω?`)
本文已收录于以下专栏:
相关文章推荐
Unity 3D 创建Mesh
一、Unity 3D 创建面片(Mesh)
Mesh是一种网格,可以产生像地形那样震撼的效果,那么怎样创建Mesh呢?那就要知道Mesh包含什么!
Mesh(网格):...
最近发现Mesh很牛的样子,虽然以前也见过人家大牛用这个写过工具,当时没大在意,现在开始接触,觉得挺好玩的,首先先上我画的几个图:
据说还可以画各种形状,原理就是所有图形都是由三...
背景最近碰到个功能, 要画一个扇形图案, 如下图:
需求是这个图形跟随角色, 在角色背后, 并且每个角色的扇形角度可能不同。
So, NGUI和UGUI很好用的FilledTyp...
简介 Introduction
这个教程将让你学会如何创建一个星型控件以及如何制作这个控件的自定义编辑器。你将学会:
动态的建立Mesh。使用一个嵌套类。建立一个自定义编辑器。使...
最近发现有很多人不知道在unity中可以创建和修改mesh,以为mesh只能从3dmax等软件中导入,所以这篇就相当于科普了。
首先介绍如何创建mesh。
先创建一个空物体,名...
篇unity3d教程我们来学习下,如何动态创建Mesh来制作一个闪亮的星星Star,看下最终效果图
unity star下面开始,本篇unity3d教程将让你学会如何创建一个星型控件以及如何制作...
Unity运行时,动态创建的Mesh挂载到MeshFilter组件上,并不能保存到本地Prefab文件里。在运行的场景里,拖拽正确配置的MeshFilter对象到Unity资源管理器。生成的Prefa...
using UnityE
using System.C
using System.Collections.G
//实现了MeshBuilder得类,会...
参考链接:http://blog.csdn.net/zuoyamin/article/details/9287507
对于自定义mesh,有三点很重要:
1.顶点个数=三角形数+2;三角形顶点数=...
模型导入unity后,可以使用unity的Inspector面板对模型在某个坐标轴上进行平移、旋转和缩放操作(如图1)。
Inspector面板提供功能是所见即所得的,调整后立刻...
他的最新文章
讲师:董岩
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)Unity3D -force-opengl 全屏有黑块的问题解决办法日期: &&&作者: WilliamJiang&&&分类: &&& &&&评论: 使用PC平台上面 -force-opengl全屏的时候,屏幕上面出现黑快,我用的是unity3d 4.5.3,折腾好久,后来在国外的网站上查询到这是一个bug,不知道新版本解决没有,目前有个解决办法是,设置窗口模式全屏分辨率,关闭分辨率选择对话框,发布后然后使用-popupwindow-force-opengl运行程序。全屏,无黑快区域,问题解决。
unity3d bug提交地址 /issues/unity-fails-to-render-correctly-using-force-opengl-on-windows-standalone-builds-in-fullscreen
-- EOF -- 看完了, ^_^
2017年十一月
6789101112
13141516171819
20212223242526
& 2017&会飞的鱼 -OpenGL、Unity3D与Android之间的交互
命悬一线,多说无益。 ------斯维因
今天看了一些lol视频,感觉可以放松一下,因为到现在为止,花费了10天(其中还有三个整天帮同学去补考,我也是醉了)的时间将项目中我要实现的功能都实现了。感觉好爽,想起接手这个项目的时候毫无头绪,犹豫不决,真的好爽。所以写下这篇文章纪念一下,这十天学到的东西确实不少,OpenGL、矩阵论、unity3D的基本操作,C#基本语法,Android与unity3D之间的交互,当然还有补考看的信号与系统(能不能过,为同学祈祷吧)。
首先从我的OpenGL开始说起,运行在可嵌入设备(如手机、FPGA)的OpenGL被称作OpenGL
ES,很高大上,Android系统自带OpenGL库函数,所以不需要刻意的导入,但是1.0版本与2.0版本有所不同,主流是OpenGL
ES2.0。介绍一下OpenGL的操作流程,首先建立一个GLSurfaceView视图。
先介绍一下计算机图形学的概念:
渲染:计算机根据模型绘制图像的过程。模型是由集合图元构成,图元是由顶点指定。最终渲染的图像是由像素显示到屏幕上,像素是显示硬件能够放置到屏幕上的最小元素,有关像素的信息(如颜色)在系统内存中被组织为位面,位面构成了帧缓存(其中包含了图形显示设备为控制屏幕上所有像素的颜色与亮度的信息)。
window(窗口):是一个可以提供显示区域的视图容器,具有将事件分给视图的功能,本身不能显示任何可见的内容。应用程序只有一个窗口,并且是占据整个屏幕的,在视图的角度来说,所有视图都是他的子视图。
视图:在用户界面展示与响应用户事件,用户交互方面起到了重要的作用。视图中所有的对象都需要被渲染。
其中窗口、视图与视图控件之间的关系如下:
GLSurfacevView是窗口一部分,所以没有动画与变形的特效。但是为了实现动画效果,我们可以使用OpenGL中的TextureView(纹理视图),该视图可以渲染OpenGL可以像常规视图一样被操作,但是该类没有内置OpenGL初始化操作,所以使用该视图,一执行自定义的OpenGL初始化,并在这个视图上运行,另一种就是讲GLSurfaceView的源代码去除,适配到TextureView上。
注意点:模拟器上的GPU不支持OpenGL
ES2.0,所以在编写程序后要在真机上运行或者可以添加代码是否是模拟器运行,并假设其支持OpenGL
ES2.0,保证程序的正常运行。
final boolean supportsEs2 =&
&configurationInfo.reqGlEsVersion & =
0x20000 || (Build.VERSION.SDK_INT &=
Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1
&&(Build.FINGERPRINT.startsWith("generic")
||Build.FINGERPRINT.startsWith("generic")
||Build.MODEL.contains("google_sdk")
||Build.MODEL.contains("Emulator")
||Build.MODEL.contains("Android SDK built for
(1)Renderer(渲染)类
onSurfaceCreated():当surface(而不是我们看到的视图)被创建的时候,该方法会被调用,这个发生在程序第一次运行的时候,并且当设备从切换回来的时候,也可能会调用该函数。
onSurfaceChanged():每次surface尺寸发生变化的时候,该方法被调用,例如横竖切屏。
onDrawFrame():当绘制每一帧,调用该函数,在该方法中,一定要绘制一些东西,及时只是清空屏幕,因为在该方法后,渲染缓冲区会被交换并显示到屏幕上,如果什么都没有,可能会看到糟糕的闪烁效果。
(2)OpenGL只支持点、线、三角形的画图方式。
unity3D是一款强大的游戏引擎,可以图形化界面完成复杂的图像操作,但是这些图像的操作都是以OpenGL为基础设计的。
新手遇到的问题:
(1)首先,unity3D中文件的导出(例如Android的工程文件或者是apk文件),点击file-build
settings,在里面选择Android的选项,其中还可以生成ios、win运行的文件,但是此时需要注意的是需要修改identification,因为使用默认的程序是不给予通过的,其中的名字可以随意取,例如com.xd.kp,可以点击player
settings,在右边出现了inspector,最上面有个product name,这只是工程文件的取名,在other
settings中修改identification。
(2)对软件内容的区分,GameObject与Component分别是对象与属性的意思,即实物与属性,在动画中添加山、水、方块、平板都属于GameObject,然后给这些添加花纹、界面、控制脚本,都属于Component。每次添加Component后在右边多出一个属性,在这个属性下面也可以对这些值进行修改。
(3)在unity3D中有四种坐标系,分别是世界坐标系、屏幕坐标系(使用像素来进行定义,左下角为(0,0),右上角为(screen.width,screen.height),z的坐标是根据世界坐标来衡量的)、视口坐标(视口坐标的标准是和相机对应的,相机的左下角为(0,0),右上角为(1,1),其中z坐标也是世界坐标),GUI界面的坐标系(与屏幕坐标系相似,但是左上角为(0,0),右下角(screen.width,screen.height))。
(4)unity3D可以C#与js脚本支持,C#中语句的用法与Java的语法类似,在unity3D中的执行过程与Android类似,都是由底层决定运行顺序,如先执行start(),创建出相应的场景,然后执行update()更新每一帧的状态。
(5)运动规律,transeform(变换),场景中每一个物体都有一个transform,来控制物体的位置、平移与缩放,其中位移是以自身的坐标系为基准的,而不是以世界坐标系为基准的,其中的position是位置,主要是以世界坐标为基准。
(6)触摸屏,unity3D同时支持手机触摸与鼠标(mouse)的点击与滚动,在使用多点触摸的时候,需要在start()中声明可以多点触摸,即Input.multiTouchEnable
在这里可以区分双击、单击与滑动,滑动:即在触摸后几秒钟内不会离开触屏的效果,单击:在触摸之后,极短的时间内手指已不再触屏上,可以写一个时间段(极短)函数,判断是否还在触摸状态touch.phase
TouchPhase.Ended,判断触摸结束。而与TouchPhase.canceled代表的是系统取消对触摸的跟踪。而双击:unity3D提供了单击与双击的判断函数tapcoun。Input.GetAxis("Mouse
X");可以获取手指在X轴方向上的位移,Input.GetAxis("Vertical"),获取的是X轴方向的坐标。
(7)路径规划:其中unity3D封装了自己的两个插件来实现自动与动态寻路,寻路主要就是标记出可以行走的路径与不能行走的路径,排掉不能一些障碍物的相应层与是的不能行走的高度,分别是Astar算法与NavMesh算法。Astar的用法:需要下载Astar插件,去网站的官网去下载,有免费的。去unity3D自带的Asset
Store(window--Asset Store)下载是收费的。下载完成后将其放在D:\Program Files\Unity
5.0.0b1\Editor\Standard
Packages下,unity3D重新启动的时候会自动加载这个文件下面的插件(component)。而Astar的原理点击Astar
Path下面的add Grid Graph,为其添加属性,如下图
其中width与Depth与node
size是相照应的,width与Depth的单位都是nodes,所以形成的底图的总长度就是
L = width(Depth)*Node
点击下面的scan后会在scene场景中出现Grid,这里面有几个参数,Max Climb是指最大的攀爬高度,Climb
Axis是指攀爬的轴的方向,该轴一定要是Y轴,不然所有的地形都无法通过。接下来就是为障碍物增添属性,Collision
type为碰撞属性,一般为ray射线碰撞,Mask代表是哪些是障碍物,其中选择的是你在生成object中layer设置的名称,出现效果如下图所示:
创建一个capsule,用来寻路的起始点,为其增加控件Seeker,编辑一个C#脚本文件,代码如下,用来寻找路径:
using UnityE
using System.C
//Note this line, if it is left out, the script won't know
that the class 'Path' exists and it will throw compiler
//This line should always be present at the top of scripts
which use pathfinding
public class AstarAI : MonoBehaviour
//The point to move to
public Vector3 targetP
private CharacterC
//The calculated path
//The AI's speed per second
public float speed = 200;
//The max distance from the AI to a waypoint for it to
continue to the next waypoint
public float nextWaypointDistance = 3;
//The waypoint we are currently moving towards
private int currentWaypoint = 0;
public void Start()
seeker = GetComponent();
controller = GetComponent();
//Start a new path to the targetPosition, return the result to
the OnPathComplete function
//seeker.StartPath(transform.position, targetPosition,
OnPathComplete);
public void OnPathComplete(Path p)
Debug.Log("Yay, we got a path back. Did it have an error? " +
if (!p.error)
//Reset the waypoint counter
currentWaypoint = 0;
void Update()
// see if user pressed the mouse down
if (Input.GetMouseButtonDown(0))
// We need to actually hit an object
(!Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition),
out hit, 100))
// We need to hit something (with a collider on it)
if (!hit.transform)
// Get input vector from kayboard or analog stick and make it
length 1 at most
targetPosition = hit.
seeker.StartPath(transform.position, targetPosition);
public void FixedUpdate()
if (path == null)
//We have no path to move after yet
if (currentWaypoint &= path.vectorPath.Count)
Debug.Log("End Of Path Reached");
//Direction to the next waypoint
Vector3 dir = (path.vectorPath[currentWaypoint] -
transform.position).
dir *= speed * Time.fixedDeltaT
controller.SimpleMove(dir);
//Check if we are close enough to the next waypoint
//If we are, proceed to follow the next waypoint
if (Vector3.Distance(transform.position,
path.vectorPath[currentWaypoint]) & nextWaypointDistance)
currentWaypoint++;
寻径完成后,我们可以通过path.vectorPath得到一个path数组,里面是一个List类型的链表,记载着路径中的每一个点的坐标,我们可以进行逐个点的移动与处理。
(2)NavMesh的用法:
window----Navigation,然后右边会出现Navigation对话框。其中Object是对应当前选择的物体的,Bake是对应这全局的选项。all:显示全局的选项。Mesh
Render:显示可以渲染的网格物体。Terrains:显示地形物体
只有在选择Navigation Static后才能对下面进行选择,Generate
OffMeshLinks是选择该物体是否根据全局物体的高度、可跳跃的宽带的选项自动生成OffMeshLinks。Navigation
Area是用来设置对该物体的属性,如可走、不可走。其中可以在Areas中添加这些属性。在寻路的角色上必须添加NavMesh组件,然后对你添加的plan(底板)改为Navigation
Area为walkable,然后bake一下,这样该plan便可以行走了,在cube设置为Not
Walkable,在bake一下,然后该cube便不可以行走了。
将该脚本挂载角色上,便可以实现自动寻路(其中在界面上设置一个target,什么都是可以的,cube等)。
爬楼梯、跳跃,NavMesh都是通过OffMeshLink来做的,其中,可以两种方式达到效果。首先在爬取的物体(L1)两边各加上一个小物体(L2,L3),然后将OffMeshLine空间加到需要爬取的物体上,
在下面的物体如L3挂载在startPoint上,L2挂载在endPoint上,再次bake后,此时启动程序便可以实现角色的攀爬效果。接下来实现跳跃的效果,在bake中的Drop
Height与Jump Distance中设置我们预先的距离。
第二种方式勾选Object下面的OffMeshLink,再次bake,这是unity自己计算得出我们想要的结果。这样就实现了角色的跳跃。其中的缺点:爬楼梯与跳跃似乎是一瞬间完成的。这是由于在Nav
Mesh Agent中Auto Traverse Off Mesh
Link(自动通过OffMeshLink)选项的。这样的意思是人物只要到了OffMeshLink的开始点,就会自动的移动到OffMeshLink的结束点。
如果想要自己控制物体的状态,需要自己编写脚本:
首先各位最好有用状态来控制角色的概念。比如人物可以分为站立、走路、跑步、上下楼梯、横向跳跃和往下掉落几种状态,针对NavMesh来说,人物简单的可以分为站立、正常的NavMesh寻路,和通过OffMeshLink移动几种状态。
先把 Auto Traverse Off Mesh Link选项取消。
然后,当人物在通过OffMeshLink移动的状态(可以用NavMeshAgent.isOnOffMeshLink来判断),获取到当前通过的OffMeshLink:
OffMeshLinkData &link =
NavMeshAgent.currentOffMeshLinkD
这样你就能获取到link的开始点和结束点的坐标(link.startPos和link.endPos),这时候你的人物就可以用最简单的Vector3.Lerp来进行移动,当人物的位移到达了结束点的坐标,人物的OffMeshLink移动状态就可以结束,又重新变回正常寻路或者站立的状态了。在这个Vector3.Lerp的过程中,你可以随意的控制人物的爬行或者跳跃的动作。
这是我在做的时候参考的一个大神的连接:http://liweizhaolili./blog/static//
(8)android与unity3D之间的交互,将unity3D嵌入到Android视图中一共有三种方式,我是使用eclipse写Android的,所以我更加喜欢将这些东西加入到elipse中。下面介绍其中两种方式:
方式1:构建好unity3D画面后,点击工具栏中的file---build
settings---Android,在右边有一个google Android
project,选中后,下面的build变为export,如下图
导出后,然后将其导入eclipse直接得到一个Android工程,此时便可以可以直接并运行到手机中,此时有一个UnityPlayerNativeActivity类,这个类是继承NativeActivity,最终还是继承Activity,所以它具有Activity所有的属性,改变第一启动界面,新建一个XML,在xml中RelateLayout中添加一个linearlayout,并在自己新建的MainActivity(继承UnityPlayerNativeActivity)获取这个linearlayout,并到UnityPlayerNativeActivity中的view视图,将其添加到linearlayout中,这样我们就完成了界面的设计,还要修改AndroidManifest.xml中的启动activity。Android端向unity3D端传送消息:UnityPlayer.UnitySendMessage("","","");,第一个参数是对unity3D端C#脚本中的名称(this.name="adc")如下图:
第二个参数是调用其中的方法名,第三个参数是传递的参数,让人很不爽的是,只能传递字符串类型。
使用UnitySendMessage方法传递消息会有1帧的延迟。也就是说:当你使用一个button键来调用该方法的时候,你需要点击两次才能触动这个方法,但是就像点击一次,要怎么办?前面只是说了1帧,unity3D运行速率是每秒50帧左右,所以我们可以将该方法放在一个两次循环中,但是该循环中需要加一个很短的延时函数,因为cpu运行速率比每秒50帧快多了,所以两次运行完了,但是还没有到第二帧的延迟,这也是不行的。在这种情况下手机无法聚焦在Android端的触控上。所以在AndroidManifest.xml中添加:
这样就完成了unity3D到Android的转换,还有就是在Android工程的配置文件中会有一个debuggle的东西,不要管它,可以直接删除。
方式二:打开到方式一的界面,生成apk文件,将该文件改为zip格式,解压,取出其中的Asset文件放在工程目录下,覆盖掉其中的Asset文件,然后将解压文件中的lib文件下面文件复制到工程文件下面的libs文件,(D:\Program Files\Unity 5.0.0b1\Editor\Data\PlaybackEngines下面放有产生各种格式文件的必要文件)。将D:\Program Files\Unity 5.0.0b1\Editor\Data\PlaybackEngines\androidplayer\development\bin的文件放在工程文件下面的libs下作为第三方的jar包,其目录如下图所示:
& & & & & & & & &
然后在oncreate()中方法下面添加代码:
&mUnityPlayer = new UnityPlayer(this); &
& & & & int glesMode = mUnityPlayer.getSettings().getInt("gles_mode", 1); &
& & & & boolean trueColor8888 = &
& & & & mUnityPlayer.init(glesMode, trueColor8888);
& & & & View playerView = mUnityPlayer.getView();
& & & & setContentView(R.layout.activity_main); &
这样变添加了代码,然后和方式一类似改变AndroidManifest.xml文件中的配置文件,与添加方法。然后在手机中运行代码。这样就实现了unity3D在手机上的。
第三种方式是将文件导入unity3D中,这种方式似乎很常见,我比较喜欢使用eclipse,所以这种方式在网上寻找吧。
学无止境,为自己加油!!!!
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。畅言近期评论
WP Cumulus Flash tag cloud by
9 or better.
2017年十一月
13141516171819
20212223242526原地址:http://blog.csdn.net/huutu/article/details/?utm_source=tuicool&utm_medium=referral
在游戏中,怪物或者人受到攻击后,会有变白的效果。这个效果是Shader实现的。在判定被攻击的时候切换Shader。
[csharp]&&
[csharp]&&
代码没有问题,但是在4S等低端设备上,被攻击时会明显卡顿,时间长达1S。
于是用Unity的性能分析器,在被攻击时暂停,可以看到:
在OpenGL中用过Shader的同学们看到下面的函数名字就知道问题所在了&
Shader.CreateGPUProgram()
这个函数过程就是创建GLProgram链接Shader的一个过程,在Unity3d中的Shader.Find()是直接创建GLProgram的。
如果是自己去写引擎,GLProgram一般在初始化的时候就会创建完毕,然后用类似GLProgramManager管理。
Unity中的问题我们也可以用这个方法解决,但是Unity提供了简便方法。
点击Editor - Project Setting - Graphics&
右侧 Always Included Shaders,把我们需要使用的Shader拖到里面去吧
本文已收录于以下专栏:
相关文章推荐
renderer.material.shader = Shader.Find("Custom/SimpleAlpha");代码控制切换shader。
在Unity中,我们在进行物体控制和交互过程中经常会涉及到动态改变Shader的情况,如将一个三维物体用网格显示、将三维物体的表现形式进行变更等等。
在Unity中主要通过MeshRenderer组...
定义一个材料,放在Resources文件夹中
然后贴上Shader代码Shader "Custom/ScriptControlShader" {
Properties {
_Color ("Co...
using UnityE
using System.C
public class TestScriptReplaceShader : MonoBehaviour
Unity引擎是一个非常强大的支持跨平台开发的游戏引擎,基于Mono这个开源.Net的框架设计而成,在Unity中定义了ShaderLab来组织Shader的内容,针对不同平台进行编译。了解了Shad...
1、我们一般把资源和代码作为两个工程。资源工程导出assetbundle供代码工程使用。这么做主要是防止资源过多导致代码工程启动速度慢,影响开发效率。
2、尽量避免使用Resources文件夹。这个...
获取方法如下:
gameObject.render.materials.GetFloat("propName");
gameObject.render.materials.SetFloat("pro...
官方文档:file:///C:/Program%20Files/Unity/Editor/Data/Documentation/en/Manual/SL-ShaderReplacement.html圣...
切换场景,我们需要屏幕白到黑,一般来说,在相机前面加个Image,控制他的透明度就好了。但是个人觉得这种虽然达到目的,但是可能之后会有各种小问题,所以用网上的Shader方法来可能会更好。脚本直接挂在...
Shader的种类Unity Shader 是将传统的硬件Shader(由 Cg / HLSL编写)嵌入到独有的描述性结构中而形成的一种代码生成框架,最终会自动生成各硬件平台自己的Shader,从而实...
他的最新文章
讲师:董岩
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)}

我要回帖

更多关于 qq密码修改中心 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信