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算法,不存在双人博弈
动态规划的特征
无后效性
最优子结构