<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[QO_GQ的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/QO_GQ</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; QO_GQ]]></copyright><item><title><![CDATA[【unity】GPU顶点动画]]></title><link>https://blog.youkuaiyun.com/QO_GQ/article/details/146297520</link><guid>https://blog.youkuaiyun.com/QO_GQ/article/details/146297520</guid><author>QO_GQ</author><pubDate>Sun, 16 Mar 2025 23:35:48 +0800</pubDate><description><![CDATA[[unity]GPU顶点动画]]></description><category></category></item><item><title><![CDATA[调用unity的Application.Quit()；方法退出会导致重启问题]]></title><link>https://blog.youkuaiyun.com/QO_GQ/article/details/138867251</link><guid>https://blog.youkuaiyun.com/QO_GQ/article/details/138867251</guid><author>QO_GQ</author><pubDate>Tue, 14 May 2024 19:58:20 +0800</pubDate><description><![CDATA[杀死前台进程 , 将所有的 Activity 关闭 , 然后调用 android.os.Process.killProcess(android.os.Process.myPid()) 或 java.lang.System.exit(0) 中的一种方法即可;如果当前进程处于前台 , 杀死该进程后 , Android 系统会重启该进程 , 这是 Android 系统本身的机制;以上方法在demo都可以使用并成功退出，但是在项目上就是不行。但是我使用demo工程，调用这个是正常的，摸不着头脑。]]></description><category></category></item><item><title><![CDATA[unity Handles方法绘制相关]]></title><link>https://blog.youkuaiyun.com/QO_GQ/article/details/135277750</link><guid>https://blog.youkuaiyun.com/QO_GQ/article/details/135277750</guid><author>QO_GQ</author><pubDate>Fri, 29 Dec 2023 09:41:54 +0800</pubDate><description><![CDATA[Handles 方法]]></description><category></category></item><item><title><![CDATA[异步加载回调问题，多个资源异步加载，让其全部加载完回调]]></title><link>https://blog.youkuaiyun.com/QO_GQ/article/details/130991736</link><guid>https://blog.youkuaiyun.com/QO_GQ/article/details/130991736</guid><author>QO_GQ</author><pubDate>Thu, 01 Jun 2023 17:13:35 +0800</pubDate><description><![CDATA[这样就可以实现全部加载完成后执行回调，为什么呢？]]></description><category></category></item><item><title><![CDATA[unity 中c#进行调用Android Java 中的类和方法（AndroidJavaClass）]]></title><link>https://blog.youkuaiyun.com/QO_GQ/article/details/130185961</link><guid>https://blog.youkuaiyun.com/QO_GQ/article/details/130185961</guid><author>QO_GQ</author><pubDate>Sun, 16 Apr 2023 18:30:32 +0800</pubDate><description><![CDATA[发现了一个类AndroidJavaClass，可以调用Android Java 中的类和方法，比如说获取当前设备的基带版本号，检测设备是否可以进行拨号，然后跳转到拨号界面啥的。类包含了关于设备、系统版本、硬件和制造商等信息的静态字段和方法。方法返回运营商无线电固件版本号，即基带版本号。变量包含当前 Android 设备的基带版本号。对象，该对象表示 Android 系统中的。并将其结果存储在字符串变量。这行代码中，我们调用了。]]></description><category></category></item><item><title><![CDATA[unity 判断当前设备是否是模拟器（安卓）]]></title><link>https://blog.youkuaiyun.com/QO_GQ/article/details/130104105</link><guid>https://blog.youkuaiyun.com/QO_GQ/article/details/130104105</guid><author>QO_GQ</author><pubDate>Wed, 12 Apr 2023 18:36:36 +0800</pubDate><description><![CDATA[ps：由于没用安卓相关开发知识，可能只是我写错了。发现都是不行的，因为现在的模拟器都会伪装==这个也是在手机上面有，模拟器上面是没有的。还有一个这个方法：获取设备固件版本号。测试了一下，都是没用成功。最后是在是没法了，只能打印所有的。在手机上面测试是有值的。]]></description><category></category></item><item><title><![CDATA[unity开发遇到的问题和解决方法相关汇总]]></title><link>https://blog.youkuaiyun.com/QO_GQ/article/details/130063610</link><guid>https://blog.youkuaiyun.com/QO_GQ/article/details/130063610</guid><author>QO_GQ</author><pubDate>Mon, 10 Apr 2023 16:44:30 +0800</pubDate><description><![CDATA[在开发游戏的过程中，总会遇到一些问题，但是解决了，没有记录解决方法，时间间隔又久，后面再遇到，又要趟一次坑…，所以先在这里记录一下，后面遇到就可以直接在这里来看解决方法了：这篇文章是不定时更新的，遇到一次坑，更新一次。]]></description><category></category></item><item><title><![CDATA[unity 打包获取android手机系统权限]]></title><link>https://blog.youkuaiyun.com/QO_GQ/article/details/129888809</link><guid>https://blog.youkuaiyun.com/QO_GQ/article/details/129888809</guid><author>QO_GQ</author><pubDate>Fri, 31 Mar 2023 21:27:11 +0800</pubDate><description><![CDATA[查了一下资料，unity里面自带有动态获取用户权限的方法Permission，需要UnityEngine.Android命名空间，使用动态获取接口RequestUserPermissions，参数是一个string数组类型参数。]]></description><category></category></item><item><title><![CDATA[Application.targetFrameRate安卓apk上设置帧率问题]]></title><link>https://blog.youkuaiyun.com/QO_GQ/article/details/129436610</link><guid>https://blog.youkuaiyun.com/QO_GQ/article/details/129436610</guid><author>QO_GQ</author><pubDate>Fri, 10 Mar 2023 10:12:28 +0800</pubDate><description><![CDATA[unity安卓机上进行锁帧Application.targetFrameRate]]></description><category></category></item><item><title><![CDATA[unity Editor扫描路径下场景或者组件，并进行批量修改]]></title><link>https://blog.youkuaiyun.com/QO_GQ/article/details/129369901</link><guid>https://blog.youkuaiyun.com/QO_GQ/article/details/129369901</guid><author>QO_GQ</author><pubDate>Mon, 06 Mar 2023 20:36:00 +0800</pubDate><description><![CDATA[unity Editor扫描路径下场景或者组件，并进行批量修改]]></description><category></category></item><item><title><![CDATA[unity shader卡通渲染（描边）+阴影+多光源处理]]></title><link>https://blog.youkuaiyun.com/QO_GQ/article/details/119616656</link><guid>https://blog.youkuaiyun.com/QO_GQ/article/details/119616656</guid><author>QO_GQ</author><pubDate>Wed, 11 Aug 2021 20:57:01 +0800</pubDate><description><![CDATA[说道卡通渲染，应该都会想到描边：
我所学的描边有三种：
一种是计算边缘深度检测描边
一种是色差检测描边
一种是利用顶点法线向外扩展返回单色pass，使用正面裁剪
我用的第三种：
pass
{
		//剔除前面 （朝向摄像机的面）保留内部渲染
		Cull Front
		CGPROGRAM
		#pragma fragment frag

		float4 _LineColor;
		float _Line;
		struct a2v {
			float4 pos:POSITION;
			float3 ]]></description><category></category></item><item><title><![CDATA[基于ugui和dotween的多消息提示小动画：]]></title><link>https://blog.youkuaiyun.com/QO_GQ/article/details/119615880</link><guid>https://blog.youkuaiyun.com/QO_GQ/article/details/119615880</guid><author>QO_GQ</author><pubDate>Wed, 11 Aug 2021 20:16:10 +0800</pubDate><description><![CDATA[前提：必须包含DOTween插件，当然，如果不用插件做缓动动画，也可以用animation动画自定义相对应的缓动效果：
效果：

其实这个也挺简单的，用了两个队列（其中一个我还是使用了list），一个是消息显示队列，一个是消息缓存对象池（隐藏）。
我用的是Resources.Load加载的预制体
_layer 是我自定义划分的消息动画层（一个画布Canvas）
代码比较简单，我就不说了：
using DG.Tweening;
using System.Collections;
using System.Co]]></description><category></category></item><item><title><![CDATA[UGUI自定义ListView列表组件（虚拟列表）]]></title><link>https://blog.youkuaiyun.com/QO_GQ/article/details/119612555</link><guid>https://blog.youkuaiyun.com/QO_GQ/article/details/119612555</guid><author>QO_GQ</author><pubDate>Wed, 11 Aug 2021 17:57:19 +0800</pubDate><description><![CDATA[最近在尝试使用ugui，发现这个还真的不方便，很多都是基础组件。自带的ScrollRect没有虚拟列表，如果有10000个，那岂不是需要创建10000个子对象？
不过，身为程序员怎么能不偷懒呢？就打算自己封装一个组件：
效果：

用途一般是用来做排行榜啊，显示列表等：像这种

首先需要一个数据结构体，作为后续存数据：
public struct ItemDate
{
    public int index;
    public object data;
    public UIList m_paren]]></description><category></category></item><item><title><![CDATA[（unity）游戏中摇杆：控制角色移动]]></title><link>https://blog.youkuaiyun.com/QO_GQ/article/details/119256120</link><guid>https://blog.youkuaiyun.com/QO_GQ/article/details/119256120</guid><author>QO_GQ</author><pubDate>Fri, 30 Jul 2021 21:21:56 +0800</pubDate><description><![CDATA[摇杆其实挺简单的，只需要一个需要控制的角色target和控制其移动的方向传出去，调用角色的move函数就可以了：
我是传出去使用的角度，基于摄像机当前前方向=摇杆上方向和摇杆当前到中心的向量之间的角度旋转：有点绕：如图所示


//isDown是一个bool变量，记录是否正在使用摇杆 
if (Input.GetMouseButtonDown(0))
{
	//这个是我自定义摇杆的触碰范围：是一个rect矩形，返回的是否在这个屏幕范围触碰的屏幕
   isDown = App.Instance.chickI]]></description><category></category></item><item><title><![CDATA[unity的摄像机处理--第三人称摄像机]]></title><link>https://blog.youkuaiyun.com/QO_GQ/article/details/119177767</link><guid>https://blog.youkuaiyun.com/QO_GQ/article/details/119177767</guid><author>QO_GQ</author><pubDate>Wed, 28 Jul 2021 14:23:45 +0800</pubDate><description><![CDATA[摄像机应该具有平移跟随，旋转，缩放视野的功能，之前使用的是将摄像机放置到角色下节点，作为角色的子物体跟随，但是这样就写死了：
网上查了一下，发现还是利用摄像机根据target进行处理还是挺方便的：
首先必须要有一个看向的目标角色：
/// &lt;summary&gt;
/// 目标角色
/// &lt;/summary&gt;
public Transform target;

也必须限制相机的上下仰角角度：
/// &lt;summary&gt;
/// 最小仰角度
/// &lt;/summary&g]]></description><category></category></item><item><title><![CDATA[unity（角色查看）RTT将模型渲染到UI上面]]></title><link>https://blog.youkuaiyun.com/QO_GQ/article/details/118724743</link><guid>https://blog.youkuaiyun.com/QO_GQ/article/details/118724743</guid><author>QO_GQ</author><pubDate>Wed, 14 Jul 2021 12:24:56 +0800</pubDate><description><![CDATA[最近想了想角色选择界面是用的模型直接摆上去的还是用的纹理，然后我就想到了用相机渲染到的纹理附上去康康，想不到还能这样：
具体的步骤：拿一张RenderTexture，将其赋值给模型渲染专用摄像机-渲染，再将其赋给ui的rawImage就可以了：
代码挺简单的：
	public Camera camera;
    public RawImage rwimg;
    public GameObject player;

    RenderTexture rentex;
    // Start is ca]]></description><category></category></item><item><title><![CDATA[unityshader 消融效果]]></title><link>https://blog.youkuaiyun.com/QO_GQ/article/details/118441283</link><guid>https://blog.youkuaiyun.com/QO_GQ/article/details/118441283</guid><author>QO_GQ</author><pubDate>Sat, 03 Jul 2021 16:05:37 +0800</pubDate><description><![CDATA[代码，讲解都在注释上面了：
冯乐乐的《unity shader 入门精要》：
相关知识：

透明度
阴影计算
普通光照
法线贴图

Properties
	{
		_BurnAmount("BurnAmount",Range(0,1)) = 0
		_LineWidth("LineWidth",Range(0,0.2)) = 0.1
		_MainTex("MainTex",2D) = "white"{}
		_BumpMap("BumpMap",2D) = "white"{}
		_BumpFirstCo]]></description><category></category></item><item><title><![CDATA[unityshader法线，纹理遮罩]]></title><link>https://blog.youkuaiyun.com/QO_GQ/article/details/118224465</link><guid>https://blog.youkuaiyun.com/QO_GQ/article/details/118224465</guid><author>QO_GQ</author><pubDate>Fri, 25 Jun 2021 17:32:01 +0800</pubDate><description><![CDATA[法线贴图可以让低模看起来像是高模一样，具体的实现原理，是改变了光照，呈现出凹凸度：
下图中为法线贴图

根据光照模型来进行更改：
首先我们需要声明法线贴图纹理和法线的凹凸度：
_BumpMap("bumpMap",2D) = "bump"{}
_BumpScale("BumpScale",Float) = 1.0

sampler2D _BumpMap;
float4 _BumpMap_ST;
float _BumpScale;

输入我们需要添加一个切线和法线：
struct Input
{
	float]]></description><category></category></item><item><title><![CDATA[FSM有限状态机]]></title><link>https://blog.youkuaiyun.com/QO_GQ/article/details/118179569</link><guid>https://blog.youkuaiyun.com/QO_GQ/article/details/118179569</guid><author>QO_GQ</author><pubDate>Thu, 24 Jun 2021 10:36:00 +0800</pubDate><description><![CDATA[FSM ，有限状态机，一个可以枚举出有限个状态，并且这些状态在特定条件下是能够来回切换的。
在游戏中经常看到的一些AI，如敌人巡逻，巡逻过程中看到玩家就追击，追上了就攻击，追不上并且有了一定的距离就返回去继续巡逻。
Unity中的Animator就是一个FSM了，不过Animator是控制角色动画播放的，什么状态的时候播放什么动画。而这里写的FSM是控制角色AI的，什么状态就做什么事。
FSM 跟 Switch case做的事一样一样，类比于 Switch 就是将case中的逻辑封装到各个State中了。
]]></description><category></category></item><item><title><![CDATA[普通光照模型：unityshader]]></title><link>https://blog.youkuaiyun.com/QO_GQ/article/details/117966862</link><guid>https://blog.youkuaiyun.com/QO_GQ/article/details/117966862</guid><author>QO_GQ</author><pubDate>Wed, 16 Jun 2021 21:02:28 +0800</pubDate><description><![CDATA[我们都知道物体表面的光照是由：自发光+镜面光（高光）+环境光+漫反射得出来的：
环境光：光照系数*环境光颜色
Ambient=K*GlobalAmbient;

漫反射：

Diffuse=K*LightColor*max(dot(N,L),0) ;

反射光线：两倍的水平投影减去入射光线，得到反射光线
镜面反射：k为高光系数
Specular=LightColor*pow(max(dot(N*R),0),K);

自发光：那就直接是纹理+uv了：
EmissIve=K;

嗯，就这些了：
代码：
Shad]]></description><category></category></item></channel></rss>