自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(206)
  • 资源 (5)
  • 收藏
  • 关注

原创 抓取屏幕与毛玻璃效果

文章目录1.前言2.抓取屏幕2.1 Unity C#接口2.2 CommandBuffer2.3 GrabPass3.获取屏幕坐标3.1 ComputeScreenPos方法3.2 VPOS语义3.3 SV_POSITION 语义3.4 ComputeGrabScreenPos4.背景模糊5.最后1.前言在unity实现毛玻璃(磨砂玻璃)效果,则需要三要素:抓取屏幕、根据渲染体在屏幕上的坐标获取屏幕像素、模糊处理。本文基于Unity官方的实现进行说明,并对一些节点进行适当的展开说明。2.抓取屏幕抓取

2022-05-26 16:27:07 1087 1

原创 (十五) TweenRunner

1.前言在研究UGUI源码时会有一些好的想法产生或者借鉴,在这里面最大的一点就是Tween。曾经补间动画一致采用DoTween,但是对与简单使用或者少量使用时引入整个插件又不值得,所以都是自己写一个。曾将看到Tween.js实现后一直想自己实现一个轻量级的,一致没有行动,但是unity的CoroutineTween.cs提供了一个比较好的实现。2.源码using System.Collections;using UnityEngine.Events;namespace UnityEngine.U

2022-05-24 12:35:06 249

原创 (十四)InputField逻辑分析

文章目录1.前言2.获取文字3.光标设置3.1 状态机模式3.2 光标渲染3.3 高亮渲染4.总结5.结语1.前言本文来讲一下InputField实现,本文之所以叫逻辑分析是因为跟作者自己和解了,不再去追求一些细节的实现(其实是脑细胞不够理解不了)。2.获取文字文字获取通过TouchScreenKeyboard获取。在激活模块时根据需求(比如是否多行,是否只有数字)打开所有键盘,此步操作主要针对触屏设备(苹果、android或者触屏windows)。然后在LateUpdate通过TouchScree

2022-05-24 12:10:17 442

原创 (十三)文本渲染Text

文章目录1.前言2.逻辑梳理3.贴图获取4.获取Mesh5.结语1.前言unity的文本渲染通过Text组件实现,文字的渲染也离不开贴图、mesh以及材质。材质则是根据MaskableGraphic材质,所以了解Text的主线则是了解如何生成贴图和mesh即可。本文不会去讨论文字贴图和mesh产生的技术细节,只讨论如何利用unity现有的组件去获取贴图和mesh。2.逻辑梳理基本逻辑如下:1)当需要更新时(比如更新文字大小时)标记更新材质和mesh2)Canvas处于preRender时通过Fo

2022-05-23 18:21:57 862

原创 (十二)交互组件Selectable

文章目录1.前言2.实现3.最后1.前言简单说一下unity的交互组件Selectable,此组件是所有组件交互的基类,即它实现了鼠标hover、点击、离开以及其他事件对应的状态。是button、toggle、slider等的基类,比较简单。2.实现其实现比较简单,即简单继承一些事件接口(如IPointerDownHandler),然后获取事件,根据事件去处理不同的逻辑。而此组件看起来比较复杂(1000+行的代码),是为了处理一些特殊情况,比较复杂的功能是如下两个:1、Transition的选择,

2022-05-23 16:12:17 841

原创 Unity工程导入Android工程

文章目录1.前言2.集成到原生Android步骤2.1 导出Android Module2.2 导入原生Android工程3.Unity画面集成与显示3.1 以Activity形式集成3.2 桌面局部显示3.3 添加原生Android组件4.问题处理4.1 编译时错误4.2 桌面显示多个ICON问题5.Limitations6.总结1.前言在2018以及以前的版本中,unity到处android工程时是一个完整的AndroidStudio工程。从2019开始unity中到处工程是一个module,所以用

2022-05-11 20:52:36 2022

原创 SetReplacementShaer

文章目录1.前言2.正文3.最后1.前言本文是转载文章,可以通过rendertype替换对应的shader或者替换所有shader,当然也可以重置回去。2.正文Camera.SetReplacementShader(mShader,“aType”)。说明:1、mShader中需设置“RenderType"=“aType”。Tags {"RenderType" = "aType"}2、运行时会找到所有RenderType与mShader中RenderType相同(即”aType“)的shad

2022-05-08 12:32:58 197

原创 Unity深度获取

文章目录1.前言2、_CameraDepthTexture3.SetTargetBuffers4.参考文献1.前言Unity中深度问题介绍的比较多,不管是不同平台导致的[0,1]还是[1,0]以及线性非线性等问题,在此介绍一篇比较长但是比较全的文章,此文作者通过顶点的z值计算深度,并自写了深度线性化函数。此两个方法对应ShaderLab中的Linear01Depth以及LinearEyeDepth两种方法。本文不讨论深度的问题,只讨论如何获取深度的问题。unity获取深度有两种方法,如下文。2、_C

2022-05-08 12:07:43 3132 1

原创 ARCore光照估计效果

ARCore的光照估计采用直接控制光源的位姿以及强弱等参数实现的,较为简单,但是需要根据参数对Rendering的一些参数进行设置。提供了两个光照shader,一个是diffuse一个specular,但是也仅仅是做了光照估计修正。...

2022-05-07 17:51:42 206

原创 ARCore平面与空间点云实现

文章目录1.前言2.平面显示3、点云显示4.结语1.前言本文对ARCore如何实现平面显示和空间点云效果进行分析2.平面显示平面显示步骤如下:1)在DetectedPlaneGenerator脚本中,通过平面接口Session.GetTrackables获取所有接平面,根据平面实例化每一个平面prefab,每个prefab通过DetectedPlaneVisualizer脚本来展示平面。2)DetectedPlaneVisualizer首先获取平面信息,包括平面中心位姿和边界点。继而可以得到平面

2022-05-07 17:47:19 750

原创 ARCore深度渲染问题分析

文章目录1.前言2.深度图显示3.深度遮挡3.1 处理流程3.2 相关代码4.结语1.前言ARCore深度效果显示分为两部分:第一部分是深度图显示,另一部分为深度遮挡(即实现真实物体与虚拟物体的遮挡)。本文对这两部分的功能进行分析。2.深度图显示开启适度图显示是会在屏幕上显示整个是业内的深度信息,比如越远的地方深度值越大,则显示红色,负责显示蓝色。步骤比较简单:1)ARCore获取环境深度图,并传入shader中“_CurrentDepthTexture”中,但是图片采样时只能采样部分区域,所以还

2022-05-07 11:28:41 819

原创 ARCore背景渲染

文章目录1.前言2.ARCore流程3.渲染流程3.1 数据更新1.前言像Vuforia、ARCore、EasyAR等sdk,使用时都会将背景与虚拟进行叠加。此功能的实现有很多种,比如直接在Camera的远平面附近添加一个UI或者quad,将camera的画面付给它;比如用CommandBuffer将画面最先渲染;或者重写shader,更改渲染顺序或者设置深度值。ARCore采用的CommandBuffer的方式,但是里面有很多细节需要说明。2.ARCore流程ARCore背景渲染脚本为ARCore

2022-05-06 17:44:34 478

原创 JNI方法简介

文章目录前言1.JavaVM2.方法调用3.数据传递3.1 简单类型3.2 简单数组类型3.3 对象类型3.4 对象数组4.内存释放5.结语前言用C/C++开发android一些功能时,不可避免的需要需要java与C/C++之间进行交互,比如数据的传递等,本文对JNI的一些相关知识做一些简述,包括JavaVM,数据类型与数据传递1.JavaVMJava语言的执行环境时Java虚拟机(JVM)是一个独立的进程,JNIEnv是当前java线程的执行环境,一个JVM中可以有多个java线程,每个java线

2022-05-03 19:39:26 1659

原创 CMake简介

文章目录1.前言2.指定cmake最小版本3.添加库文件4.导入库文件5.查找系统库6.链接库文件结语1.前言CMake是一种代码构建工具,通过此工具可以设置编译哪些代码?编译成什么(so、lib、a还是可执行文件)?需要哪些依赖?以及编译完成后的目标目录等。本文对AS默认形成的CMakeList中的一些语法做简单讲解。2.指定cmake最小版本cmake_minimum_required(VERSION 3.4.1)可以不指定最小版本,但是如果用到了高版本的一些特性而本身安装的版本较低时就会有

2022-05-03 11:07:39 145

原创 Android工程添加C++实现

文章目录前言1.配置C++环境2.添加C++代码3.构建工具结语前言在Andriod开发时,可以通过jni实现java与C/C++的相互调用。在新建工程时可以选C++工程,就会自动包含所需的文件,并提供一个简单的获取C++字符串的demo。向java工程中添加c++无非是如下几个方面:配置C++开发环境;添加C++源码;构建工具。1.配置C++环境不管是向原有工程中添加C++还是新建的工程,都要检查一下开发环境:需要NDK(原生开发工具包);CMake(构建工具);LLDB(调试工具)。三者可以在S

2022-05-02 16:48:22 2223

原创 Unity2019配置ARCore环境

文章目录1.前言2.Unity编译错误3.添加插件4.Gradle版本低问题结语1.前言用ARCore原生的Unity插件(非ARFoundation),会报各种错误,此文将对解决方法进行说明。最新(2021-3月)的ARCore github下载的unitySDK,在unity2019中会报各种错误,需要进行一些配置。如果不想如此麻烦的配置,建议直接用ARFoundation或者高版本unity(2020以后)或者用低版本的ARCore。2.Unity编译错误此问题跟ARCore无关,属于网络问题

2022-05-02 15:18:10 2157

原创 AndroidStudio问题

最近(2022-2)发现AndroidStudio用不了,出现各种问题,以下为出现的问题以及解决办法。

2022-05-02 11:31:18 930

转载 图片旋转(zt)

图片旋转: /// <summary> /// 图片逆时针旋转90度 /// </summary> /// <param name="src">原图片二进制数据</param> /// <param name="srcW">原图片宽度</param> /// <param name="srcH">原图片高度</param&

2022-04-07 16:16:44 110

原创 Unity坐标转换

文章目录1.前言2.坐标转化2.1 普通转化2.2 左右手坐标系转化3.结语1.前言本文从基本的坐标系转化(即均为左手或者右手)开始,后续给出左右手坐标系转化的方法,参考众多文章,只贴结论和方法,细节参考后续的参考文献。2.坐标转化2.1 普通转化在同一坐标系的转化比较简单,但是为了方便计算通常会采用RT矩阵进行计算,类似与渲染中的仿射变换。计算公式如下:如果知道ΔR和ΔT,就比较容易计算,根据一点在不同坐标系下的数值可以如下方案计算ΔR和ΔT: public static Pose C

2022-04-07 16:11:35 4202

原创 ARCore YUV转RGB

文章目录1.前言2.代码3.结论1.前言在之前的文章中分析了YUV转RGB的相关内容,这在跟硬件层的数据处理时比较方便,yuv数据均存在一个数组中,但是在研究arcore unity层代码时通过CameraImageBytes的类型传给应用层。ARCORE通过YUV三层将各层的数据传到上层,所以处理时相对来说更简单。2.代码转换代码: public static byte[] CameraImageToRGB(CameraImageBytes imageBytes) {

2022-04-07 15:05:22 3136

原创 YUV图像旋转

文章目录1.前言2.代码3.结论1.前言继续水一篇YUV图像旋转的文章2.代码public static byte[] rotateYUV420Degree90(byte[] data, int imageWidth, int imageHeight) { byte[] yuv = new byte[imageWidth * imageHeight * 3 / 2]; // Rotate the Y luma int i = 0; for (int x = 0; x

2022-04-03 17:54:26 846

原创 YUV转RGB

文章目录1.前言2.YUV数据格式3.YUV与RGB的计算4.总结1.前言YUV图片数据以及YUV转rgb问题2.YUV数据格式颜色都可以通过原色 red green blue通过不同的比例混合出来,这种既是RGB数据格式图像;而YUV, Y表示亮度,U V表示色差信息(分别表示blue 和 Red的色差信息),通过YUV三个分量值,可以计算出RGB。YUV类型数据分为很多的形式,比如YUV444,YUV422或者YUV420,本文主要对YUV420格式数据进行分析。假设图片宽高分别为Width和

2022-04-03 17:47:31 6955

原创 被遮挡部分高亮

文章目录1.前言2.完整shader3.结论1.前言实现被遮挡部分高亮的shader2.完整shaderShader "Custom/HiddenHilight" { Properties { _Color ("Color", Color) = (1,1,1,1) _MainTex ("Albedo (RGB)", 2D) = "white" {} _Glossiness ("Smoothness", Range(0,1)) = 0.5 _Metallic ("Metallic",

2021-05-16 18:26:53 128

原创 Android环境变量设置

文章目录1.前言2.环境变量配置3.环境变量说明1.前言windows下Android studio开发时环境变量的配置2.环境变量配置1)在“系统变量”新建一个变量名为JAVA_HOME的变量,变量值为你本地java的安装目录,我这里为:C:\Program Files\Java\jdk1.7.0_80,设置这个的目的是作为下面两个环境变量的一个引用2)在“系统变量”选项区域中查看PATH变量,如果不存在,则新建变量PATH,否则选中该变量,单击“编辑”按钮,在“变量值”文本框的起始位置添加“%

2021-05-16 17:50:40 1208

原创 实现3dof功能

文章目录1.前言2.代码实现1.前言现实中手机移动,可以看到相应转动的虚拟画面,采用手机自带的惯导就可以实现,当然也可以借助手机ar的插件,比如arcore或者easyAR等。2.代码实现using System.Collections;using System.Collections.Generic;using UnityEngine;public class GyroCameraController : MonoBehaviour{ private Gyroscope gyro

2021-05-16 17:35:44 453

转载 引入AAR包

文章目录1.前言2.步骤1.前言在Android studio中引入aar包2.步骤1)将aar放入app-libs目录下,若无自己新建2)配置gradle文件,添加如下repositories {flatDir {dirs'libs' }}3)引入aar包implementation (name: ‘libusbcamera-release’, ext: ‘aar’)...

2021-05-16 17:23:56 281

原创 单例模式再议

文章目录1.前言2.单例的几种方式2.1 非线程安全模式2.2 简单线程安全模式2.3 双重验证线程安全模式2.4 非锁模式的线程安全2.5 其他模式3.Unity单例模式3.1 特殊性3.2 一个单例4.结论1.前言曾多次对unity或者c#在使用单例时的一些问题进行过讨论,即有充满戾气的讨论,也有理性的总结与封装(封装成一个抽象类,使用时直接继承),但多次使用时还是有一些不同的想法,故此文章诞生。此文将从纯C# 层展开。2.单例的几种方式此部分为纯C#层面2.1 非线程安全模式此种线程不安全

2021-05-16 14:28:19 81

原创 UGUI圆形UI与多边形点击范围

文章目录1.前言2.RayCrossing3.圆形UI4.多边形点击范围5.结论1.前言Unity默认的ugui mesh是四边形网格,若要实现圆形ui可以使用mask实现,此处提供一种更改mesh的方法,并将点击范围控制在圆形范围内。(从易用性角度并不会方便太多)同时提供一种在不使用mask的情况下实现复杂点击范围。但此上两种方案均需要判断点击点是否在一个多边形内(圆形按多边形处理)2.RayCrossing若判断一个点p是否在一个多边形内,可以使用rayCrossing方法。即点p发出一条射线

2021-03-31 21:42:10 525

转载 状态栏显示

文章目录1.前言2.实现2.1 底部导航栏2.2 顶部状态栏3.总结1.前言unity默认全屏应用,不会显示上部状态栏,可以通过Android中的activity的getWindow方法,获取window然后设置window的属性即可。2.实现2.1 底部导航栏直接在unity的Screen类中直接调用Screen.fullScreen = false即可。2.2 顶部状态栏 /// <summary> /// 隐藏上方状态栏 /// </summar

2021-03-27 16:19:21 223

原创 可见性判断

文章目录1.前言2.方法1.前言游戏物体可见性判断有多种方法,比如OnBecameVisible。但是上述方法有一个问题,就是只有移动游戏物体时才会生效,移动cameran则不会生效。所以不得使用其他方法,本文转载此文2.方法如果一个物体被unity判定为”退一万步讲也一定不可见“,则unity不会去渲染它,但是如果我们给此物体添加了逻辑,这个逻辑仍然会被执行。因此,假如这个逻辑是巨耗性能的逻辑,比如说”mesh的每个顶点都按sin(t)波动“之类,那么我们需要手动根据可见性去优化这个逻辑,比如不

2020-05-30 13:33:02 2157

原创 (八)图像处理

文章目录1.前言2.图像处理2.1 亮度2.2 灰度2.2.1 完整代码2.3 模糊处理2.3.1 简单处理2.3.2 高斯处理2.4 边缘处理2.4.1 梯度计算2.4.2 颜色显示2.4.3 完整代码3.结语1.前言本篇浅谈一下图像处理包括调节亮度、灰度处理以及模糊处理。图像处理一般用于平面模型特殊要求处理,但主要用于屏幕后处理,屏幕后处理一般采用OnRenderImage方法进行。主要图像处理参考文献为六种灰度计算方法文章。2.图像处理2.1 亮度亮度就是让图像看起来更亮,处理比较简单,即颜

2020-05-10 12:03:47 336

原创 (八)Grahpics之Blit

文章目录1.前言2.OnRenderImage简介3.应用示例3.1 最简单应用3.2 最基本应用4.结语1.前言Graphics的Blit方法是比较简单也是比较常用的方法。最简单的作用是将一张纹理绘制到另一张纹理中。而在此方法中可以指定一种材质来实现特殊的效果,所以常和OnRenderImage方法配合使用来实现屏幕后处理效果。2.OnRenderImage简介void OnRender...

2020-05-05 17:27:32 6161

原创 (七)时间动画_Time

文章目录1.前言2.实现2.1 顶点片元着色器实现2.2 序列帧播放2.3 表面着色器实现结论1.前言之前有涉及到序列帧播放的问题,最开始是通过RawImage/Image组件实现,即在update中或者通过协程实现固定事件间隔去刷新通向。再次提供两种shader来实现,序列帧的图像在一张图上按顺序排列。2.实现2.1 顶点片元着色器实现在此方法中用到了_Time来获取时间行程。其含有x...

2020-05-04 17:22:41 408

原创 (十一)自定义VrInputModule

文章目录1.前言2.Input3.自定义InputModule4.结语1.前言本文基于InputModule的逻辑,根据VR的操作特点,写一个VrInputModule。2.Input虚拟一个Input类,来获取最基本的信息,如下代码所示(示意代码):using UnityEngine;using System.Collections;public class GazeInput ...

2020-04-12 10:57:15 465 1

原创 (十)自定义GraphicRaycaster

文章目录1.前言2.Plane射线检测3.GraphicRaycaster4.结语。。1.前言在之前的文章中曾分析过unity事件系统中的rayCaster,其中GraphicRaycaster中曾分析过,射线在此类中的作用仅仅是为了检测与3D或者2D的碰撞距离,而ui检测时则使用如下代码:RectTransformUtility.RectangleContainsScreenPoint(g...

2020-04-11 19:52:46 674

原创 (九)Mask详解

文章目录1.前言2.模板遮罩原理2.1 模板值2.2 模板参数设置2.3 模板参数使用2.3.1 模板测试2.3.2 模板设置2.4 模板测试应用3.Mask逻辑4.结语1.前言本文从逻辑和原理上详细分析Ugui的Mask组件。Mask组件的逻辑没有RectMask2D复杂,但是原理稍微麻烦一点,用得到渲染的模板检测。2.模板遮罩原理2.1 模板值以下图为例,假如均没有开启模板检测,ca...

2020-04-11 17:51:49 1516

原创 (八)RectMask2D详解

文章目录1.前言2.详解3.结语1.前言RectMaskD的基本原理就是CanvasRenderer的EnableRectClipping方法,上一节已经做了详细说明。而它的工作流程在(六)和(五)中也做了详细分析。此篇重新梳理一下流程,做更细致的分析。2.详解RectMask2D的基本原理比较建议,复杂点在于其上层逻辑比较复杂,今天就按逻辑流程顺序进行分析。1)启动时通过Clipper...

2020-04-11 12:13:33 1730 1

原创 (七)自定义Graphic

文章目录1.前言2.实现Graphic2.1 设置网格2.1.1 固定网格2.1.2 动态网格2.2 材质2.3 设置Rect剔除2.4 启动位置3.完整代码4.结语1.前言基于CanvasRenderer实现一个自定义(破产版)的graphic。以往自定义ui形式时,可以新建脚本继承Graphic,通过重写虚方法来实现一些特殊功能。此文则从CanvasRenderer的层面,实现一个Grap...

2020-04-11 11:06:06 578

原创 (六)Graphic与MaskableGraphic详解

文章目录1.前言2.基本原理2.1 GraphicRegistry2.2 标记Graphic重建2.2 材质Material2.3 重构Rebuild2.3.1几种OnPopulateMesh3.结语1.前言此篇将对UGUI系统中图像显示的核心Graphic类进行详细分析2.基本原理基本流程已经在CanvasUpdate一文中的2.1和2.2节分析过了。即每帧在进行Canvas渲染前通过C...

2020-04-06 10:37:08 1259

原创 (五)UGUI CanvasUpdate

文章目录1.前言2.UGUI运作原理图2.1 CanvasUpdateRegistry2.2 Graphic/MaskableGraphic2.3 RectMask2D遮罩3.结语1.前言ugui的图像显示核心是Graphic类,而这一切Graphic又由Canvas相关类进行管理。在ugui系统中Canvas是管理ui元素的生命周期与样式变化,而CanvasRenderer则负责ui的显示,...

2020-04-05 22:04:07 1017

Message改.7z

消息系统、包括消息管理类、消息处理类以及消息本身。实现消息的全域广播

2019-10-29

CoroutineJob.7z

协程应用封装了常用的几种协程功能。包括延时执行,重复执行等

2019-10-29

EventManager.7z

事件管理系统用来管理各种回调事件,解决各个脚本之间的耦合

2019-10-29

Message.7z

消息系统、包括消息管理类、消息处理类以及消息本身。实现消息的全域广播

2019-10-29

TwoHandleSlider.zip

双滑块SLider,基于unity 自带ui组件,生成一个双滑块的SLider

2019-10-17

空空如也

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

TA关注的人

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