线性代数基础笔记
整理一下以前的线性代数笔记,仅作个人复习总结
[TOC]
向量
:单位向量,英文叫做a-hat
:a的垂直分量矩阵与行列式
线性无关:一个向量不能被向量集合中的其他向量组合构成。
基:向量空间的基彼此之间线性无关
线性变换:
原点变换后依然保持固定
直线变换后还是直线在线性变换里,网格线保持平行且等距分布
矩阵:一个n维空间的变换的基有n个向量,将这n个向量依次排列得到变换矩阵
矩阵变换:关注向量空间基每个向量变化后的值,用变化后的基原样表示变换后矩阵的每一个点如果矩阵的所有向量线性无关,变换后维度不变;如果有线性相关,则降维,降低维度和线性相关的向量数有关变换本质是一个函数
例:逆时针旋转90°,即是将i从(1,0)变成(0,1),j从(0,1)变成(-1,0),(这是两组可以代入计算的方程)据此可以编写变换矩阵。
将向量的变换转变为向量所在坐标系的变换。当向量完成了矩阵的变换时,它以变换前的形态存在于变换后的坐标系中
矩阵的积:多个变换依次组合。构成包含一组变换信息的复合矩阵。这个顺序是从右往左读的,所以理解的定位还是在右边变换本质是一个函数,所以变换的积 ...
UGUI优化实践
上周挂掉腾讯三面的时候被点去好好看看UGUI优化部分的东西,咱一直很听劝,就拿着以前用UGUI做的游戏研究了一下。不看不知道,以前做的UI真是把坑踩完了,一个卡牌仓库连60帧都稳不住,真是让人流汗…下面是优化的完整思路(注:仅针对于减少batches)
优化前这是一个明日方舟同人游戏的卡牌仓库界面,所有卡牌都绘制在一个横向的ScrollView上。我曾将相关纹理打包图集,但并没有做任何其他的优化处理进行此次优化前,场景绘制的总批次为879,每张卡片占用11Batches,没有发生任何的合批。编辑器运行无法稳定在60FPS。
优化流程
将所有可以替换的RawImage替换为Image。这是因为即便使用同一图集的不同纹理,多个RawImage也不会进行合批
总批次879 -> 737
每张卡牌独占10个Batches(每张卡的2个Image进行了合批)
将所有Sprite为空的图像填充上同图集中全白的图像。这是因为即便材质相同,空Sprite图像和有Sprite的图像也不能合批(视作非同图集的纹理)。
总批次717 -> 474
每张卡牌独占6个Batches
用Can ...
Unity 通用Buff系统 下载和教学
Unity 通用Buff系统该项目是一个通用的Buff系统,旨在帮助Unity开发者轻松实现游戏中的Buff效果。该系统能够轻松集成到现有项目,你可以方便地添加、管理和应用自定义逻辑的Buff。
教程视频
特性
优秀的可拓展性:你可以根据游戏需求编写自定义逻辑的Buff
内置Buff编辑器:你可以在编辑器管理和配置你创建的Buff
简洁的接口和使用方法:系统提供了简单易用的API,使得添加和应用Buff变得简单明了。
支持与联系
邮箱:[email protected]
bilibili:NoSLoofah
注意
NoSLoofah_BuffSystem/BuffSystem文件夹可以移动,但不要改变该文件夹内部的文件位置
请保证项目中始终只有一个BuffMgr.prefab
如果要重置所有数据,可以直接删除Assets/NoSLoofah_BuffSystem/BuffSystem/Data/BuffData文件夹。下次打开BuffEditor时该文件夹会重新生成
快速上手安装将Assets/NoSLoofah_BuffSystem/BuffSystem文件夹拷贝到你的项目
或导 ...
【哈工大软件构造中间件实验】Ubuntu SMBus Host controller not enabled/ 循环登陆界面
问题情景Ubuntu开机时卡在SMBus Host controller not enabled!,继续等待后,进入登陆界面。输入密码,黑屏一段时间后又回到登陆界面
问题原因由于发生问题前Ubuntu是意外断电关机的,所以我最开始也是按相关关键词搜索的。查询到的诸如禁用报错模块、检查驱动、fsck等均不可行。经过排查,发现我遇到的问题实际上是修改环境变量导致的。特征:使用各种终端命令都会出现下面的提示
解决方案
进入登陆界面后,用快捷键Ctrl+Alt+F2进入命令行模式。(修复模式下的root应该也可行)
修改/etc/profile文件,改正错误的环境变量1/bin/sudo vi /etc/profile
(由于环境变量出了问题,必须用绝对路径才能用sudo等命令)问题就出在红色标记的地方,PATH丢了两个重要的路径。(这是我按照老师的实验指导书改的,真不靠谱啊…)
环境变量的多个值之间用冒号:分隔。
在后面补上四个路径即可
/bin
/usr/bin
/sbin
/usr/sbin
执行profile文件,让修改环境变量生效1source /etc/profile ...
一个简单的通用实体设计思路
开发了这么多辣鸡小游戏,天天胡乱调用来调用去也不像话,多少得有点可以复用的设计思路。先简单记录下自己的经验,等下再去看看其他大佬的代码~
外部调用无论使用哪种模式,进行外部调用时不应该有差异。
引用实体时,引用EntityParams
调用EntityParams中的方法来访问和修改参数
在EntityParams上尝试获取待调用的接口
内部实现实体的各种逻辑应该分布在多个不同的脚本,包括且不限于
攻击等行为
动画控制
响应输入
这些脚本统一继承EntityBehaviour,他们彼此之间通过EntityParams这个中介联系在一起。EntityParams必须挂载在实体上,EntityBehaviour则在实体或其子物体上根据项目的复杂度、实体的复杂度、完成度需求和后续扩展的可能,应该选择不同的内部实现方法。下面设计了三种模式
简单信息模式:EntityParams的修改参数方法会监控参数的变化值,状态变化时,使用信息推送。用于状态简单且性能要求不高的情况。
简单委托模式:EntityParams中定义各种状态切换的公共委托,其他EntityBehavior在获取Enti ...
游戏设计-立项时的小经验
当想法产生时当有想法产生时,应该立刻开始尝试策划案的编写,切勿进行分享分享行为其实是一种“宣泄”的欲望,目的是让一个想法以轻松的方式成型脱出。这看上去是好的,但实际上通过与他人交流分享来输出想法极易导致必要的细节被忽略,甚至说出的内容也可能被遗忘;最严重的是,交流的“宣泄”能力是非常强的,完成交流可能也同时带走了你进行创作的强烈动力,当时连动笔的欲望都消失了。所以最好的方法是,憋住,顶住压力,立即开始策划案的编写!!!不管是分享还是向他人取经,都要放在自己手头的策划完成个大概之后。
如果想法需要修改项目在开发中需要修改是难免的,但是要尽量避免。最最重要的是,不要为了给游戏带来乐趣而修改想法,我们必须在项目确立之初就确保游戏有趣!!在长期的开发流程中,逐渐觉得自己做的游戏没有任何乐趣是非常正常的事情,这会让我们对游戏真正的乐趣产生误判。所以在项目确立之初热情满满之时,我们必须保证游戏真的好玩,并在后期的开发流程中坚信自己最初的判断
先前在开发一个同人游戏之初感觉信心满满,自己都按耐不住想要马上玩到;磨了一个学期之后动力完全消失了,自己都不知道这到底好玩不好玩了…(再加上Unity的自爆 ...
Unity编辑器拓展(四|场景视图)
来啦,补上IMGUI的Unity编辑器拓展最后一节,场景视图。场景视图的拓展有两个基本方法,分别是方便的简单绘图方法OnDrawGizmos和更灵活的Editor子类的OnSceneGUI方法。
OnGizmosOnGizmos函数直接写在需要进行拓展的脚本本身,与Start、Awake等生命周期函数没什么区别,非常方便;不过Gizmos能做的东西非常少,而且多少也有些降低代码可读性,就当是个偷懒的小工具好了。编写OnGizmos主要用Gizmos类下的几个静态方法和属性,看看方法名就可以了解个大概。下面给个简单的例子1234567891011121314using UnityEngine;public class Enemy : MonoBehaviour{ [Tooltip("攻击范围")] [SerializeField] private float attackRange; [Tooltip("是否可以攻击")] [SerializeField] private bool canAttack; private ...
Unity编辑器拓展(三|窗口绘制)
前面文章里的拓展都局限在Inspector窗口中,依附于挂载MonoBehaviour脚本的游戏物体存在。下面我们将学习如何创建一个和Inspector同级的窗口,作为独立的编辑器使用。我们假设这样一个需求:敌人都挂载一个叫“Enemy”的脚本,并在这个脚本上有一个“EnemyData”的ScriptableObjct的引用。我们需要设计一个EnemyEditor,拥有独立的窗口来编辑EnemyData,并可以创建EnemyData或在场景创建拥有EnemyData的敌人物体。EnemyData:1234567891011121314151617using UnityEngine;[CreateAssetMenu(fileName = "EnemyData000", menuName = "EnemyData")]public class EnemyData : ScriptableObject{ public int id; public string enemyName; //名称 public Sp ...
Unity编辑器拓展(二|组件绘制)
在上一篇学会了如何利用Attribute来对属性/字段进行拓展后,我们就已经能实现大部分简单功能了。利用Attribute的拓展使用了组件化的思想,相当有利于拓展的复用;但有时候我们需要对个别关键脚本进行高度定制的编辑器拓展,如果靠Attribute实现则可能产生许多注定只能被使用一次的特性,而且编辑起来非常繁琐。这个时候我们就需要学习如何对整个组件的GUI进行编辑。
我们首先创建一个叫做“ETest”的脚本,用作我们拓展的对象。12345678910using UnityEngine;public class ETest : MonoBehaviour{ [SerializeField] private string str; [SerializeField] private int i; [SerializeField] private bool b; [SerializeField] private double d; [SerializeField] private float f;}在进行拓展前,其在Inspecto ...
Unity编辑器拓展(一|属性/字段)
Unity编辑器针对字段的拓展一般使用特性(Attribute)。这些特性需要直接写在字段声明位置前面来修饰这个字段,影响其在Inspector的显示。这些特性可能与其修饰的字段相关,规范其取值或显示形式;也可能与这些字段没有任何关系,仅仅是依附于它。Unity内置了很多这类常用特性来供我们使用
[Range(num1,num2)]:限定数值取值范围为[num1,num2]
[Multiline(num)]:提供num行的输入框
[TextArea(num1,num2)]:提供一个最小num1行,最大num2行的文本框
[SerializeField]:序列化字段
[NonSerialized]:反序列化字段,并将其在Inspector隐藏
[HideInInspector]:将一个字段在Inspector隐藏
[FormerlySerializedAs(“str”)]:当变量名发生改变时,可以保存原来str的值
[Header(“str”)]:添加名为str的标题
[Space(num)]:添加大小为num的间隔
[Tooltip(“str”)]:添加信息为str的提示(鼠标悬浮在 ...