2019年阿里游戏暑期实习时在本子上的笔记整理汇总,方便查找。
Unity相关
Difference between Color&Color32
Color: 4 float (1.0, 1.0, 1.0, 1.0)
Color32: 4 byte (255, 255, 255, 255)
Transform.InverseTransformDirection(Vector3 direction)
Convert direction from worldspace to localspace
Transform.TransformPoint(Vector3 pos)
Convert position from localspace to worldspace
Editor&EditorWindow
Editor:自定义Inspector中的组件显示,辅助脚本序列化。
EditorWindow:自定义标签页面板,从菜单栏打开。
EditorWindow.GetWindow()
:创造面板
EditorGUILayout
:插件面板控制
Editor.OnInspectorGUI()
:自定义面板
Destroy()
不能在Editor
中调用
菜单验证函数
[MenuItem("...", true)] |
若返回false
,则菜单项不显示。
Selection.gameObject
返回Editor中选择的对象。
Unity脚本编译顺序
- Standard Assets/Plugin下的脚本
- Standard Assets/Plugin/Editor下的脚本
- 非Editor脚本
- Editor脚本
ScriptableObject特点
- 不同于MonoBehavior,不作为组件挂载
- 适用于保存配置文件
- 可以从JSON中读取
ScriptableObject保存为.asset文件
其中class必须标记为[serializable]
即用到的所有自定义类均必须为“可序列化”
- 属性property和静态变量无法被序列化。
- 保存为.asset时,
ScriptableObject
只能在同名文件中定义。 - 属性
{get; set;}
,只是自动生成了匿名成员变量。
需要API | |
---|---|
ScriptableObject.CreateInstance() | 新建ScriptableObject |
AssetDatabase.CreateAsset() | 新建asset at path |
AssetDatabase.Refresh() | 刷新asset数据库 |
- 其中path为”Assets/…”形式。
Mesh相关
MeshFilter
:从资源中读取mesh,并传给MeshRenderer
MeshRenderer
:Mesh渲染器
MeshFilter.mesh.bounds.size
:获取mesh尺寸
Mesh.CombineMeshes(CombineInstance[] combine)
:合并Mesh
MeshFilter.sharedMesh
:引用传递
MeshFilter.mesh
:值传递
四元数相关
Vector3 = Vector3 * Quaternion
- 四元数乘法顺序:从后往前
q = q3 * q2 * q1
Quaternion.eulerAngles
以欧拉角设置四元数(顺序zxy)
Debug日志等级
Log() < Warning() < Assertion() < Error() < Exception()
其他API
Vector3.Scale(a, b) | 两向量对应分量相乘 |
Mathf.Approximately() | 近似相等,避免浮点数运算后的精读问题 |
MonoBehaviour.OnDrawGizmos() | 若要绘制Gizmos,则实现此方法 |
Camera.ScreenPointToRay() | 从相机近平面发出射线,用于鼠标选择物体 |
Input.mousePosition | 鼠标在屏幕空间位置 |
Application.dataPath | 游戏数据目录 |
[CustomEditor(typeof(ScriptName))] | 自定义Inspector属性面板 |
#if UNITY_EDITOR #endif | 根据平台编译 |
C#相关
?运算符
?? | 空可并运算符 | a ?? b 若a != null ,则为a ;若a == null ,则为b |
?.和?[] | 空条件运算符 | a?[b]?.c 等同(a == null) ? null : ((a[b] == null) ? null : a[b].c) |
bool?
为可空类型,可为null
Lambda表达式与表达式主体定义
Lambda表达式 | 左侧为输入参数,右侧为返回值 | (x, y) => x + y |
表达式主体定义 | 左侧为待定义函数,右侧为具体实现 | f1(x) => f2(x, x+1) - x |
List的几个查找方法
input | output | |
---|---|---|
Contains() | Object | bool |
Exists() | Function | bool |
Find() | Function | Object |
IndexOf() | Object | int |
FindIndex() | Function | int |
- The Function in the table means
delegate bool Predicate<T>
System.IEquatable<T>
类似于IComparable<T>
,用于List.Contains()
。必须实现Equals(T)
,用于比较对象相等。
System.IEqualityComparer<T>
用于 List.Distinct()
去重。
IComparable接口
必须实现CompareTo
函数
this.CompareTo(obj) | return int |
---|---|
this < obj | return < 0 |
this = obj | return = 0 |
this > obj | return > 0 |
int.CompareTo(value)
同理。
IEnumerable可枚举接口
IEnumerable.Where()
:筛选器,返回IEnumerable
IEnumerable.any()
:判断器,返回bool
IEnumerable
接口包含GetEnumerator
方法,实现时,需要另外实现一个IEnumerator
接口供GetEnumerator
返回。
IEnumerable
实现后可用于foreach
int的最大最小值
int.MaxValue = 2147483647(0x7FFFFFFF)
int.MinValue = -2147483647(0x80000000)
Parse&TryParse
float.Parse(string s)
return float
float.TryParse(string s, out float f)
return bool
打开文件流
File.Open(String, FileMode, FileAccess) |
将对象序列化到指定文件流
BinaryFormatter.Serialize(fs, Object) |
其他API
Math.Sign() | 取符号 |
Enumerable.Distinct() [System.Linq] | 返回去重后数组 |
Enumerable.Concat() | 连接数组 |
关键字async&await | 异步线程同步化编程 |
关键字params | 函数参数数量任意化,参数类型必为一维数组 |
Math.Log() | 默认为ln() |
Random.NextDouble() | [0.0, 1.0)区间随机数 |
Random.Next(a, b) | [a, b)区间随机数 |
Array.GetLength(int dimension) | 多维数组取长度 |
TypeDescriptor.GetConverter(typeof(T)) | 类型转换器 |
System.Diagnostics.Stopwatch | 性能计时工具类 |
参数中的关键字this | 扩展方法(静态类内静态方法) |
default(T) | T类型默认值 |
StringSplitOptions.RemoveEmptyEntries | String.Split 方法返回中去除空字符串 |
Func<T1, T2, TResult> | 函数委托 |
算法相关
博弈树与决策树的区别
博弈树(极大极小树)- α-β剪枝(基于DFS):
已知叶子结点(结果值)倒推出根节点的值与路径
决策树:
一种ML算法,不存在双人博弈
动态规划的特征
无后效性
最优子结构