Unity Shader读书笔记(1)
Unity Shader读书笔记(1)
前言
今天我本来想用Unity自己做出点东西。我本来设想渲染的Shader也要我自己去写,做一个简单的phong模型就好了。然后我发现半年没写Shader已经全部忘记,本来我想找一下自己当初写的读书笔记。而之前的读书笔记我觉得当时写得不好所以没有上传,又加上我换了电脑,所以我根本找不到之前写的读书笔记。这次我重新再学一遍,再做一次读书笔记。(这次无论写的好不好,我都上传一次。不然又要看那三百多页的书太难了。)
渲染的流程
渲染的流程大致可以分成三个阶段:应用阶段(Application
Stage)、几何阶段(Geometry Stage)、光栅化阶段(Rasterizer
Stage)。
应用阶段
这个阶段的主导是应用程序,所以这通常是由CPU来负责的。在这个阶段我们对其有绝对的控制权。(这里的控制权是表示对数据的控制操作,在GPU中的流程部分数据的处理是由生产此GPU的厂商进行封装,换句话说我们对于这部分的数据处理是没有控制权的。)
在这个阶段我们有三个主要的任 ...
关于哈希表
关于哈希表
前言:(一般都是一些废话,可以不看)
我一开始学习哈希表的时候真的觉得哈希表是一种很高大上的东西,然后我就对这种东西有一种莫名的害怕。最近突然想起之前朋友和我说起的哈希冲突又让我回忆起学习哈希表的时候。所以我就想写一篇关于哈希表的文章。
1. 什么是哈希表
散列表(Hash
table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash)
函数。
——来自百度百科
我初次查找哈希表的时候看到上面的解释就觉得哈希表很是高大上。因此我就觉得哈希表是一个非常难的数据结构。但是你完全可以简单地把哈希表理解成数组。其所谓的key值就是数组的下标,而哈希函数就是通过key值找到对应的数 ...
C#实现优先队列模板
C#实现优先队列模板
C#并不提供优先队列这个API。所以我们要自己去实现C#的优先队列。这里我参考了知乎这位作者的优先队列实现。(不过他用的是C++,我只是单纯的转换为C#而言)文章链接:https://zhuanlan.zhihu.com/p/35314095。具体的方法可以直接去看知乎的文章。我这里就直接给出C#的实现。(这里我根据自己的需求加了一些东西,你们也可以看文章中的代码改造然后根据自己的需求去修改)
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291 ...
Unity Transform扩展(一)
Unity Transform扩展(一)
前言:
在使用Unity的Transform函数时,我们会发现其自身提供的API有时候并不能完全满足我们的需求。因此我们可能会写一些方法去实现我们的需求。但是有时候这个需求在多个不同的类中都需要。这时候我们就要使用一个帮助类去减少我们重复的工作。不过人都是懒惰的,我不希望多声明一个类然后再去使用。那么我们可以使用C#的扩展类方法让Transform直接可以调用我们写的方法。具体实现如下。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354using System.Collections;using System.Collections.Generic;using UnityEngine;public static class TransformHelper{ //通过名字深度优先遍历查找对象 public static Transform FindByNameDFS ...
lua学习笔记整理
Lua 学习笔记整理
前言(废话):
我今年2月份开始进行笔记整理。然后我拖到4月份才整理结束。其实我学完后就再也没有用过了。很多知识点在我整理的时候都有些模糊不清了。但是我真的很少使用lua,而且我又不想自己白学一门知识。所以我在这之中又去查找资料。有些东西不一定正确毕竟我也是在学,但是代码的结果是准确的。最后整理了快七千字已经是我写得最多的文章了。
lua中的数据类型
nil 表示空数据,如同C#中的null
boolean,布尔型。只有true和false。
string,字符类型。
number,数字类型。可以说同C#的float类型,占32位。lua中没有整数类型。
table,表格类型。它是一个关联数组,下标是从1开始的。可以用表示来模拟面向对象。在lua中table有着很重要的作用。
function,函数类型。在lua中函数是第一类值,而在C#、C++或Java等语言中函数是第二类值。
userdata 表示任意存储在变量中的C数据类型。
thread
表示执行的独立线程(本质是“伪多线程”,是协程的概念),用于执行协同程序。
...
如何使用Unity做出在固定大小区域显示主摄像机看不到的画面
使用Unity做出在固定大小区域显示主摄像机看不到的画面
前言:
这次的标题好长啊。但是我也不知道怎么写这样个标题。最近做项目刚好遇到了这个需求,所以标题就是按照需求写的。这个项目后面转给同事了。不过我觉得这个要求挺有意思的,所有我就做了一个Demo。这篇文章希望能给要做这种要求的你提供一个思路。
项目的要求
这次我做的项目要求我做一面照妖镜。然后角色可以使用这个照妖镜去照射出妖怪的样子。所以我需要在一个固定大小的区域中显示出主摄像机看不到的画面。即玩家操纵一个UI,然后UI里面要显示出主摄像机看不到的画面。(Unity版本2020.3)
主要思路
因为要操作UI去看到不一样的画面。所以我打算直接在UI中实现。我设置一个Raw
Image(覆盖全屏)配合Render
Texture进行画面的显示。然后用一个mask遮罩将画面超出照妖镜的部分遮盖掉。一开始照妖镜是不显示的,只有玩家操作时照妖镜才会显示出来。
实现
配置
我们设定主摄像机的Culling
Mask看不到UI层。自然那些“妖怪”就要是UI层的。具体设置什么为主摄像机不可见由你来决 ...
Unity小记二
Unity小记二
前言:
本篇文章是记录我在使用Unity中的过程中遇到并解决的问题和发现的知识点。所以文章比较杂碎。但我本来就是想这样才把这种文章归成随笔的。我使用的Unity版本为2019.4.6f1。
关于碰撞器
纵使是触发器也要有刚体才可以检测。所以碰撞检测必须要有一方有刚体。但是如果你将isKinematic设置为true。则脚本中的OnCollision型的函数都不再其作用,而OnTrigger类型的都可以。
Unity模拟碰撞器,如果你不在指定旋转那么其旋转会参考世界坐标。等于说你放了一个欧姆角为Vector.Zero的碰撞器。
RaycastHit中的normal属性可以得到射线接触面的法线。
关于Unity脚本中的this.enable
当脚本的this.enable ==
false时,这个脚本就不在运行了。所以FixUpdate也会受到this.enable的影响。
unity中物体的transform.forward可以用transform.rotation*Vector.forward。其他的方向也是同理。
...
关于Unity的StreamingAssets
关于Unity的特殊文件夹——StreamingAssets
介绍
StreamingAssets文件是Unity的特殊文件之一。在Unity进行打包操作的时候,StreamingAsset文件不会像Resource文件一样被Unity进行压缩。所以一般而言,StreamingAssets用来存储一些你不想被Unity压缩的文件,比如游戏场景中的敌人的配置信息、UI的配置信息。StreamingAssets文件和Resources文件一样,他们都只能读而不能写。实际上,StreamingAssets文件在一些平台上仍然可以修改。可它的确在一些平台中不可修改。故为了平台之间的兼容性,StreamingAssets下的文件最好不要修改。
关于StreamingAssets的位置
在不同的平台中,游戏文件的存放位置也是不同的。而StreamingAssets文件不像Resources文件一样可以使用Unity提供的Resources
API进行直接的读取操作。我们要首先知道StreamingAssets在不同平台下的位置。这个位置可能会随时间的变化而改变,所以你可以点击 ...
Unity的小记
今日的愚蠢
最近我都在使用unity的射线检测。可是我每次的使用都会有bug。在万般无奈之下,我只能使用平替。今天难得有空,我就将这个问题好好想了一番。当我明白自己的问题所在时,我感觉到了一份愚蠢。
射线检测函数有着许多的重载。参数Vector3
origin是决定射线起始的位置。参数Vector3
direction是表示射线从origin位置然后沿这指定的direction发射。参数float
maxDistance表示这射线长度。参数int
layerMask表示射线只会判断这个layer。而我在使用的时候将放置maxDistance的地方放了layerMask。这就是我最近出bug的原因。今天要不是我朋友帮我找到,我想可能我还要花上几个小时去寻找。
今日的收获
今日我也算有点收获。朋友突然说了关于Unity的layer问题。Unity的中的layer层是按二进制位来存储的。因为int只有32位,所以Unity中的layer只能设置32个。比如当我们定义了一个layer名叫“First”,然后在Unity的第8个layer上。当我们使用LayerM ...
Unity面试(2022.2.17 - 18)
(废话)
本来昨天的面试应该在写一篇文章做一个总结的。可惜啊,我并没有做。不然今天的二面可能通过的几率就大了。太离谱了,为什么两次面试会考同样的题目啊。难道是为了测试我的学习态度?可是我也不是每一天都有空去针对的复习啊。唉,算了。我菜就是菜了,菜才是一切悲哀的源头。
以下都是本人的面试记录。答案都是从我自己的认知和我在网上找到的答案。如果你觉得我的答案不好你也可以去网上找一份
面试记录2022.2.17
1.你做得项目里面有用到什么框架吗?
答:按自己项目来回答
这种问题按照自己做过的项目来就好了。如果没有就准备一下。我倒是没有用到什么框架的,所以我随便扯了一下。如果你也没有那记得面试的时候准备一下编的好一点。
2.协程的原理
答:Unity中协程的实现原理其实就是C#中的迭代器原理。协程有两个函数Current和MoveNext。满足MoveNext条件时才可以访问Current。
协程的原理在很多Unity面试的地方都有提到了。
3.协程的应用
答:场景过渡、网络加载和时间计算。
4.C#提供的数据结构中哪个是用二叉树进行实现的
这题我不会。
5. ...





