Skip to content

Instantly share code, notes, and snippets.

View stilllisisi's full-sized avatar
🎯
Focusing

stilllisisi

🎯
Focusing
View GitHub Profile
@stilllisisi
stilllisisi / PlayerShadow.cs
Created March 11, 2020 07:48
【游戏-unity】Unity-Shader编程-模型实时阴影。在游戏开发中实时阴影最常见的方法是实时光照,但是这个会带来性能的问题,如果场景中模型比较多,采用实时光照DC会增加好几百,会造成渲染的压力。这里介绍Shader来现在的方案。
//第二个pass专门用来渲染阴影,power参数是颜色加强,因为关闭了实时灯光,模型会显得暗淡,这个参数跟阴影效果没太大关系。
//主要是将光照向量和当前模型的坐标传递给Shader,以便Shader实时计算出当前模型的阴影。
//C# 实现代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerShadow : MonoBehaviour
{
public Camera mCamera;
public GameObject mLight;
@stilllisisi
stilllisisi / thisExtend.cs
Created March 11, 2020 07:35
【游戏】利用This扩展静态方法(链式编程)
//比如 "gameObject.GetComponent<Transform>() ; " 可以通过GameObject直接调用Unity定义好的API "GetComponent" ;
//如果已有API满足不了使用需求,还可以利用This关键字进行扩展(专业名词应该是链式编程),当然也不仅限于GameObject。
//比如:
//修改Transform.Position的X值:
public static void SetPositionX(this Transform t, float newX)
{
t.position = new Vector3(newX, t.position.y, t.position.z);
}
//修改Vector3的Y值:
@stilllisisi
stilllisisi / PanelBase.cs
Created March 11, 2020 07:24
【游戏-Unity】Unity搭建简易UI框架。在Unity项目开发中,UI模块的开发往往占据了很大一部分工作,部分游戏甚至绝大部分的工作都是在UI上,如何高效管理各种界面,下面就给大家分享一套高效易用的UI框架。
//首先,我们定义一个PanelBase类,作为所有panel的父类,在这个类里,我们可以给panel定义一套生命周期
//初始化
public virtual void Init(){}
//开始面板前
public virtual void OnShowing() { }
//显示面板后
public virtual void OnShowed() { }
//帧更新
public virtual void Update() { }
//关闭前
@stilllisisi
stilllisisi / NewSurface.shader
Last active March 13, 2020 08:39
【游戏-shader】shader的uv动画,利用序列贴图来展示动画效果。
//原理:shader里变换UV采样序列帧贴图
//下面是网上摘的一段shader代码:
Shader "Custom/NewSurfaceShader" {
Properties {
_Color ("Main Color", Color) = (1,1,1,1)
_MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
_SizeX ("列", Float) = 4
_SizeY ("行", Float) = 2
_Speed ("播放速度", Float) = 150
}
@stilllisisi
stilllisisi / 1_Matcap.shader
Created March 11, 2020 03:30
【游戏-unity】Unity Shader-Matcap(材质捕获)使用解析
//1. Matcap的实现(提前了解Matcap的原理)
//我们使用了UNITY_MATRIX_IT_MV,即正常矩阵的逆转置进行计算,原因在于直接用ModelView矩阵变换法线时,对于非uniform变换可能导致法线与平面不垂直的问题。
//我们使用一张Matcap,在Matcap中,我们最终采样的是一个法线方向变换到(0,1)区间的结果,实际上有效的区域就只是贴图中心周围的圆形范围内有效。
//而Matcap比较直白的效果就是,在当前视角方向看,Matcap的上下左右方向的颜色就对应模型在当前视角方向对应的法线所指向的上下左右方向。
//shader代码如下:
/********************************************************************
FileName: Matcap.shader
Description: Matcap效果
history: 4:11:2018 by puppet_master
@stilllisisi
stilllisisi / 1_EdgeEffect.cs
Last active March 13, 2020 02:01
【游戏-shader】Unity Shader-边缘检测效果(基于颜色,基于深度法线,边缘流光效果,转场效果)
//1.基于图像的边缘检测
//C#代码如下:
/********************************************************************
FileName: EdgeEffect.cs
Description: 后处理描边效果,使用Roberts和Sobel算子,可调强度&检测距离
history: 11:11:2018 by puppet_master
https://blog.csdn.net/puppet_master
*********************************************************************/
using UnityEngine;
[ExecuteInEditMode]
@stilllisisi
stilllisisi / 1_CompareColor.cs
Created March 11, 2020 02:48
【游戏-shader】Unity Shader-BilateralFilter(双边滤波,磨皮滤镜)。实现双边滤波效果(基于颜色的双边滤波,基于法线的双边滤波效果),实现了高斯滤波。使用双边滤波可以在保证图像边缘的情况下达到去噪的目的,可以很容易地实现图像处理的磨皮滤镜,实现Dither RayMarching,SSAO等使用随机采样的渲染效果的去噪。
//1. 基于颜色差值的双边滤波,也是传说中的磨皮滤镜的实现方式。
//C#关键代码如下:
private void OnRenderImage(RenderTexture source, RenderTexture destination)
{
var tempRT = RenderTexture.GetTemporary(source.width, source.height, 0, source.format);
var blurPass = (int)blurType;
filterMaterial.SetFloat("_BilaterFilterFactor", 1.0f - bilaterFilterStrength);
filterMaterial.SetVector("_BlurRadius", new Vector4(BlurRadius, 0, 0, 0));
Graphics.Blit(source, tempRT, filterMaterial, blurPass);
filterMaterial.SetVector("_BlurRadius", new Vector4(0, BlurRadius, 0, 0));
@stilllisisi
stilllisisi / TimelineController.cs
Created March 11, 2020 02:32
【游戏-Unity】TimeLine的使用
// 获取timeLine中的所有track,并进行动态的绑定对象
using UnityEngine;
using UnityEngine.Playables;
[ExecuteInEditMode]
public class TimelineController : MonoBehaviour
{
public PlayableDirector playableDirector;
private void Start()
{
foreach (PlayableBinding item in playableDirector.playableAsset.outputs)
@stilllisisi
stilllisisi / ToggleAnimatorTrigger.cs
Created March 11, 2020 02:31
【游戏-unity】Unity Toggle 关联动画事件。Unity GUI 里的 Button 可以通过更改 Transition 类型为动画来关联动画事件,Toggle 组件也可以,但是这些动画事件不是 Toggle 值变化时的通知事件,所以需要专门的通知动画事件
//下面就来看看Toggle关联动画事件的实现。
//主要是编辑器部分借鉴使用 SelectableEditor 的代码:
using UnityEngine;
using UnityEngine.UI;
[RequireComponent(typeof(Toggle))]
[RequireComponent(typeof(Animator))]
public class ToggleAnimatorTrigger : MonoBehaviour
{
private const string kDefaultOnAnimName = "On";
private const string kDefaultOffAnimName = "Off";
@stilllisisi
stilllisisi / ExternalExe.cs
Created March 11, 2020 02:08
【游戏-unity】Unity读取外部exe程序控制台信息
//由于需要获取显卡信息,但是unity的自带函数,只能输出1个显卡,c#倒是可以但是引用了一个下载的dll System.Management.dll,这个dll放到unity用不了,因为mono不支持,所以先用vs写个外部exe程序:
using System;
using System.Management;
public class Sample
{
public static void Main(string[] args)
{
string Gname = "";
ManagementObjectSearcher objvide = new ManagementObjectSearcher("select * from Win32_VideoController");
foreach (ManagementObject obj in objvide.Get())