2019年暑期实习笔记总结

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)]
static bool func

若返回false,则菜单项不显示。

Selection.gameObject

返回Editor中选择的对象。

Unity脚本编译顺序

  1. Standard Assets/Plugin下的脚本
  2. Standard Assets/Plugin/Editor下的脚本
  3. 非Editor脚本
  4. 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 ?? ba != 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)
return FileStream

将对象序列化到指定文件流

BinaryFormatter.Serialize(fs, Object)
XmlSerializer.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算法,不存在双人博弈

动态规划的特征

  1. 无后效性

  2. 最优子结构