本文最后更新于 2026-03-31T17:08:14+08:00
《Unity 开发必知必会:这些核心 API 你掌握了吗?》
前言
经常在开发过程中对一些 Api 掌握不够深入,有些是眼熟,有些是不认识,这感觉太难受了,痛定思痛,还是记录下来比较稳妥
Animator 动画系统
| API |
说明 |
代码示例 |
应用场景 |
GetCurrentAnimatorStateInfo(0) |
获取当前动画状态信息 |
AnimatorStateInfo info = anim.GetCurrentAnimatorStateInfo(0); |
判断当前动画是否播放完毕、获取动画长度 |
GetNextAnimatorStateInfo(0) |
获取即将播放的动画 |
AnimatorStateInfo next = anim.GetNextAnimatorStateInfo(0); |
预判动画过渡,提前准备逻辑 |
IsInTransition(layerIndex) |
判断动画层是否正在过渡 |
if (anim.IsInTransition(0)) { } |
防止过渡期间重复触发行为 |
SetTrigger(string) |
设置触发器参数 |
anim.SetTrigger("Attack"); |
触发一次性动作(攻击、跳跃) |
ResetTrigger(string) |
重置触发器 |
anim.ResetTrigger("Attack"); |
手动清除触发器,防止重复触发 |
Play(string, int, float) |
直接播放指定动画 |
anim.Play("Idle", 0, 0f); |
强制切换动画(忽略过渡) |
CrossFade(string, float) |
淡入淡出切换动画 |
anim.CrossFade("Run", 0.2f); |
平滑过渡到目标动画 |
GetFloat(string) / SetFloat() |
获取/设置浮点参数 |
float speed = anim.GetFloat("Speed"); |
控制 Blend Tree 混合权重 |
GetCurrentAnimatorClipInfo(0) |
获取当前播放的动画片段信息 |
AnimatorClipInfo[] clips = anim.GetCurrentAnimatorClipInfo(0); |
获取正在播放的动画片段名称和权重 |
Update(float deltaTime) |
手动更新动画器 |
anim.Update(Time.deltaTime); |
非 MonoBehaviour 中使用 Animator |
物理与碰撞检测
| API |
说明 |
代码示例 |
应用场景 |
RaycastNonAlloc |
无分配射线检测 |
int hits = Physics.RaycastNonAlloc(ray, hitArray, 100f); |
大量射线检测,避免 GC 分配 |
SphereCastNonAlloc |
无分配球形投射 |
int hits = Physics.SphereCastNonAlloc(origin, radius, dir, hitArray); |
性能敏感的物理检测 |
RaycastCommand |
批量射线检测 |
RaycastCommand command = new RaycastCommand(origin, dir); |
多线程批量射线检测 |
Simulate(float) |
手动模拟物理 |
Physics.Simulate(Time.fixedDeltaTime); |
无物理更新时手动模拟 |
IgnoreCollision<br>(Collider, Collider) |
忽略两个碰撞器 |
Physics.IgnoreCollision(col1, col2, true); |
临时穿透(友军、弹药) |
GetContacts<br>(List<ContactPoint>) |
获取所有接触点 |
collision.GetContacts(contactList); |
获取碰撞点的详细信息 |
ClosestPoint(Vector3) |
获取碰撞器上最近点 |
Vector3 point = collider.ClosestPoint(targetPos); |
计算距离最近点 |
ComputePenetration |
计算穿透修正 |
Collider.computePenetration(colA, posA, rotA, colB, posB, rotB, out dir, out dist); |
手动修正穿透物体 |
内存管理与资源加载
| API |
说明 |
代码示例 |
应用场景 |
Resources.UnloadUnusedAssets() |
卸载未使用的资源 |
Resources.UnloadUnusedAssets(); |
场景切换后清理内存 |
Addressables.LoadAssetAsync<T> |
Addressables 异步加载 |
AsyncOperationHandle<GameObject> handle = Addressables.LoadAssetAsync<GameObject>("key"); |
现代资源管理 |
Addressables.Release |
释放 Addressables 资源 |
Addressables.Release(handle); |
释放加载的资源 |
ScriptableObject.CreateInstance |
创建 ScriptableObject 实例 |
MySO so = ScriptableObject.CreateInstance<MySO>(); |
运行时动态创建配置数据 |
Object.DontDestroyOnLoad |
切换场景不销毁 |
DontDestroyOnLoad(gameObject); |
跨场景单例管理器 |
性能优化
| API |
说明 |
代码示例 |
应用场景 |
Profiler.BeginSample |
性能采样开始 |
Profiler.BeginSample("HeavyOperation"); |
性能分析标记 |
Profiler.EndSample |
性能采样结束 |
Profiler.EndSample(); |
配合 BeginSample 使用 |
GPUInstancing |
GPU 实例化 |
Material.enableInstancing = true; |
大量相同材质物体的渲染优化 |
Graphics.DrawMeshInstanced |
实例化绘制网格 |
Graphics.DrawMeshInstanced(mesh, 0, mat, matrices, count); |
大量物体高性能绘制 |
ComputeShader.Dispatch |
执行 Compute Shader |
cs.Dispatch(kernel, groupsX, groupsY, groupsZ); |
GPU 并行计算(粒子、地形) |
CommandBuffer |
命令缓冲区 |
Graphics.ExecuteCommandBuffer(cmd); |
自定义渲染流程 |
JobHandle.Complete |
等待 Job 完成 |
jobHandle.Complete(); |
多线程任务同步 |
IJobParallelFor |
并行 For 循环 |
new MyJob().Schedule(data.Length, 64).Complete(); |
批量数据处理 |
渲染与摄像机
| API |
说明 |
代码示例 |
应用场景 |
Camera.ViewportToWorldPoint |
视口坐标转世界坐标 |
Vector3 world = cam.ViewportToWorldPoint(new Vector3(0.5f, 0.5f, 10f)); |
屏幕中心射线检测 |
Camera.WorldToViewportPoint |
世界坐标转视口坐标 |
Vector3 viewport = cam.WorldToViewportPoint(objPos); |
判断物体是否在视野内 |
Camera.RenderToCubemap |
渲染到 Cubemap |
cam.RenderToCubemap(cubemap); |
实时反射、天空盒 |
RenderTexture |
渲染纹理 |
RenderTexture rt = new RenderTexture(1024, 1024, 24); |
相机画面渲染到纹理(小地图、监控) |
CommandBuffer.DrawMesh |
命令缓冲区绘制 |
cmd.DrawMesh(mesh, matrix, material); |
自定义渲染队列 |
Shader.PropertyToID |
获取 Shader 属性 ID |
int colorID = Shader.PropertyToID("_Color"); |
性能优化,避免字符串查找 |
Material.SetBuffer |
设置 ComputeBuffer |
mat.SetBuffer("_MyBuffer", buffer); |
GPU 数据传递 |
输入与交互
| API |
说明 |
代码示例 |
应用场景 |
InputSystem (新) |
新版输入系统 |
playerInput.actions["Move"].ReadValue<Vector2>(); |
跨平台统一输入 |
EnhancedTouch |
增强触控 API |
Touch.activeTouches[i].position; |
多点触控手势 |
UI.TMP_Text |
TextMeshPro 文本 |
tmpText.text = $"Score: {score}"; |
高性能富文本渲染 |
CanvasRenderer.SetColor |
设置 UI 颜色 |
canvasRenderer.SetColor(color); |
UI 颜色快速设置 |
LayoutRebuilder.ForceRebuildLayoutImmediate |
强制重建布局 |
LayoutRebuilder.ForceRebuildLayoutImmediate(rect); |
动态添加 UI 元素后立即刷新 |
音频系统
| API |
说明 |
代码示例 |
应用场景 |
AudioSource.GetSpectrumData |
获取频谱数据 |
source.GetSpectrumData(spectrum, 0, FFTWindow.Blackman); |
音乐可视化 |
AudioSource.GetOutputData |
获取输出波形数据 |
source.GetOutputData(samples, 0); |
音频分析 |
AudioSettings.GetDSPTime |
获取 DSP 时间 |
double time = AudioSettings.dspTime; |
精确音频同步 |
AudioMixer.SetFloat |
设置混音器参数 |
mixer.SetFloat("Volume", value); |
音量控制 |
Microphone.Start |
麦克风录制 |
Microphone.Start(device, true, 10, 44100); |
语音输入、录音功能 |
总结
这些 API 覆盖了 Unity 开发中较为高级和实用的功能,适合有一定基础的读者深入学习。
持续更新中………