-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsearch.json
More file actions
1 lines (1 loc) · 42.4 KB
/
search.json
File metadata and controls
1 lines (1 loc) · 42.4 KB
1
[{"title":"Untiyshader基础概念","url":"/2018/02/24/Untiyshader基础概念/","content":"\n1.渲染流水线\n应用阶段->几何阶段->光栅化阶段\n\n应用阶段输出渲染所需几何信息->渲染图元(点线三角面等)\n\n几何阶段在GPU上进行\n\n光栅化阶段对上一阶段得到的逐顶点数据进行插值\n\n起点为CPU,在应用阶段把数据加载到显存中,设置渲染状态,调用DrawCall\n\nDrawCall即为一个命令,从CPU发起,到GPU接收。此命令仅仅指向一个需要被渲染的图元列表,不包含任何材质信息。\n\n调用DrawCall命令GPU进行渲染,DrawCall过多会影响帧率,原因是会造成CPU过载,而GPU的渲染速度是超过CPU提交命令能力。\n<!--more-->\n减少DrawCall:避免使用大量很小的网格,不可避免时考虑合并形成图集。避免使用过多材质,尽量在不同的网格之间共用同一个材质。\n\nLOD(Level of detail)多层次细节 LOD技术可有效减少计算的复杂度\n\nHDR(Hight Dynamic Range)高动态范围,相对的为LDR,采用HDR不会丢失高亮度区域的颜色值,提供了更真实的光照效果,并为屏幕后处理提供更多的控制能力。缺点就是使用浮点缓冲存储高精度图像,耗费更大的显存空间且渲染速度变慢,一些硬件也不支持HDR。\n\nPBS(Pyhsically Based Shading)基于物理着色\n\n2.GPU渲染流水线\n从几何阶段到光栅化阶段分为更小的部分\n\n几何阶段-> 三角形设置,三角形遍历,片元着色器,逐片元操作\n\n顶点数据->几何阶段->光栅化阶段->屏幕图像\n\n光栅化阶段-> 顶点着色器,曲面细分着色器,几何着色器,裁剪\n\n3标准光照模型\n环境光-自发光-漫反射-高光反射-逐像素or逐顶点\n\n渲染顺序很重要,在透明度混合技术中,需关闭深度写入,不关闭深度写入会导致本来需要看到的表面被剔除,破坏了深度缓冲的工作机制\n\n光源属性常有位置,方向,颜色,强度,衰减\n\n4基础纹理\n凹凸映射->高度纹理,法线纹理\n\n单张纹理-凹凸映射-渐变纹理-遮罩纹理\n\n5渲染路径\n分为前向,延迟(新代替旧),顶点照明(已被unity抛弃)\n","tags":["-- UnityShader -- 图形学"]},{"title":"UnityShader(1)-基础结构","url":"/2018/02/24/UnityShader-1-基础结构/","content":"shader基础结构\n\n```\nShader \"MyShaderName\" {\n\tProperties{\n\t //属性 Name通常需要下划线开始 display name是显然在材质面板上的名字,properytype是其类型 ,最后需要赋一个默认值\n\t Name (\"display name\",PropertyType)=DefaultValue\n\t}\n\t\tSubShader{\n\t\t //针对显卡A的SubShader SubShader可有多个,但最少需要一个\n\t\t //真正意义上的Shader代码会出现在这里\n\t\t //表面着色器(Surface shader) or 顶点/片元着色器(Vertex/Fragment shader) or 固定函数着色器(Fixed Function shader)\n\n\n\t\t //可选\n\t\t [Tags] //标签 为键值对\n\t\t Tags{\"TagName1\"=\"Value1\" \"TagName2\"=\"Value2\"}\n\t\t [RenderSetup] //状态\n\n\t\tPass{\n\t\t //设置渲染状态和标签 Pass数目应尽量少,多会造成渲染性能下降 \n\t\t [Name] //设置该Pass名称 可使用ShaderLab的UsePass命令直接使用其他Shader中的Pass ,提高了复用性\n\t\t [Tags] //不同于subshader中的标签\n\t\t [RenderSetup]\n\n\t\tCGPROGRAM //开始CG代码片段\n\n #pragma vertex vert //编译指令,某函数包含哪类着色器\n #pragma fragment frag\n\n //整体CG代码写在这里\n\n\t\tENDCG\n\t\t//其他设置\n\t}\n\t //其他需要的Pass\n\t}\n\t SubShader{\n\t //针对显卡B\n\t }\n\n\n\t Fallback \"VertexLit\" //用于告诉Unity,上述SubShader在该显卡上都不支持,使用最低级Shader\n\t //Fallback \"Name\" or Fallback off(关闭fallback)\n}\n```\n<!--more-->\n## 属性类型\n\n\n从上图看出对于Int,Float,Range类型,默认值是一个单独数字,Color和Vector是四维的向量,2d,cube,3d是通过一个字符串后跟一个花括号,字符串要么是空的要么就是内置的纹理名称。\n\n## 标签\n\n\n## 渲染状态设置\n\n\n## Pass标签\n\n\n## 相关着色器的语义\n\n\n\n\nUnityShader也支持特殊的Pass,如UsePass和GrabPass,GrabPass负责抓取屏幕并将结果存储在一张纹理中,便于后续Pass处理。\n\n1. 表面着色器无需写在Pass语义快中,表面着色器无需关心有多少个Pass2\n1. 顶点/片元着色器是写在Pass中,我们需要自己定义Pass中的shader代码,灵活性更高,控制渲染的实现细节。\n1. 都在CGPROGRAM到ENDCG之间写,但是区别在一个在subshader中,一个在pass中。\n\n\n## 选择哪种shader形式\n1. 如果需求中有明确表示对旧设备进行支持,需要使用固定函数着色器,否则使用可编程管线着色器\n1. 如果和各种光源打交道,采用表面着色器,但要注意移动平台性能表现\n1. 如果光照数目非常少,有很多自定义渲染效果, 那么使用顶点/片元着色器\n","tags":["-- UnityShader -- 图形学"]},{"title":"选择,插入,归并,快速排序总结","url":"/2018/02/22/选择,插入,归并,快速排序总结/","content":"\n一,O(n^2)选择排序和插入排序\n\n1选择排序\n基本思路:标记第一个数,循环找到比这数小的然后对换,直至找到数组中最小的数,最好将最小的数放入标记的位置。\n\n```\nvoid selectSort(int arr[],int n)\n{\n for(int i=1;i<n;i++)\n {\n int minIndex=i;\n //遍历i+1到n数,找到最小值\n for(int j=i+1;j<n;j++)\n {\n if(arr[j]<arr[minIndex])\n minIndex=j;\n }\n swap(arr[j],arr[minIndex]);\n }\n}\n```\n<!--more-->\n2,插入排序\n基本思路:从i开始,与i-1进行对比,插入排序不需要进行全循环,而是可以中途退出,判断的是从最后到第一的大小关系。\n\n### 第一种方法\n```\nvoid InsertSort(int arr[],int n)\n{\n for(int i=1;i<n;i++)\n {\n for(j=i;j>0;j--)\n {\n if(arr[j]<arr[j-1])\n swap(arr[j],arr[j-1])\n else\n break;\n }\n }\n}\n```\n\n### 第二 相比第一种方法。不再需要两两交换。\n```\nvoid InsertSort(int arr[],int n)\n{\n\n int j; \n for(int i=1;i<n;i++)\n {\n int t=arr[i];\n for(j=i;j>0;j--)\n {\n if(arr[j-1]>t)\n arr[j]=arr[j-1];\n }\n arr[j]=t; //找到t所处在位置,并赋值.\n }\n}\n```\n\n三,归并排序(nlogn)\n基本思路:需要一个暂存区aux,然后范围为l到r,i和j分别为左右两边需要比较的值,k为通过比较之后,符合的数值存放位置。,实际与二分法思维相符\n\n```\n//归并排序\nvoid merageSort(int arr[],int n)\n{\n _merageSort(arr,0,n-1);\n}\n\nvoid _merageSort(int arr[],int l,int r)\n{\n if(l>=r)\n return;\n int mid=(l+r)/2;\n _merageSort(arr,int l,int mid);\n _merageSort(arr,int mid+1,int r);\n _merage(arr,l,mid,r);\n}\n\nvoid _merage(int arr[],int l,int mid,int r)\n{ int aux[l-r+1];\n for(int i=l;i<=r;i++)\n {\n aux[i-1]=arr[i];\n }\n\n int i=l;j=mid+1;\n for(int k=l;k<=r;k++)\n { \n if(i>mid)\n {\n aux[k]=aux[j-l];\n i++;\n }\n\n else if(j>r)\n {\n aux[k]=aux[i-l];\n j++;\n }\n else if(aux[i-l]<aux[j-l])\n aux[k]=aux[i-l];\n else\n aux[k]=aux[j-l];\n }\n\n}\n```\n\n四.快速排序(nlogn)\n基本思路:选择一个数作为中间数t,递归整个数据,比t大的放在右边,比t小的放在左边\n\n```\nvoid QuickSort(int arr[],int n)\n{\n _QuickSort(int arr[],0,n-1)\n}\n\nvoid _QuickSort(int arr[],int l,int r)\n{\n if(l>=r)\n {\n return;\n }\n\n int p=_Par(arr,l,r);\n _QuickSort(arr,l,p);\n _QuickSort(arr,p+1,r);\n}\n\n\nvoid _Par(arr,l,r)\n{\n int v=arr[l];\n int j=l;\n for(int i=l+1;i<=r;i++)\n {\n if(arr[i]<v)\n {\n j++;\n swap(arr[j],arr[i]);\n }\n swap(arr[l],arr[j]);\n }\n\n return j;\n}\n\n```\n\n2.二路快排\n```\nvoid _par(arr,l,r)\n{\n \\\\随机化生成标定点point\n swap(arr[l],arr[rand()%(r-l+1)+1]);\n int v= arr[l];\n int i=l+1;int j=r;\n while(true)\n {\n while(i<=r && arr[i]<v)\n i++;\n while(j>=l+1 && arr[j]>v)\n j--;\n if(i>j)\n break;\n swap(arr[i],arr[j])\n i++;\n j--;\n }\n swap(arr[l],arr[j]);\n return j;\n}\n```\n3三路快排\n```\nvoid _quick3ways(arr,l,r)\n{\n int v=arr[l];\n int lt=l;int gt=r+1;int i=l+1;\n while(i<gt)\n {\n if(arr[i]<v){\n swap(arr[i],arr[lt+1]);\n i++;\n lt++;\n }\n else if(arr[i]>v)\n {\n swap(arr[i],arr[gt-1])\n gt--;\n }\n else\n i++;\n }\n swap(arr[l],arr[lt]);\n\n _quick3ways(arr,l,lt-1);\n _quick3ways(arr,gt,r);\n}\n\n```\n","tags":["-- 算法 -- 排序"]},{"title":"JavaScript作用域等小结","url":"/2018/02/22/JavaScript知识点2/","content":"\n1.JS中执行上下文,范围为一段script标签,或者一个函数范围内。\n变量提升中,注意函数表达式和函数声明的区别,可以说函数声明会整体提升,但是\n函数表达式与变量提升相似,如以下代码\n<!--more-->\n```\nconsole.log(a);// a为undefined\nvar a=2;\n和\nvar a;\nconsole.log(a);\na=2;\n上面代码其实就下面这段代码。\n\n//又如\nfn();\nvar fn=funciton(){};\n那么这段函数表达式会被提升,导致fn()为undefined\n```\n\n2.this指针具体在那些地方执行。\n首先肯定的是this是要在执行时才能确认值,定义时无法确认\n一般分一下几种\n构造函数执行,普通函数执行,对象属性执行,还有call,apply,bind三种\n注意的是bind是用在函数表达式中的。\n\n3.作用域和作用域链\nJS没有块级作用域,只有函数作用域和全局作用域。\n\n```\nvar a=100;\nfunction a(){\n var a=200;\n console.log(a);\n}\n```\n如上述代码,假设a()内的变量a不存在,那么输出的a将成为一个自由变量,根据作用域链,将往上寻找变量\n将在全局内找到,进而输出。\n\n4.闭包其实就在一个函数内部的函数可访问其内部的变量,特别在封装来说,有很大的作用\n\n```\n//典型闭包封装\nfunction isLoad(){\n var _onLoad=[];\n return function(id){\n if(_onLoad.indexOf(id)>=0)\n return false;\n else\n {_onLoad.push(id);\n return true;\n }\n }\n}\n```\n\n5.同步和异步最大的区别就是,同步会造成程序阻塞,而异步就不会,且使得程序高效的运行起来\n一些常用的异、","tags":["闭包"]},{"title":"常用正则收集","url":"/2018/02/22/常用正则表达式/","content":"一些常用的正则表达式<!-- more -->\n``` bash\n//正整数\n/^[0-9]*[1-9][0-9]*$/;\n\n//负整数\n/^-[0-9]*[1-9][0-9]*$/;\n\n//正浮点数\n/^(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*))$/;\n\n//负浮点数\n/^(-(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*)))$/; \n\n//浮点数\n/^(-?\\d+)(\\.\\d+)?$/;\n\n//email地址\n/^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$/;\n\n//url地址\n/^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$/;\n或:^http:\\/\\/[A-Za-z0-9]+\\.[A-Za-z0-9]+[\\/=\\?%\\-&_~`@[\\]\\':+!]*([^<>\\\"\\\"])*$ \n\n//年/月/日(年-月-日、年.月.日)\n/^(19|20)\\d\\d[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])$/;\n\n//匹配中文字符\n/[\\u4e00-\\u9fa5]/;\n\n//匹配账号是否合法(字母开头,允许5-10字节,允许字母数字下划线)\n/^[a-zA-Z][a-zA-Z0-9_]{4,9}$/;\n\n//匹配空白行的正则表达式\n/\\n\\s*\\r/;\n\n//匹配中国邮政编码\n/[1-9]\\d{5}(?!\\d)/;\n\n//匹配身份证\n/\\d{15}|\\d{18}/;\n\n//匹配国内电话号码\n/(\\d{3}-|\\d{4}-)?(\\d{8}|\\d{7})?/;\n\n//匹配IP地址\n/((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)/;\n\n//匹配首尾空白字符\n/^\\s*|\\s*$/;\n\n//匹配HTML标记\n< (\\S*?)[^>]*>.*?|< .*? />;\n\n//提取信息中的网络链接\n(h|H)(r|R)(e|E)(f|F) *=*('|\")?(\\w|\\\\|\\/|\\.)+('|\"| *|>)?\n\n//提取信息中的邮件地址\n\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)* \n\n//提取信息中的图片链接\n(s|S)(r|R)(c|C) *= *('|\")?(\\w|\\\\|\\/|\\.)+('|\"| *|>)? \n\n//提取信息中的 IP 地址\n(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)\n\n//取信息中的中国手机号码\n(86)*0*13\\d{9} \n\n//提取信息中的中国邮政编码\n[1-9]{1}(\\d+){5} \n\n//提取信息中的浮点数(即小数)\n(-?\\d*)\\.?\\d+ \n\n//提取信息中的任何数字\n(-?\\d*)(\\.\\d+)?\n\n//电话区号\n^0\\d{2,3}$\n\n//腾讯 QQ 号\n^[1-9]*[1-9][0-9]*$ \n\n//帐号(字母开头,允许 5-16 字节,允许字母数字下划线)\n^[a-zA-Z][a-zA-Z0-9_]{4,15}$ \n\n//中文、英文、数字及下划线\n^[\\u4e00-\\u9fa5_a-zA-Z0-9]+$\n```\n这里推荐一个[正则表达式的调试工具](http://www1.w3cfuns.com/tools.php?mod=regex)\n也可以看看[正则的基本语法](http://www.runoob.com/regexp/regexp-syntax.html)","tags":["正则"]},{"title":"常见的JavaScript遍历方式","url":"/2018/02/22/JavaScript的遍历方式/","content":"\n 首先我们写一个数组和json对象。\n var Arr=['C++','c#','java','css','html','javascripts'];\n var obj={\n \tfirst:'javascripts',\n \tsecond:'css',\n \tthird:'jquery'\n };\n<!-- more -->\n ## for循环\n\n```bash\n(function{\n\tfor(var i=0,len=Arr.length;i<len;i++){\n\tif(i==2){\n\t\t//return; //函数执行被终止\n\t\t//break; //循环被终止\n\t\tcontinue; //循环被跳过\n\t}\n\tconsole.log('Arr['+i+']:'+Arr[i]);\n\t}\n})();\n```\n\n### for循环中有两点注意\n* for循环中的i在循环结束后依然存在与作用域中,这个时候为了避免影响作用域中的其余变量,我们将采用函数自执行的方式将其隔离起来。形如\n\n``` bash\n(function(){})();\n```\n\n* 在循环中避免使用(var i=0;i<Arr.length;)这样数组长度每次都在计算,效率远远低于例子中的写法,同理,我们也可以先赋值好值,如下\n\n``` bash\nvar i=0;len=Arr.length;\nfor(;i<len;i++)\n```\n\n## for in 循环\nfor(var item in arr|obj){}可以用于遍历数组和对象\n\n* 遍历数组,item为索引值,arr为当前索引值对应的元素 arr[item];\n* 遍历对象,item为key值,arr表示key值对应的value值obj[item];\n\n```bash\n(function{\n\tfor(var i in Arr){\n\tif(i==2){\n\t\t//return; //函数执行被终止\n\t\t//break; //循环被终止\n\t\tcontinue; //循环被跳过\n\t}\n\tconsole.log('Arr['+i+']:'+Arr[i]);\n\t}\n})();\n```\n### 关于for in 的注意\n* 同样式需要添加自执行函数。\n* 跳出循环中,return为函数执行终止,即整个函数将终止,在循环外面的也不再进行。break为终止当前的循环,后续代码继续执行。\n\n\n## for Each\nArr.forEach(function(arg){})\n参数arg为数组没一项元素。\n\n``` bash\nArr.forEach(funciton(val,index){\n\tif(e=='css3'){\n\t\treturn; //循环被跳过\n\t\t//break; //Error\n\t\t//continue; //Error\n\t}\n\tconsole.log(val,index);\n})\n```\n\n### for Each注意点\n* 回调函数中的2参数分别为值和索引值,和jQuery的$.each相反。\n* *forEach无法遍历对象*.\n* forEach无法再IE中使用\n* forEach无法使用break和continue,而return和for循环中的continue一致。\n* 可添加第二个参数,为一个数组,在回调中用this指向这个数组,若无第二参数,则this会指向window。\n\n``` bash\nvar newArr[];\nArr.forEach(function(val,index){\n\tthis.push(val); //this指向newArr.\n},newArr)\n```\n\n### do/while方式\n不建议使用,此处不多说明\n\n## $.each\n这个为jQuery中的方法,熟悉jQuery的应该或多或少的使用过。可遍历数组和对象。\n下面的例子中e为索引值,或者key值,ele为value值\n\n``` bash\n$.each(Arr|obj,function(e,ele){\n\tconsole.log(e,ele);\n})\n```\n\n### $.each注意点\n* 使用return或return true为跳过一次循环,继续执行后面的循环。\n* 使用return false为终止循环的执行,但是并不终止函数执行,\n* 无法使用break和continue来跳过循环。\n* 循环中this输出: \n\n``` bash\nconsole.log(this);\n\nconsole.log(this=ele);\n```\n\n## $(selecter).each()\n专门用来遍历DOMList\n\n```bash\n$('.list li').each(function(i,ele){\n\tconsole.log(i,ele);\n\n\t$(this).html(i);\n\tif($(this).attr('data-item')=='do'){\n\t$(this).html('data-item:do');\n\t};\n})\n```\n* i ele 只被当前遍历DOM元素\n* this 当前被遍历的DOM元素,不能调用jQuery方法。\n* $(this)==$(ele) 当前被遍历元素的jQuery对象,可调用jQuery方法进行dom操作。\n\n*在for循环中遍历DOMList中需要将DOMlist转换为数组*\n\n```bash\nvar res=[].slice.call(domList);\nfor(var item in res){}\n```","tags":["JavaScript"]},{"title":"unity控制运动","url":"/2018/02/22/unity注意点/","content":"2. 通过Transform组件移动物体\n Transform 组件用于描述物体在空间中的状态,它包括 位置(position), 旋转(rotation)和 缩放(scale)。 其实所有的移动都会导致position的改变,这里所说的通过Transform组件来移动物体,指的是直接操作Transform来控制物体的位置(position)。\n\n<!--more-->\n2.1 Transform.Translate\n 该方法可以将物体从当前位置,移动到指定位置,并且可以选择参照的坐标系。 当需要进行坐标系转换时,可以考虑使用该方法以省去转换坐标系的步骤。\n\n public function Translate(translation: Vector3, relativeTo: Space = Space.Self): void;\n\n2.2 Vector3.Lerp, Vector3.Slerp, Vector3.MoveTowards\n Vector3 既可以表示三维空间中的一个点,也可以表示一个向量。这三个方法均为插值方法, Lerp为线性插值,Slerp为球形插值, MoveTowards在Lerp的基础上增加了限制最大速度功能。 当需要从指定A点移动到B点时,可以考虑时候这些方法。\n\n2.3 Vector3.SmoothDamp\n 该方法是可以平滑的从A逐渐移动到B点,并且可以控制速度,最常见的用法是相机跟随目标。\n\n2.4 Transform.position\n 有时重新赋值position能更快实现我们的目标。\n3. 通过Rigidbody组件移动物体\n Rigidbody组件用于模拟物体的物理状态,比如物体受重力影响,物体被碰撞后的击飞等等。\n\n 注意:关于Rigidbody的调用均应放在FixedUpdate方法中,该方法会在每一次执行物理模拟前被调用。\n\n3.1 Rigidbody.velocity\n 设置刚体速度可以让物体运动并且忽略静摩擦力,这会让物体快速从静止状态进入运动状态。\n\n3.2 Rigidbody.AddForce\n 给刚体添加一个方向的力,这种方式适合模拟物体在外力的作用下的运动状态。\n\n3.3 Rigidbody.MovePosition\n 刚体受到物理约束的情况下,移动到指定点。\n\n4. 通过CharacterController组件移动物体\n CharacterController用于控制第一人称或第三人称角色的运动,使用这种方式可以模拟人的一些行为,比如限制角色爬坡的最大斜度,步伐的高度等。\n\n4.1 CharacterController.SimpleMove\n 用于模拟简单运动,并且自动应用重力,返回值表示角色当前是否着地。\n\n4.2 CharacterController.Move\n 模拟更复杂的运动,重力需要通过代码实现,返回值表示角色与周围的碰撞信息。\n\n通常我们都需要if语句进行input.GetKey判断。根据不同的2d形式,采用unity的动画系统,动画系统中需要注意\n\n1.获取的为Aminator,需要先声明,后获取,与rigidbody相似。\n\n2.当方向较多的时候,我们使用blend tree进行各个位置的定位,因为sprite有方向,所以我们需要对Vector3.x或者y下进行1或者-1的赋值,一般在动画系统中设置parameter有moveX,moveY的bool值。在代码过程中国对aminator进行setbool方法的调用。\n\n3.在transiton(过渡)中设置conditions,状态机形式。通过getAxis来获取水平方向,键盘输入将得到1到-1范围内. transform.Translate 通过位移方式进行移动。\n\n4.transform.position得到的值是一个坐标值,也就是说,移动的sprite是通过不断刷新坐标值,从而实现移动\n\n5.放在Update()函数中的代码是以帧来执行的.如果我们需要物体的移动以秒来执行.我们需要将物体移动的值乘以Time.deltaTime。\n\n6.2d中我们需要设置player为rigidbody和box collision2d或者其他方式,还有一个就是play所站立的地方为box collision2d或其他方式。\n\n7.对钢体施加力也可形成移动,rd.addForce() Mathf.Clamp()控制速度最大和最小值,其实就是左右方向的最大值,避免速度过大,冲出场景\n\n","tags":["unity"]},{"title":"unity注意点","url":"/2018/02/22/unity-控制人物运动总结/","content":"# unity学习小总结\n\n1.prefab的使用,当完成一个gameObject的使用,通过拖拽到项目栏成为prefab,prefab将可以加快开发效率.\nprefab之后的物品,也只能通过prefab的预制体进行赋值。\n\n2.5.0版本后,Unity规范了c#的写法,RigidBody均需要先声明后获取.\n\n3.采用tag标记来处理一些碰撞检测,在逻辑上采用tag来判断,这样可以避免一些逻辑bug。\n<!--more-->\n4.在edit界面下的project setting可以改变重力等游戏项目属性。\n\n5.physics.gravity属性可获得对应位置的重力加速度\n\n6.通关创建physics material可为gameobject穿件一个物理材质,可消除一些物理方面的不真实感。\n\n7.通关input.getXXX来获取输入按键.需要留意的是getkey(\"a\")中的a为小写,大写没有效果,所以最好采用keycode.a这样的形式进行输入。\n\n8.移动通过Vector3.(up,left,right,down)搭配进行输入。\n\n9.order layer表示各场景的层级关系,越大越在前面\n\n10.一般物理位移采用FixUpdate()\n\n11.摄像头跟踪,定义transform player,transform.position为摄像头位置,player.position为玩家位置.update中得到camera和player之间的Vector3 offset.之后在update中实时的将player+offset,这样就可以得到摄像头的位置,从而实现跟踪\n\n12.vector3.zero即new vector3(0f,0f,0f);\n\n13通过在声明上面书写[]可以用于提示,或者ranger滑动控制值。","tags":["unity"]},{"title":"前端开发总结(持续更新)","url":"/2018/02/22/前端总结/","content":"\n1.清除浮动\n\n*此清除浮动可作为初始化的基本样式*\n\n``` bash\n.clearfloat{\n\tzoom:1\n}\n.clerarfloat:after{\n\tdisplay:block;\n\tclear:both;\n\tcontent:\"\";\n\tvisibility:hidden;\n\theight:0;\n}\n```\n<!-- more -->\n2. cookie,localStorage,sessionStorage区别\n\n``` bash\n1.cookie 是客户端保持状态方案。在浏览器和服务器间来回传递。\n2.sessionStorage和localStorage不会再浏览器和服务器间来回传递。\n3.sessionStorage和localStorage的存储空间大并且各自有独立的存储空间。\n4.更多丰富易用的接口。\n```\n\n3.当需要声明变量的时候,记得使用var,不要漏写,虽然JavaScript同意可以不使用var来声明变量,但是这容易造成变量的混乱,当不使用var声明变量,变量为一个全局变量。我们应该尽量避免全局变量。\n\n4.清空一个数组\n\n``` bash\nvar arr=[1,2,3];\narr.length=0;\n```\n\n5.将arguments对象转换成数组\n\n``` bash\nvar arr=Array.prototype.slice.call(arguments);\n```\n\nslice.call()是把arguments对象数组提取出来转换成数组。\n\n\n6.call()和apply()区别\ncall(thisObj,Object)参数为object\napply(thisObj,[arrArray])参数为arguments对象或者数组\n\n7.变量声明提升拆分两个部分,一为声明,一位赋值。提升是吧声明提升,赋值留在原地。\n\njavascript中一个名字(name)以四种方式进入作用域(scope),其优先级顺序如下:\n1、语言内置:所有的作用域中都有 this 和 arguments 关键字\n2、形式参数:函数的参数在函数作用域中都是有效的\n3、函数声明:形如function foo() {}\n4、变量声明:形如var bar;","tags":["面试常见"]},{"title":"Hexo本地搭建心得","url":"/2018/02/22/新的开始/","content":"\n今天下定决心弄弄自己的博客了,折腾过WordPress,不过要域名的情况下还是很蛋疼,作为学生党,最后寻找到github是可以进行blog的搭建的,选择了hexo原因在于自己对Node比较熟悉点。废话不多说,看看怎么完成第一步,本地搭建hexo。\n\n## 安装Node\n大家可以自行在[Node](https://nodejs.org/en/)的官网上进行下载.\n当安装完Node之后,自然会安装NPM,即包管理器。\n之后我们就可以开始安装hexo。\n这里希望大家安装*git*,并且学会使用*git*,对以后的工作都有很大的帮助。\n<!-- more -->\n## hexo搭建\n通过npm安装hexo,具体代码在git bash中如下,采用全局安装\n\n``` bash\n$ npm install hexo-cil -g\n```\n\n如果安装不成功,大家可以使用淘宝的*CNPM*进行安装,毕竟有时我们和这个世界不在一个维度上。\n\n#### CNPM上的安装方式\n\n``` bash\n$ cnpm install hexo\n```\n\n安装成功后,我们需要建立新的文件夹,大家可以自己选个位置,然后git bash。\n\n``` bash\n$ hexo init yourfolderName\n```\n\n当初始化成功之后,可以见到这么如下所示信息\n*INFO Start blogging with Hexo!*\n\n因为hexo 3.0后server分开成独立模块,所以这个时候,我们需要先进行server的安装,在你博客文件夹下git bash,键入命令\n\n``` bash\n$ npm install hexo server\n```\n\n激动人心的时刻到了,安装完后,输入以下命令\n\n``` bash\n$ hexo server\n```\n或者\n\n``` bash\n$ hexo s\n```\n\n我们将会获得如下信息提示。\n*INFO Start processing\nINFO Hexo is running at http://localhost:4000/. Press Ctrl+C to stop.*\n\n可能有朋友会没有反应,原因可能是端口冲突了,你只需要在文件下的*node_modules*中的*hexo-server*的*index.js*修改port的值即可。\n\n待续。。。\n","tags":["本地搭建"]},{"title":"http相关缓存头","url":"/2018/02/22/http相关缓存头信息收集/","content":"\nhttp中分请求头和响应头两种。\n>请求头是浏览器向服务器发送请求的数据和资源.\n>响应头是服务器向浏览器响应的数据。\n\n##常见的请求头:\n<!-- more -->\n``` bash\nAccept: text/html,image/* 浏览器可以接收的类型 \nAccept-Charset: ISO-8859-1 \t 浏览器可以接收的编码类型\nAccept-Encoding: gzip,compress \t 浏览器可以接收压缩编码类型 \nAccept-Language: en-us,zh-cn \t 浏览器可以接收的语言和国家类型\nHost: www.lks.cn:80 \t 浏览器请求的主机和端口\nIf-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT \t\t\t \t 某个页面缓存时间 \nReferer: http://www.lks.cn/index.html \t 请求来自于哪个页面\nUser-Agent: Mozilla/4.0 compatible; MSIE 5.5; Windows NT 5.0 \t 浏览器相关信息\nCookie: 浏览器暂存服务器发送的信息\nConnection: close1.0/Keep-Alive1.1 HTTP请求的版本的特点\nDate: Tue, 11 Jul 2000 18:23:51GMT 请求网站的时间\nAllow:GET 请求的方法 GET 常见的还有POST\nKeep-Alive:5 连接的时间;5\nConnection:keep-alive 是否是长连接\nCache-Control:max-age=300 缓存的最长时间 300s\n```\n\n##常见的响应头\n\n``` bash\nLocation: http://www.lks.cn/index.html 控制浏览器显示哪个页面 \nServer:apache nginx 服务器的类型 \nContent-Encoding: gzip 服务器发送的压缩编码方式 \nContent-Length: 80 服务器发送显示的字节码长度 \nContent-Language: zh-cn 服务器发送内容的语言和国家名 \nContent-Type: image/jpeg; charset=UTF-8 \t\t 服务器发送内容的类型和编码类型 \nLast-Modified: Tue, 11 Jul 2000 18:23:51GMT \t\t\t 服务器最后一次修改的时间 \nRefresh: 1;url=http://www.lks.cn 控制浏览器1秒钟后转发URL所指向的页面 \nContent-Disposition: attachment; filename=lks.jpg \t\t\t 服务器控制浏览器发下载方式打开文件 \nTransfer-Encoding: chunked 服务器分块传递数据到客户端 \nSet-Cookie:SS=Q0=5Lb_nQ; path=/search \t 服务器发送Cookie相关的信息 \nExpires: -1 资源的过期时间,提供给浏览器缓存数据,-1永远过期 \nCache-Control: no-cache 告诉浏览器,定要回服务器校验,不管有没有缓存数据。 \nPragma: no-cache 服务器控制浏览器不要缓存网页 \nConnection: close/Keep-AliveHTTP 请求的版本的特点 \nDate: Tue, 11 Jul 2000 18:23:51 GMT 响应网站的时间 \nETag:“ihfdgkdgnp98hdfg” 资源实体的标识(唯一标识,类似md5值,文件有修改md5就不一样)\n```","tags":["http"]},{"title":"javascript原型链方面总结","url":"/2018/02/22/javascript原型链方面总结/","content":"\n\n1.JS中有boolen,string,undefined,number,object,function,null基本类型\ntypeof可识别值类型,即boolen,object,number,string,undefined,function\nobject. 如null,var b=[];var b={};只会判断为object。\n<!--more-->\n如图\n\n\n\n2.== 会进行强制的转换,===则不会.\n一般来说工作==可以用来简单书写某些代码,达到简洁的方式\n如if(b==null)即是if(b===null || b===undefined)\n\n3.引用类型都可进行扩展,引用类型即typeof所不能识别。\n如对象,函数,var a=[],JSON其实也是JS的一种对象\n\n\n\n4.所有引用类型都还有隐式类型_proto_.而函数都含有prototype类型\n\n关于原型链,var f=new Foo(),那么对象f上有隐式_proto_指向Foo.prototype,\n所有当f在自身没找到属性,将向上寻找,即在Foo.prototype.当还是没有的时候,将\n继续向上,而Foo.protype也存在一个隐式属性_proto_指向Object.protype.这个Object为\nJS自身存在的native code。总结起来,可以用下图表示\n\n\n\n在chrome 控制台进行测试,如图\n可以很好的解释上图所说的原型链。通过foo.prototype._proto_===Object.protype\n为true,确实按照原型链所说不停往上。\n\n\n","tags":["原型链"]},{"title":"2017gamejam记录","url":"/2018/02/22/2017gamejam01/","content":"\n第一次参加gamejam,虽然不是以参赛者的身份,但是确感受到了不一样的东西。对于一个热爱游戏,并且希望致力于游戏开发方向的我,参加这次活动,自我感觉还是挺值的,可以认识到行业里面的人,从他们的口中,或者是制作过程中,可以去了解游戏制作的过程,何乐而不为呢。\n<!--more-->\n# 6点前\n主持人和乐逗方面负责人的一些谈话,我觉得这里有些东西还是可以分享的,首先一款游戏的开发流程一般是这样:\n\n1.立项:做什么\n2.策划:怎么做\n3.开发:做出来\n4.演示:卖出去\n\n\n\n\n这是一种比较理想下的情况,更多的时候是不断的反复于前三项。\n\n# 6点\n主题揭开,此次的主题很有意思,如下:\n\n\n\n是一颗树,从根部到树干都很完整的一棵树,作为吃瓜群众的我,首先映入脑海的就是要有寓意,这次出这个题,玩法上应该需要偏轻松些,但是寓意要强。\n\n试想下,自己要做应该做成什么样子,我大概也想了想,也有那么几套方案吧。以文字代替集中在时间轮回,小孩,暗与光。这几个题材上。\n\n玩法上会偏休闲,一笔画,简单数字解谜,都是可以的。自己也和现场小伙伴有些交流,感觉都很棒,接下来两天就看他们怎么开始了,明天继续去学习观摩。","tags":["游戏开发"],"categories":["感悟"]},{"title":"原生JavaScript编写ajax","url":"/2018/02/22/ajax学习总结/","content":"\najax全程是异步的JavaScript和xml,作用为可局部刷新网页,无需重新加载整个网页,大大的提升了用户的交互性\n\najax是一种用于创建快速动态网页的技术\n*AJAX应用程序与浏览器和平台无关*\n<!-- more -->\n下面是一个JavaScript原生ajax创建对象方法\n\n``` bash\nfunction createXMLDoc(){\n\tvar xmlhttp;\n\tif(window.XMLHttpRequest)\n\t{\n\t\txmlhttp=new XMLHttpRequest();\n\t}\n\telse{\n\t\txmlhttp=new ActiveXObject(\"Microsoft.XMLHTTP\");\n\t}\n\txmlhttp.onreadystatechange=function(){\n\t\tif(xmlhttp.states==200&&xmlhttp.readyState==4)\n\t\t{\n\t\t\tdocument.getElementById(\"myDic\").innerHTML=xmlhttp.responseText;\n\t\t}\n\t}\n\txmlhttp.open(\"GET\",url,true):\n\txmlhttp.send();\n}\n```\n\n## XMLHttpRequest对象\n\n### open()和send()的方法\nopen方法中有三个参数,从左往右分别是\n* method:请求类型:GET或者POST\n* url:文件在服务器上的位置\n* async: true()(异步)或false()(同步)\n*url中文件可以使任何类型的文件*\n\n\n\nsend()方法中的参数仅用于POST请求。\n\n### GET和POST的区别\nGET:\n1.一般用于信息获取\n2.使用URL传递参数\n3.对所发送信息的数量有限制,一般在2000个字符\n4.传送数据量小,处理效率高。\n5.安全性低,会被缓存。\n\nPOST:\n1.用于修改服务器上的资源。\n2.对所发送信息的数量无限制。\n3.安全性高。可靠性高。\n\n## AJAX的服务器响应\n\n* responseTest 获得字符串响应数据\n* responseXML 或的XML形式响应数据\n\n##AJAX的readyState和status\n\nreadyState:\n>0:请求未初始化\n>1:服务器连接已建立\n>2:请求已接收\n>3:请求处理中\n>4:请求已经完成,且响应已就绪\n\nStatus:\n>200:ok\n>404:未找到页面\n\n#### HTTP请求中常用的状态码\n\n>301,302 重定向,后跟location头指明跳转位置\n>304 从浏览器缓存加载\n>403 权限不够,拒绝访问\n>404 资源未找到\n>500 服务器内部错误,通常为后端错误\n\n","tags":["前端"]},{"title":"位运算总结","url":"/2018/02/22/CodeFight经典问题/","content":"## 位运算形式\n\n1.与,或,非,异或运算特点\n非(~):1变0,0变1.\n与(&):有0则为0,均为1返回1.<!-- more -->\n或(|):均为0返回0,有1为1.\n异或(^):均为1或者0,均返回0.只有一个1返回1. (x^y)>=0 true为相同符号,false为不同符号\n\n2.左移和右移\n左(<<): n<<1 表示n乘以2, x+y>>1 两数相加平均数\n右(>>):n>>1 表示n除以2\n\n","tags":["位运算"]},{"title":"hexo部署到github","url":"/2018/02/22/hexo建站-部署到github/","content":"\n昨天已经说了在本地搭建一个hexo,今天来总结下怎么把hexo部署到github上\n\n## 注册github\n当然了,部署到github上,首先你得有个github账号,注册步骤大家可以自行的google下,不难。\n<!-- more -->\n## 建立一个仓库\nok,这里说一下github是个好东西,新手应该好好打理自己的github,而不是做好博客就不管啦。\n回头来看,当你注册好后,你需要建立一个仓库,具体建立仓库的办法如下\n1.先建立一个新仓库\n<img src=\"http://ormm8jbub.bkt.clouddn.com/newRepo.png\">\n2.填入各项信息\n<img src=\"http://ormm8jbub.bkt.clouddn.com/buildRepo.png\">\n3.回到你刚建立的仓库,点击setting\n<img src=\"http://ormm8jbub.bkt.clouddn.com/setting.png\">\n4.滚轮至底部,寻找到如图按钮并点击\n<img src=\"http://ormm8jbub.bkt.clouddn.com/automaticPage.png\">\n5.进入下一页,根据自己想法填,这里设置之后就是你的首页了,最后找到如图按钮\n<img src=\"http://ormm8jbub.bkt.clouddn.com/continueLayout.png\">\n6.最后选择你喜欢的布局,按下如图按钮\n<img src=\"http://ormm8jbub.bkt.clouddn.com/publishLayout.png\">\n\n现在你的github博客站点已经完成,地址应该是[http://XXXX.github.io/](http://xxxx.github.io/)把xxxx改成你的博客名字就可以访问了.接下来,我们把在本地的hexo部署到github上,才算真正的成功。\n\n## hexo部署\n首先你需要在*_config.yml*文件中的deploy进行书写,如下格式\n\n``` bash\ndeploy: \n type: git\n repo: git@github.com:WenAce/WenAce.github.io.git\n branch: master\n```\n\n设置好后,进行两个命令即可部署到github上了,如下\n\n``` bash\n$ hexo generate\n```\n\n得到最后的提示为*INFO 35 files generated in 2.88 s*为成功\n接着我们需要deploy就完成了\n\n``` bash\n$hexo deploy\n```\n\n出现*INFO Deploy done: git*,即成功。\n\n\n当你上传之后,需要等几分钟,才有可能看到效果,耐心等待下。\n最后说一下这里有两个会错误的点,\n1.有朋友会出现deploy错误的情况,按照以下来做\n\n* 安装 npm install hexo-deployer-git --save\n* 将deploy 的 type由github改为git\n\n2.插入图片不成功\n\n* 在source中建立images文件夹,把图片放进去\n* 采用img标签进行设置即可,格式为\n\n``` bash\n<img src=\"/images/publishLayout.png\">\n```\n\n这样你就完成了,你的第一个在线博客完成了,接下来,我会总结一下markedown的一些语法,还有hexo上的设置问题,期待下吧(ˇˍˇ) 。\n","tags":["github"]},{"title":"gamejam总结","url":"/2018/02/22/gamejam总结/","content":" 自己首次参与gamejam结束了,总体感觉不能完全说出来,\n看见各种新奇的idea,感觉看见另一个不曾知道的大门,审视自己,然而还有\n很长的一段路需要走,踏实的走下去,或许就是另一种结果。\n<!--more-->\ngamejam所提倡的就是一种纯粹的对游戏的热爱,各种新奇好玩的点子,和各开发者\n的交流,确实不能比这个更棒的事情了,大家都在一个channel里。\n\n从技术上看见基本的开发流程,api使用,美术上更是打开我所不清楚的大门。需要学习\n的还有很多。这次活动获益良多\n\n\n\n\n\n\n\n\n\n\n\n","tags":["gamejam"],"categories":["感悟"]},{"title":"hexo重新部署的注意点","url":"/2017/06/15/hexo重新部署的注意点/","content":"\n作为博客,hexo在本地弄好之后是相对方便的,然后偶尔的重装或者换电脑的时候,我们应该怎么样来进行重新部署呢。<!--more-->\n\n1.一般情况下,一些朋友的是还在硬盘上,而一些朋友的可能只能从github上仓库下载下来\n\n2.开始之前,我建议大家使用cnpm,npm有时候会抽风(ps:国内),下面的内容也是使用cnpm进行对module进行安装.\n\n**源文件从github下载**\n\n```\ngraph TB\nA[github进行源文件clone]-->B[对本文件进行gitbash]\nB[对本文件进行gitbash]-->C[cnpm install hexo]\nC[cnpm install hexo]-->D[cnpm install hexo server]\n```\n如果源文件依旧在本地,将node_modules删除,然后进行如github下载的步骤.\n\n**注意点**\n\n```\ngraph TB\nA[hexo无法正常使用]-->B[hexo server没有安装]\nA[hexo无法正常使用]-->C[hexo deploy无法使用]\nA[hexo无法正常使用]-->D[hexo无法识别]\n\nB[hexo server没有安装]-->E[cnpm install hexo server]\n\nC[hexo deploy无法使用]-->F[cnpm install hexo-deployer-git -save]\n\nD[hexo无法识别]-->G[SSH重新配置]\n```\n\n以下是对SSH重新配置\n\n1.在Git Bash输入以下指令(任意位置点击鼠标右键),检查是否已经存在了SSH keys。\n>ls -al ~/.ssh\n\n2.如果不存在就没有关系,如果存在的话,直接删除.ssh文件夹里面所有文件,位置应该在我的文档的用户文件夹中.\n\n3.输入以下指令(邮箱就是你注册Github时候的邮箱)后,回车:\n>ssh-keygen -t rsa -C \"XXXXX@XX.com\"\n\n4.然后它会提示要你输入passphrase,这个时候不需要输入任何数据,直接一路回车.\n\n5.成功之后键入:\n>ssh-agent -s\n\n6.这一步有可能会出现\"Could you open..\"的错误信息\n>ssh-add ~/.ssh/id_rsa\n\n这个时候你需要键入以下命令\n>eval `ssh-agent -s`\n\n成功后键入\n\n>ssh-add\n\n7.到了这一步,就可以添加SSH key到你的Github账户了。键入以下指令,拷贝Key(先拷贝了,等一下可以直接粘贴):\n\n>clip < ~/.ssh/id_rsa.pub\n\n8.添加SSH至github,这里就不赘述了,网上有很多教程.\n\n9.之后可以测试下,输入以下命令,如果出现警告,输入yes就行\n>ssh -T git@github.com","tags":["hexo"]}]