Unity
冰河烈风
https://gitee.com/bingheliefeng
展开
-
Unity URP自学笔记本六 ShaderGraph中的Custom Function
Shader Graph中有两种Custom Function方式,一种是通过字符串,也就是直接把代码写上去,第二种是通过外部文件,把代码写到外部,如果下面的一个自定义的外部hlsl文件;#ifndef CUSTOMFUNC_INCLUDE#define CUSTOMFUNC_INCLUDEvoid MainLight_half(float3 WorldPos, out half3 Direction, out half3 Color, out half DistanceAtten, out hal原创 2021-07-12 12:28:56 · 3031 阅读 · 0 评论 -
Unity Pahfinding 插件中直接用RVOController来移动角色
using UnityEngine;using System.Collections;using Pathfinding.RVO;public class SimpleRVOAI : MonoBehaviour { RVOController controller; // Use this for initialization void Awake () { controller = GetComponent<RVOController>();原创 2021-07-08 13:47:45 · 644 阅读 · 0 评论 -
Unity URP自学笔记五 假阴影
阴影的制作方式很多,下面是类似王者荣耀的阴影,主要是这种阴影显示效果好,性能好。缺点是只是在一个平面上的阴影,主要用于地面是平的情况。此阴影还是通过Renderer Feather方式添加,下面是shadowShader "Unlit/Shadow"{ Properties { _ShadowY ("ShadowY", float) = 0.001 } SubShader { Pass {原创 2021-07-05 16:13:23 · 1226 阅读 · 2 评论 -
Unity URP自学笔记四 ShaderGraph
在ShaderGraph中自定义光照计算,主要需要获取光照的颜色和方向,这些需要自己通过脚本来获取。例如通过CustomFunction结点来处理:下面创建了一个半兰伯特SubGraph,便于以后多个地方可用:其他ShaderGraph操作自己看其他教程,相对比较简单,这里就不用多讲了。...原创 2021-07-05 13:56:40 · 1302 阅读 · 3 评论 -
Unity URP自学笔记三 阴影计算
通过查看Lighting.hlsl,可以看到GetMainLight方法,其中有一个方法是通过阴影坐标来获取不前的阴影值。具体操作是在顶点计算中获取当前顶点的世界坐标,然后在片断着色中通过世界坐标来获取阴影坐标,然后再获取阴影值。如下面的代码片断:v2f vert (appdata v){ v2f o; o.vertex = TransformObjectToHClip(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex);原创 2021-07-05 12:27:58 · 1154 阅读 · 0 评论 -
Unity URP自学笔记二 模型描边
在以前的Builtin方式中,一般描边是通过一个Pass来实现,这样做相当于使用了这个shader的物体,在渲染时,需要依次执行模型渲染和描边渲染两个pass,如果某一个时间点不需要显示描边,可能就需要对这个模型换shader或材质,使用起来会有点麻烦。而最新的URP或HDRP中,虽然也可以使用多个Pass来实现,只是Pass的有数量限制,而且默认只支持那几种LightMode,所以最好的实现是通过Renderer Feather来实现,相当于相机再通过某个材质或shader再渲染一次物体,此时我们就可以原创 2021-07-05 12:17:46 · 2476 阅读 · 0 评论 -
Unity URP自学笔记一
因为CG英伟达不再维护,并且支持的功能比较少,基本和DX9的功能差不多,随前显卡的更新换代,unity在URP和HDRP中使用了HLSL,支持DX11相关的API,并有逐步抛弃CG的意途,而且还可以用ShaderGraph来创建shader,方便美术和策划创作。HLSL的语法总体来说和CG差不多,只不过有一些小的差别,首先从格式上,基本上致,只是多了一些标签,例如RenderPipeline = "UniversalRenderPipline"代码放在HLSLPROGRAM ... HLSLEND 之原创 2021-07-01 13:13:27 · 819 阅读 · 1 评论 -
AstarPathfindingProject 中RVO碰撞体扩展
原本库中只有矩形RVO碰撞体,如果要添加自己的需要继承RVOObstacle抽象类,重写里面的方法例如下面的圆柱形碰撞using UnityEngine;#if UNITY_EDITORusing UnityEditor;using Pathfinding.RVO;#endifnamespace Pathfinding.RVO{ [AddComponentMenu("Pathfinding/Local Avoidance/Cylinder Obstacle")] pu原创 2021-03-26 10:47:26 · 960 阅读 · 0 评论 -
Unity ScrollView和GridLayout
scollRect.onValueChanged.AddListener((Vector2 v)=>{ ScrollContent.SetHeight(grid.preferredHeight + 20f);});获取Layout的高度,用于设置ScrollView的滚动高度原创 2021-02-04 20:23:59 · 422 阅读 · 0 评论 -
Unity Burst学习2
和JobSystem配合使用导入命名空间using Unity.Burst;using Unity.Jobs;using Unity.Collections;注意里面用到的都是值类型,如果是Vector3之类的,需要转换成Unity.Mathematics中的float3。支持readonly静态数组[BurstCompile]struct ST : IJob{ [ReadOnly] public float a; [ReadOnly] publi原创 2021-01-28 12:20:18 · 451 阅读 · 0 评论 -
Unity Burst学习1
对静态方法进行BurstCompile需要导入Burst Package添加命名空间相关引用using Unity.Burst;using AOT;[BurstCompile]public class TT{ [BurstCompile(CompileSynchronously=true)] [MonoPInvokeCallback(typeof(Process2FloatsDelegate))] public static float Cal(float原创 2021-01-28 12:13:53 · 1305 阅读 · 0 评论 -
随机围绕球体旋转
主要是随机算出一个旋转轴public class Rota : MonoBehaviour{ private Vector3 _axis ; [SerializeField] private float _rotaSpeed = 5; // Start is called before the first frame update void Start() { Vector3 toZero = transform.position.n原创 2020-12-16 09:25:23 · 228 阅读 · 0 评论 -
Unity限制旋转角度
float CheckAngle(float value){ float angle = value - 180; if (angle > 0) { return angle - 180; } return angle + 180;}//用法var rotate = Quaternion.Lerp(transform.rotation, forward, Time.fixedDeltaTime * m_rotateSpeed);.原创 2020-11-17 16:11:57 · 2231 阅读 · 0 评论 -
UGUI 用图片遮罩
在UGUI或者Sprite中,有图片作为遮罩层的情况,但是因为使用了SpriteAtlas,会造成取得的遮罩的uv是错误的。所以我们需要得到正确的uv。有两种方式,其实算法都一样,目的就是获取正确的遮罩层的uv。第一种,通过外部传入一个vector4的值在c#中,对材质传递Sprite信息值if (img.sprite){ Sprite sprite = img.sprite; Vector4 result = new Vector4(sprite.textureRe原创 2020-07-08 10:27:31 · 588 阅读 · 0 评论 -
UGUI 文本加粗
这是用的Aril字体,通常情况下,直接用<b>达不到这样粗的效果,所以需要重新写一个字体效果,类似描边的效果。上面的图片就是效果和所设置的参数。下面是代码,参考其他人的代码改编的using UnityEngine;using System.Collections.Generic;using System.Text.RegularExpressions;using UnityEngine.UI;[RequireComponent(typeof(Text))]publ...原创 2020-07-01 18:34:51 · 2053 阅读 · 0 评论 -
UNITY_MATRIX_IT_MV
MV transforms points from object to eye space IT_MV rotates normals from object to eye space上面是文档上的定义,可以看出IT_MV主要用于法线,那为什么法线不用MV来转换呢,那是因为法线和切线有方向,如果模型在非等比例缩放时,方向向量会变化,所以不能直接用MV...原创 2020-07-01 10:06:39 · 1445 阅读 · 0 评论 -
Unity multi_compile_instancing
对于大量相同模型的性能优化,在shader方法,可以用gpu instancing方式。例如这个简单阴影计算的pass,注意里面有很多UNITY_开头的命令//投影的计算PassPass{ Name "Shadow" Stencil { Ref 0 Comp equal Pass incrWrap Fail keep ZFail keep } Blend SrcAlpha OneMinusSrcAlpha ZWrite Off Offset -1, 0原创 2020-07-01 09:50:21 · 1911 阅读 · 0 评论 -
Unity导出安卓工程运行报错,或者打不出apk解决办法
在build.gradle中加checkReleaseBuilds falselintOptions { checkReleaseBuilds false abortOnError false}可以直接改Unity安卓目录中的安卓工程模板,以免每次都要手动添加原创 2020-07-01 09:32:24 · 1020 阅读 · 0 评论 -
Unity3D描边
描边的方式有好几种一种是根据法线方向扩展模型的方式,这种方式最简单,但效果不好。第二种是将法线转到投影空间后,再扩展顶点,这种方式比第一种好一点点,但是模型的线还是会有断面第三种是在第二种基础上,重新计算法线,防止断线,而重新计算的法线数据,可以存入模型的切线数据中,这种出来的描边效果最好。下面主要是第三种的实现方式:重新计算法线的方法:private void WirteAverageNormalToTangent(Mesh mesh){ var vertics .原创 2020-07-01 09:28:21 · 1099 阅读 · 0 评论 -
Unity顶点光照Blinn-phong
在手机游戏中,如果又想要光照,又想性能好,可以考虑用顶点光照,虽然效果上差了一点,但是如果物体属于低多边形,或者物体比较小,这两种情况下可以考虑用这种光照效果。顺便还可以给模型加顶点颜色,直接使用顶点颜色来控制模型的显示。Shader "_Game/Blinn-Phong Vertex Light" { Properties { _Specular("Specular",Color) = (1,1,1,1) _Gloss("Gloss",Range(1.0,256)) = 20原创 2020-06-12 10:54:00 · 551 阅读 · 0 评论 -
Unity旋转
只在水平方向上旋转:可以将方向向量投影到水平方向,再来计算旋转Vector3 dir = (target.position - transform.position).normalized;//投影到水平方向dir = dir - Vector3.Project(dir,Vector3.up);Quaternion quaternion = Quaternion.LookRotat...原创 2020-03-31 16:00:00 · 153 阅读 · 0 评论 -
Surface shader 多个Pass的写法
在surface shader中,虽然不能用pass这个词,但是最终的shader生成后,会自己生成pass。那如果我们想在Surface shader中写多个pass怎么办?其实我们只需要把一个pass的内容包含到CGPROGRAM .... ENDCG 之中就行了,例如下面的shader:Shader "Custom/MySurface"{ Properties ...原创 2019-12-24 14:44:27 · 2093 阅读 · 1 评论 -
Unity判断网络连接状况
Unity3d内置判断网络连接的方法 .原创 2015-08-13 09:21:13 · 1337 阅读 · 0 评论 -
Unity 给代码添加命名空间
下面是快速对项目中的代码添加命名空间。using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEditor;using System;using System.IO;/// /// 给脚本添加和修改命名空间/// public class AddNamesp原创 2017-10-16 15:41:10 · 7422 阅读 · 0 评论 -
Unity 重置项目资源的guid
有时需要将多个项目的资源合并到一个项目中,但有可能有些资源是共用的,它的guid是一样的,这样合并到一个项目时,可能会超成冲突。如果要让每个资源的guid都不相同,就需要重新生成guid,并且更新引用。下面是步骤1. UNITY菜单-> Editor > Project Setting - > Editor 设置 Version Controller 为Visible Meta原创 2017-10-16 15:36:37 · 10534 阅读 · 4 评论 -
给场景自动添加AssetBundleName
[MenuItem("Tools/Auto Scene Bundle")] static void AutoSceneBundleName(){ List filesPaths = new List(); filesPaths.AddRange( Directory.GetFiles(Path.GetFullPath(".") + Path.DirectorySepara原创 2017-11-06 21:37:11 · 318 阅读 · 0 评论 -
Unity Shader之动态阴影
动态阴影在Unity中,默认是使用ShadowMap,原理是通过生成投影深度图来比较,但是由于在移动平台对深度浮点值计算的限制,使得ShadowMap技术在移动平台要么效果不理想,要么需要消耗大量的计算。所以常见的处理移动平台阴影的方式是使用RenderTexture + 投影,如王者荣耀中的实时阴影。具体的方式是先渲染一张RenderTexture,这张RenderTex原创 2017-08-29 11:59:18 · 3804 阅读 · 0 评论 -
Unity Shader Property 默认参数
//Float类型,下面对应变量可以用flaot,half,fixed _Name("Inspector Name", Float) = defaultValue //Float类型,可以用一个滑动条控制范围,下面对应变量可以用float,half,fixed _Name("Inspector Name", Range(min, max)) = defaultValue //颜色类型,下面...原创 2018-03-09 17:26:30 · 2698 阅读 · 0 评论 -
Unity之大地图分割保存
我们在做大型3D游戏时,资源比较大的一部分就是场景,场景包含很多模型和贴图,还有Lightmap图片和数据,为了将一个场景打包成一个assetbundle以方便动态加载,可以把整个场景打成一个assetbundle,场景中的材质和贴图以及LightMap打到另一个assetbundle里面,这种方式最简单,但是打出来的场景包会很大,相当于场景中所有的模型都打了进去,如果其他场景没有用到这个模型还好...原创 2018-04-09 12:07:21 · 6859 阅读 · 1 评论 -
Unity之布料效果
上面的效果是Blinn-phong 加Detail 做出来的,BlinnPhong 是常用的一种带有反射的光照算法。而为了达到布料的效果,还需要加两张贴图,一张是面料的Detail贴图,另一张是布料的法线贴图。下面的代码只是演示代码,里面的光照是写死了的,如果大家要用动态光去控制,需要自己改。至于布料相关的贴图可以在网上搜索,因为不同类型的面料Detail和DetailNormal贴图不一样。Sh...原创 2018-03-29 11:24:48 · 4426 阅读 · 1 评论 -
C# 获取两线段交点
//获取两直线交点,z 值没有用 public static Vector3 GetIntersection(Vector3 lineAStart,Vector3 lineAEnd, Vector3 lineBStart,Vector3 lineBEnd) { float x1 = lineAStart.x, y1 = lineAStart.y; ...原创 2018-12-29 22:38:43 · 7230 阅读 · 2 评论 -
Unity画面压缩
因为Google广告政策的原因,游戏中Banner广告不能遮挡游戏操作元素,一种是把操作内容移动一下,留出广告空间。另一种方法是将Unity画面压缩,把Banner广告位置显示为黑色。为此我们需要修改Camera的投影矩阵。通过获取广告的高度来计算。但是留出的位置还是会触发触摸事件,我们可以用一块黑色 的UI来遮挡using UnityEngine;using System.C...原创 2019-03-28 12:27:34 · 357 阅读 · 0 评论 -
Unity中 清除对象的所有事件侦听
public static void ClearAllEvents(object objectHasEvents){ var events = objectHasEvents.GetType().GetEvents(); if (events == null || events.Length < 1) { return; } foreach (var info in e...原创 2019-03-28 12:32:13 · 4882 阅读 · 0 评论 -
Unity Shader 扇形进度条
我们知道在Unity后面的版本中SpriteRenderer已经有了Tiled功能,可以实现扇形进度条的功能,不过如果我们需要多种样式的进度条,可能就需要写shader了。下面是实现扇形进度条的代码,如果需要其他样式 的,可以直接修改。Shader "My/Pie" {Properties { _MainTex ("Base (RGB) Trans (A)", 2D) = "whi...原创 2019-06-17 10:07:06 · 1967 阅读 · 0 评论 -
Unity Shader之投影
投影在3D游戏中经常使用,比如弹孔,血溅到地面上,贴花等效果都可以使用投影。投影在Unity中的是一个Projector的Component,它上面的参数跟Camera的参数极为相似,其实可以理解,它的目的就是为shader提供需要的矩阵参数。最主要的参数就是unity_Projector和unity_ProjectorClip两个。unity_Projector参数是投影Cookie贴图原创 2017-08-29 11:33:29 · 4878 阅读 · 0 评论 -
Unity Spine 换图(通过外部图片)
在spine中,如果想通过外部一张单独的来替换动画中的某个部位,需要手动创建Attachmentusing UnityEngine;using System.Collections;using Spine.Unity;public class ChangeSkin : MonoBehaviour { private SkeletonAnimation anim; public T原创 2017-06-23 15:38:58 · 9261 阅读 · 5 评论 -
2d多点旋转,缩放,移动
#region 触摸和旋转 //上次记录的两个触模点之间距离 float lastDistance = 0f; float preRadian = 0f; bool isTwoFinger; void Update(){ if(IapPopUp.Instance!=null) return; if(secondContent.childCount>0 && secondCont原创 2017-04-24 14:55:24 · 615 阅读 · 0 评论 -
Unity3D之将图片转成NormalMap
public static Texture2D toNormalMap(Texture2D t){ Texture2D n = new Texture2D(t.width,t.height,TextureFormat.ARGB32,true); Color oldColor = new Color(); Color newColor = new Color(); for (int原创 2015-10-26 08:31:06 · 3402 阅读 · 0 评论 -
Unity3D之物体跟随鼠标移动和旋转
void FixedUpdate() { if (Input.GetMouseButton(0)) { Vector3 aimPos = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, Camera.mai原创 2015-11-10 11:50:22 · 16836 阅读 · 1 评论 -
Unity3D之实现火炬之光遮挡效果
要实现角色被遮挡的部分显示半透明。下面是用到的ShaderShader "Custom/PlayerDiffuse" { Properties { _NotVisibleColor ("NotVisibleColor (RGB)", Color) = (0.3,0.3,0.3,1) _MainTex ("Base (RGB)", 2D) = "white转载 2015-10-21 00:27:54 · 2110 阅读 · 2 评论