36.Unity入门基础知识总结

  1. 36.总结
    1. 36.1 知识点
      1. 学习的主要内容
      2. 总结讲什么
      3. 学习Unity是学习什么
      4. 如何学好Unity
      5. 强调
    2. 36.2 核心知识点速览
      1. 生命周期函数和打印信息
        1. 生命周期函数详解
        2. 在 Unity 中打印信息
      2. Unity 特性
        1. 变量可见性控制
        2. 自定义类型序列化
        3. 辅助特性(提升可读性)
        4. 交互增强特性
      3. 基础属性和组件的获取
        1. 重要成员
        2. 重要方法
      4. GameObject 游戏对象
        1. GameObject 成员变量
        2. GameObject 静态方法
        3. GameObject 成员方法
        4. 次要成员方法(不建议使用,效率低)
      5. Time 时间
      6. Transform
        1. Transform 概述
        2. Vector3 三维向量
        3. 位置
        4. 朝向
        5. 位移
        6. 角度和旋转
        7. 缩放
        8. 看向
        9. 父子关系
        10. 坐标转换
      7. Input 组件
        1. 鼠标输入(Update 中使用)
        2. 键盘输入(Update 中使用)
        3. 虚拟轴输入(控制移动/旋转)
        4. 触摸输入(移动设备)
        5. 手柄/虚拟按钮
        6. 重力感应(陀螺仪)
      8. Screen 屏幕
      9. Camera 摄像机
        1. Camera 组件参数
        2. Camera 参数和方法
          1. 获取摄像机相关
          2. 渲染相关委托
          3. 重要成员
      10. Light 光面板
        1. 光源组件
        2. 光面板(照明设置)
      11. 物理系统 - 刚体
        1. 刚体组件参数
        2. 刚体参数和方法
      12. 物理系统 - 碰撞体
        1. 3D 碰撞器种类
        2. 3D 碰撞器共同参数
        3. 常用碰撞器
        4. 不常用碰撞器
      13. 物理系统 - 物理材质
      14. 碰撞检测函数
        1. 碰撞器与触发器的核心条件对比
          1. 碰撞发生的必要条件
          2. 触发器触发的必要条件
        2. 物理碰撞检测响应函数
        3. 触发器检测响应函数
      15. Unity 音效系统
        1. 音频文件导入
        2. 音频源(AudioSource)
          1. 音频源组件参数
          2. 音频源参数和方法
        3. 麦克风录制

36.总结


36.1 知识点

学习的主要内容

总结讲什么

学习Unity是学习什么

如何学好Unity

强调


36.2 核心知识点速览

生命周期函数和打印信息

生命周期函数详解

函数名 调用时机 用途
Awake 对象(脚本类对象)被创建时调用 类似构造函数,可进行对象创建时的初始化操作
OnEnable 对象被激活时调用 可在此处编写对象激活时的逻辑处理代码,运行游戏时自动调用一次
Start 对象第一次帧更新前执行 用于编写初始化逻辑,执行时间比 Awake 晚
FixedUpdate 每一物理帧执行 主要用于物理更新,物理帧与游戏帧不同
Update 每一游戏帧执行 用于处理游戏核心逻辑更新
LateUpdate 比 Update 晚执行 一般用于处理摄像机位置更新相关内容
OnDisable 对象失活时调用 可在此处编写对象失活时的处理逻辑
OnDestroy 对象被销毁时调用 销毁前对象失活,会先调用 OnDisable

在 Unity 中打印信息

方法 用途
Debug 类 Log 方法 打印普通信息,如 Debug.Log("Awake Debug.Log");
Debug 类 LogWarning 方法 打印警告信息,如 Debug.LogWarning("警告");
Debug 类 LogError 方法 打印报错信息,如 Debug.LogError("错误");
MonoBehaviour 类 print 方法 继承时可使用,如 print("Awake print");

Unity 特性

变量可见性控制

特性 作用 适用变量 语法 关键说明
[SerializeField] 强制私有/保护变量显示 private/protected [SerializeField] private int value; 序列化字段,支持基本类型、数组、GameObject 等;运行时修改影响成员变量
[HideInInspector] 隐藏公共变量 public 变量 [HideInInspector] public int value; 代码可访问,但 Inspector 不显示
默认公共变量 直接显示 public 变量 public int value; 简单直接,但暴露所有公共字段

自定义类型序列化

类型 显示条件 示例 关键说明
枚举 直接显示(无需额外特性) public E_TestEnum enumValue; 下拉菜单选择枚举值
结构体 [System.Serializable] 特性 [Serializable] public struct MyStruct{...} 序列化后可展开编辑字段
[System.Serializable] 特性 + 继承 UnityEngine.Object 或标记为 [CreateAssetMenu] [Serializable] public class MyClass{...} 非 MonoBehaviour 需手动序列化;ScriptableObject 需 [CreateAssetMenu]
集合 直接显示(数组、List public int[] array;
public List<int> list;
支持动态添加/删除元素(List 需初始化)

辅助特性(提升可读性)

特性 作用 参数 示例
[Header(“标题”)] 分组标题(字段上方) 字符串(如 “基础属性”) [Header("战斗属性")] public int atk;
[Tooltip(“提示”)] 悬停提示 字符串 [Tooltip("闪避率")] public float miss;
[Space(像素)] 字段间隔 可选像素值 [Space(20)] public int crit;
[Range(Min, Max)] 数值滑条 最小值,最大值 [Range(0, 10)] public float luck;
[Multiline(行数)] 多行文本框 可选行数 [Multiline(5)] public string tips;
[TextArea(Min, Max)] 滚动文本框 最小行数,最大行数 [TextArea(3, 4)] public string desc;

交互增强特性

特性 作用 参数 示例
[ContextMenuItem(“按钮名”, “方法”)] 为变量添加右键快捷方法 按钮文本,方法名 [ContextMenuItem("重置", "ResetMoney")] public int money;
[ContextMenu(“按钮名”)] 为方法添加 Inspector 执行按钮 按钮文本 [ContextMenu("测试逻辑")] private void Test();

基础属性和组件的获取

重要成员

成员 说明 示例
gameObject 获取脚本依附的 GameObject print(gameObject.name);
transform 获取位置信息 print(transform.position);
enabled 获取或设置脚本激活状态 this.enabled = false;

重要方法

方法 作用 参数 示例
GetComponent 获取单个挂载脚本 可按脚本名、Type、泛型获取 var script = GetComponent<MyScript>();
GetComponents 获取多个挂载脚本 泛型 var scripts = GetComponents<MyScript>();
GetComponentInChildren 获取子对象挂载的单个脚本 bool:是否查找失活子对象,默认 false var childScript = GetComponentInChildren<MyScript>(true);
GetComponentsInChildren 获取子对象挂载的多个脚本 bool:是否查找失活子对象,默认 false;可传入 List 接收结果 GetComponentsInChildren<MyScript>(true, list);
GetComponentInParent 获取父对象挂载的单个脚本 var parentScript = GetComponentInParent<MyScript>();
GetComponentsInParent 获取父对象挂载的多个脚本 var parentScripts = GetComponentsInParent<MyScript>();
TryGetComponent 安全获取单个脚本 泛型,使用 out 输出结果 if (TryGetComponent<MyScript>(out var script)) { ... }

GameObject 游戏对象

GameObject 成员变量

变量 说明 示例
name 对象名称 print(gameObject.name);
gameObject.name = "新名称";
activeSelf 对象是否激活 print(gameObject.activeSelf);
isStatic 对象是否为静态对象 print(gameObject.isStatic);
layer 对象的层级 print(gameObject.layer);
tag 对象的标签 print(gameObject.tag);
transform 位置、旋转和缩放信息 print(gameObject.transform.position);

GameObject 静态方法

方法 作用 注意事项 示例
CreatePrimitive 创建带原始网格和碰撞体的对象 GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
Find 通过对象名查找激活对象 效率低,找不到返回 null,无法找失活对象 GameObject obj = GameObject.Find("对象名");
FindWithTag 通过标签查找单个激活对象 同上 GameObject obj = GameObject.FindWithTag("标签名");
FindGameObjectsWithTag 通过标签查找多个激活对象 返回空数组 GameObject[] objs = GameObject.FindGameObjectsWithTag("标签名");
FindObjectOfType 找到场景中挂载某脚本的对象 效率低,遍历对象和脚本 var scriptObj = GameObject.FindObjectOfType<MyScript>();
Instantiate 实例化(克隆)对象 GameObject clone = GameObject.Instantiate(original);
Destroy 删除对象 异步,下一帧移除,建议优先使用 GameObject.Destroy(obj, 5); // 5 秒后删除
DestroyImmediate 立即删除对象 可能造成卡顿 GameObject.DestroyImmediate(obj);
DontDestroyOnLoad 过场景不移除对象 GameObject.DontDestroyOnLoad(obj);

GameObject 成员方法

方法 作用 示例
构造函数 创建空物体 GameObject obj = new GameObject("物体名", typeof(脚本1), typeof(脚本2));
AddComponent 为对象添加脚本 var script = obj.AddComponent<MyScript>();
GetComponent 得到对象的脚本 var script = obj.GetComponent<MyScript>();
CompareTag 标签比较 if (gameObject.CompareTag("标签名")) { ... }
SetActive 设置对象激活/失活 obj.SetActive(false);

次要成员方法(不建议使用,效率低)

方法 作用 示例
SendMessage 广播自己执行方法 gameObject.SendMessage("方法名", 参数);
BroadcastMessage 广播自己和所有子对象执行方法 gameObject.BroadcastMessage("方法名");
SendMessageUpwards 广播自己和所有父对象执行方法 gameObject.SendMessageUpwards("方法名");

Time 时间

分类 变量 说明 受 timeScale 影响 使用场景 示例代码
时间缩放比例 timeScale 控制时间流逝的标度,可用于慢动作、暂停等效果。默认值为 1 - 实现游戏暂停、倍速 Time.timeScale = 0; // 时间停止
Time.timeScale = 2; // 2 倍速
普通帧间隔时间 deltaTime 完成上一帧所用的时间(秒) 游戏暂停时物体停止移动 print("帧间隔时间: " + Time.deltaTime);
transform.Translate(Vector3.forward * speed * Time.deltaTime);
(Update 内) unscaledDeltaTime 独立于 timeScale 的时间间隔(秒) 不受暂停影响的位移计算 print("不受 scale 影响的帧间隔时间: " + Time.unscaledDeltaTime);
transform.Translate(Vector3.forward * speed * Time.unscaledDeltaTime);
游戏开始时间 time 自游戏启动以来受 timeScale 影响的时间(秒) 受时间缩放影响的计时 print("受 scale 影响的游戏时间: " + Time.time);
(计时功能) unscaledTime 独立于 timeScale 的时间(秒) 不受时间缩放影响的计时 print("不受 scale 影响的游戏时间: " + Time.unscaledTime);
物理帧间隔时间 fixedDeltaTime 执行物理更新的时间间隔(秒) 物理模拟计算 print("受 scale 影响的物理帧间隔: " + Time.fixedDeltaTime);
(FixedUpdate 内) fixedUnscaledDeltaTime 独立于 timeScale 的物理帧间隔(秒) 不受时间缩放影响的物理模拟 print("不受 scale 影响的物理帧间隔: " + Time.fixedUnscaledDeltaTime);
帧数 frameCount 从游戏开始到现在运行的总帧数 帧同步、帧率统计 print("总帧数: " + Time.frameCount);

Transform

Transform 概述

Transform 主要用于游戏对象的位移、旋转、缩放、父子关系、坐标转换等操作。

Vector3 三维向量

分类 说明 示例
申明方式 无参构造后赋值;传 xy/z 坐标构造;结构体声明后赋值 Vector3 v1 = new Vector3(10, 10, 10);
Vector3 v2 = new Vector3(10, 10);(z=0)
基本计算 支持 +、 -、 *、 / 运算 Vector3 v1 = new Vector3(1, 1, 1);
Vector3 v2 = new Vector3(2, 2, 2);
print(v1 + v2); // (3.0, 3.0, 3.0)
常用向量 提供如 Vector3.zero、Vector3.right 等 print(Vector3.zero); // (0, 0, 0)
距离计算 Distance 方法返回向量之间的距离 print(Vector3.Distance(v1, v2)); // 1.732051

位置

变量 说明 注意事项 示例
position 相对世界坐标系的坐标 不能单独修改 xyz,只能整体赋值 print(this.transform.position);
this.transform.position = new Vector3(10, 10, 10);
localPosition 相对父对象的坐标 若想以面板坐标为准设置位置,使用此变量 print(this.transform.localPosition);
this.transform.localPosition = Vector3.up * 10;

朝向

可通过 transform.forwardtransform.uptransform.right 得到对象的面朝向、头顶朝向、右手边朝向。

位移

方式 说明 示例
手动计算 路程 = 方向 * 速度 * 时间,放在 Update 里 this.transform.position += this.transform.forward * 1 * Time.deltaTime;
Translate 方法 根据方向和距离移动,可指定相对坐标系 this.transform.Translate(Vector3.forward * 1 * Time.deltaTime, Space.World);

角度和旋转

分类 变量/方法 说明 注意事项 示例
角度 rotation 返回旋转的四元数 - print(this.transform.rotation);
eulerAngles 相对世界坐标角度 不能单独设置 xyz,用 Vector3 赋值 print(this.transform.eulerAngles);
this.transform.eulerAngles = new Vector3(10, 10, 10);
localEulerAngles 相对父对象角度 若想改变面板显示角度,使用此变量 print(this.transform.localEulerAngles);
this.transform.localEulerAngles = new Vector3(10, 10, 10);
旋转 Rotate 方法 自转,有多种重载方式 一般放在 Update 内 this.transform.Rotate(new Vector3(0, 100, 0) * Time.deltaTime);
this.transform.Rotate(Vector3.right, 10 * Time.deltaTime, Space.World);
RotateAround 方法 相对于某一点转 - this.transform.RotateAround(Vector3.zero, Vector3.right, 10 * Time.deltaTime);

缩放

变量 说明 注意事项 示例
lossyScale 相对世界坐标系的缩放大小(只读) 只能获取,不能改变 print(this.transform.lossyScale);
localScale 相对本地坐标系的缩放大小 一般修改此变量,不能只改 xyz print(this.transform.localScale);
this.transform.localScale += Vector3.one * Time.deltaTime;

看向

LookAt 方法可让对象面朝向某一点或对象,一般写在 Update 内持续更新:

  • this.transform.LookAt(Vector3.zero); 看向世界坐标原点
  • this.transform.LookAt(lookAtObj.transform); 看向目标对象

父子关系

操作 变量/方法 说明 示例
获取父对象 parent 变量 获取父对象,返回父对象的 transform print(this.transform.parent);
print(this.transform.parent.name);
设置父对象 parent 变量 断绝父子关系或设置新父对象 this.transform.parent = null;
this.transform.parent = GameObject.Find("Father2").transform;
SetParent 方法 可指定是否保留世界坐标信息 this.transform.SetParent(null);
this.transform.SetParent(fatherTransform, false);(不保留世界坐标)
断绝子对象 DetachChildren 方法 断绝与所有子对象的关系 this.transform.DetachChildren();
获取子对象 Find 方法 按名字查找儿子,能找到失活对象 print(this.transform.Find("Cube (1)").name);
childCount 变量 得到儿子数量,失活儿子也算 print(this.transform.childCount);
GetChild 方法 遍历所有儿子 for (int i = 0; i < this.transform.childCount; i++) { print(this.transform.GetChild(i).name); }
儿子操作 IsChildOf 方法 判断是否为某对象的子项 if (son.IsChildOf(this.transform)) { print("是儿子"); }
GetSiblingIndex 方法 得到自己的编号 print(son.GetSiblingIndex());
SetAsFirstSibling 方法 设置为第一个儿子 son.SetAsFirstSibling();
SetAsLastSibling 方法 设置为最后一个儿子 son.SetAsLastSibling();
SetSiblingIndex 方法 设置为指定编号的儿子 son.SetSiblingIndex(1);

坐标转换

转换类型 方法 说明 示例
世界坐标转本地坐标 InverseTransformPoint 方法 世界坐标系的点转换为本地坐标的点 print("转换后的点 " + this.transform.InverseTransformPoint(Vector3.forward));
InverseTransformDirection 方法 世界坐标系的方向转换为本地方向(不受缩放影响) print("转换后的方向(不受缩放影响)" + this.transform.InverseTransformDirection(Vector3.forward));
InverseTransformVector 方法 世界坐标系的方向转换为本地方向(受缩放影响) print("转换后的方向(受缩放影响)" + this.transform.InverseTransformVector(Vector3.forward));
本地坐标转世界坐标 TransformPoint 方法 本地坐标系的点转换为世界坐标的点(受缩放影响) print("本地 转 世界 点" + this.transform.TransformPoint(Vector3.forward));
TransformDirection 方法 本地坐标系的方向转换为世界方向(不受缩放影响) print("本地 转 世界 方向" + this.transform.TransformDirection(Vector3.forward));
TransformVector 方法 本地坐标系的方向转换为世界方向(受缩放影响) print("本地 转 世界 方向" + this.transform.TransformVector(Vector3.forward));

Input 组件

鼠标输入(Update 中使用)

方法/属性 说明 参数/返回值 示例 注意事项
mousePosition 鼠标屏幕坐标(左下角为原点) Vector3(x,y 像素坐标) print(Input.mousePosition); 屏幕坐标系:x 右,y 上,z=0
GetMouseButtonDown(0/1/2) 鼠标按键按下瞬间(0=左,1=右,2=中) int 键索引,返回 bool if (Input.GetMouseButtonDown(0)) 射击(); 仅按下帧触发一次
GetMouseButtonUp(0/1/2) 鼠标按键抬起瞬间 int 键索引,返回 bool if (Input.GetMouseButtonUp(1)) 取消(); 仅抬起帧触发一次
GetMouseButton(0/1/2) 鼠标按键长按(持续触发) int 键索引,返回 bool if (Input.GetMouseButton(2)) 旋转(); 按住期间每帧触发
mouseScrollDelta 鼠标滚轮滚动量(y 轴为主) Vector2(y=-1 下滚,y=1 上滚) float scroll = Input.mouseScrollDelta.y; 滚轮滚动时触发,非持续

键盘输入(Update 中使用)

方法/属性 说明 参数/返回值 示例 注意事项
GetKeyDown(KeyCode.W) 键盘按下瞬间(枚举或小写字符串) KeyCode 枚举或 “w” 字符串,返回 bool if (Input.GetKeyDown(KeyCode.Space)) 跳跃(); 枚举大写(如 KeyCode.W),字符串小写(如 “w”)
GetKeyUp(KeyCode.W) 键盘抬起瞬间 KeyCode,返回 bool if (Input.GetKeyUp("q")) 换弹(); 仅抬起帧触发一次
GetKey(KeyCode.W) 键盘长按(持续触发) KeyCode,返回 bool if (Input.GetKey(KeyCode.LeftShift)) 加速(); 按住期间每帧触发
inputString 按下的键盘字符(如字母、数字) string(只读) if (Input.anyKeyDown) print(Input.inputString); 仅在 anyKeyDown 帧有效
anyKeyDown 任意键/鼠标按下瞬间 bool(只读) if (Input.anyKeyDown) 开始游戏(); 包括鼠标和键盘

虚拟轴输入(控制移动/旋转)

方法 说明 返回值范围 默认轴 示例 适用场景
GetAxis(“Horizontal”) 平滑轴(渐变值,-1~1) float(如 -0.5, 0.8) Horizontal(A/D 或 左摇杆) transform.Translate(Vector3.right * Input.GetAxis("Horizontal")); 角色移动、镜头旋转
GetAxisRaw(“Vertical”) 离散轴(仅 -1/0/1) float(-1/0/1) Vertical(W/S 或 上摇杆) if (Input.GetAxisRaw("Fire1") > 0) 开火(); 技能触发、跳跃
GetAxis(“Mouse X/Y”) 鼠标移动增量(屏幕像素速度) float(-1~1) Mouse X(鼠标左右) camera.Rotate(0, Input.GetAxis("Mouse X"), 0); 镜头旋转

触摸输入(移动设备)

方法/属性 说明 示例 注意事项
touchCount 当前触摸点数(只读) if (Input.touchCount >= 2) 缩放(); 需开启 Edit > Project Settings > Input Manager > Multi Touch
touches[0].position 第 0 个触摸点屏幕坐标 Vector2 pos = Input.touches[0].position; 触摸点索引从 0 开始
touches[0].deltaPosition 触摸点相对上次位置的偏移量 Vector2 delta = Input.touches[0].deltaPosition; 用于滑动控制(如移动角色)
multiTouchEnabled 是否启用多点触控 Input.multiTouchEnabled = true; 默认为 true,禁用后仅识别第一个触摸点

手柄/虚拟按钮

方法 说明 参数 示例 配置
GetButtonDown(“Jump”) 手柄按钮按下瞬间 string 按钮名(如 “Jump”) if (Input.GetButtonDown("Jump")) 跳跃(); 在 Edit > Project Settings > Input Manager 中配置
GetButton(“Fire”) 手柄按钮长按 string 按钮名 if (Input.GetButton("Fire")) 持续射击(); 支持键盘/手柄映射

重力感应(陀螺仪)

属性 说明 示例 注意事项
gyro.enabled 启用陀螺仪(需先开启) Input.gyro.enabled = true; 移动设备专属,PC 需模拟
gyro.gravity 重力加速度向量(世界坐标系) Vector3 gravity = Input.gyro.gravity; 手机倾斜时返回重力方向(如平放时 (0, -1, 0))
gyro.rotationRate 旋转角速度(弧度/秒) float rotation = Input.gyro.rotationRate.z; 手机旋转时的角速度

Screen 屏幕

分类 变量/方法 说明 示例 注意事项
静态属性(常用) currentResolution 当前屏幕分辨率,返回 Resolution 类对象 Resolution resolution = Screen.currentResolution; 得到的是显示器分辨率,不是 Game 窗口的
width、height Game 窗口当前宽高 print("Game窗口宽: " + Screen.width);
print("Game窗口高: " + Screen.height);
用于代码中用 Game 窗口宽高做计算
sleepTimeout 屏幕休眠模式 Screen.sleepTimeout = SleepTimeout.NeverSleep;
Screen.sleepTimeout = SleepTimeout.SystemSetting;
-
静态属性(不常用) fullScreen 运行时是否全屏模式 Screen.fullScreen = true; -
fullScreenMode 窗口模式(FullScreenMode 枚举) Screen.fullScreenMode = FullScreenMode.Windowed; 可选择独占全屏、全屏窗口等
移动设备旋转屏幕 autorotateToLandscapeLeft 允许自动旋转为左横向 Screen.autorotateToLandscapeLeft = true; -
autorotateToLandscapeRight 允许自动旋转为右横向 Screen.autorotateToLandscapeRight = true; -
autorotateToPortrait 允许自动旋转到纵向 Screen.autorotateToPortrait = true; -
autorotateToPortraitUpsideDown 允许自动旋转到纵向倒置 Screen.autorotateToPortraitUpsideDown = true; -
orientation 指定屏幕显示方向 Screen.orientation = ScreenOrientation.Landscape; -
静态方法 SetResolution 设置分辨率(一般移动设备不使用) Screen.SetResolution(1920, 1080, false); -

Camera 摄像机

Camera 组件参数

分类 参数 说明 用途 示例或注意事项
Clear Flags Skybox(天空盒) 3D游戏适用,渲染天空盒 3D游戏开发 -
(清除标志) Solid Color(纯色) 2D游戏适用,可修改背景颜色 2D游戏开发 在 Background 中选择颜色
Depth only(仅深度) 只画该层,背景透明,用于多摄像机叠加 多摄像机渲染 高深度摄像机常选此模式,配合层级选择
Don’t Clear(不清除) 覆盖渲染,较少使用 特殊渲染需求 -
Background - 没有天空盒时的背景颜色 设置背景颜色 选择合适的背景颜色
Culling Mask - 选择性渲染对象层级 控制渲染对象层级 在检视面板中将层分配到对象
Projection Perspective(透视模式) 3D游戏适用,有近大远小效果 3D游戏开发 FOV Axis 控制视野轴,Field of view 控制视角
(投影) Orthographic(正交模式) 2D游戏适用,无近大远小效果 2D游戏开发 Size 控制视野范围
Clipping Planes - 确定对象渲染的距离区间 控制对象渲染范围 对象渲染异常可能与此参数有关
Viewport Rect - 摄像机视图在屏幕的位置和大小 多摄像机游戏 XY 为起始位置,宽高为比例
Depth - 摄像机渲染顺序,值越大越靠上 控制摄像机渲染顺序 低深度先渲染,高深度后渲染
Rendering path - 定义渲染方法 选择渲染方式 -
Target Texture - 渲染到纹理(如小地图) 制作小地图等 创建 Render Texture 并拖拽到该属性
Occlusion Culling - 启用遮挡剔除,优化渲染性能 优化渲染性能 默认勾选,减少不必要渲染
HDR - 启用高动态范围渲染 提升画面质量 -
MSAA - 启用多重采样抗锯齿 提升画面平滑度 -
Allow Dynamic Resolution - 启用动态分辨率渲染 优化性能 -
Target Display - 定义渲染到的外部设备 多屏幕平台游戏开发 -
Target Eye - VR游戏中选择渲染的眼睛 VR游戏开发 -

Camera 参数和方法

获取摄像机相关
静态成员 说明 示例代码 注意事项
main 获取主摄像机(tag 为 “MainCamera”) print(Camera.main); 场景必须有 tag 为 “MainCamera” 的摄像机,否则报错
allCamerasCount 获取场景中摄像机数量 print(Camera.allCamerasCount); -
allCameras 得到场景中所有已启用的摄像机 Camera[] allCameras = Camera.allCameras;
print(allCameras.Length);
-
渲染相关委托
静态变量 说明 示例代码
onPreCull 摄像机开始剔除前触发的事件 Camera.onPreCull += (c) => { /* 处理逻辑 */ };
onPreRender 摄像机开始渲染前触发的事件 Camera.onPreRender += (c) => { /* 处理逻辑 */ };
onPostRender 摄像机完成渲染后触发的事件 Camera.onPostRender += (c) => { /* 处理逻辑 */ };
重要成员
成员 说明 示例代码 注意事项
depth 设置摄像机渲染深度 Camera.main.depth = 10; -
WorldToScreenPoint 世界坐标转屏幕坐标(血条功能) Vector3 v = Camera.main.WorldToScreenPoint(this.transform.position);
print(v);
-
ScreenToWorldPoint 屏幕坐标转世界坐标(需设置 Z 值) Vector3 v = Input.mousePosition;
v.z = 5;
sphere.position = Camera.main.ScreenToWorldPoint(v);
不设置 Z 值时默认为 0,设置后是摄像机前方对应单位的坐标

Light 光面板

光源组件

分类 参数 说明 示例或注意事项
光源类型 Directional(方向光) 模拟太阳,光照方向一致 -
Spot(聚光灯) 类似手电筒,需设置 Range 和 Spot Angle 需设置 Range(范围)和 Spot Angle(光锥角度)
Point(点光源) 类似小灯泡,向四周发光 -
Area(面光源) - -
光源颜色和模式 Color(光源颜色) 设置光源颜色 -
Mode(光源模式) Realtime(实时光源,性能消耗大);Baked(烘焙光源,无法动态变化);Mixed(混合光源) 根据性能和效果需求选择模式
光源强度和间接系数 Intensity(光源强度) 控制光源亮度 -
Indirect Multiplier(间接系数) 改变间接光强度,低于 1 每次反弹光更暗,大于 1 更亮 -
阴影类型 Shadow Type NoShadows(关闭);HardShadows(生硬);SoftShadows(柔和);Realtime Shadows(实时) 选择阴影类型提升视觉效果
Strength(强度) 阴影暗度(0-1,越大越黑) -
Resolution(分辨率) 阴影贴图分辨率,越高越逼真 -
Bias(偏离) 阴影推离光源的距离 -
Normal Bias(法线偏离) 阴影投射面沿法线收缩距离 -
Near Panel(近平面) 渲染阴影的近裁剪面 -
剪影和效果 Cookie(剪影) 投影遮罩,一般用于聚光灯显示图案 -
Cookie Size(剪影大小) 控制剪影大小 -
Draw Halo(绘制光晕) 球形光环开关,用于蜡烛等效果 需在摄像机上加 FlareLayer 脚本才能在 Game 窗口看到
Flare(眩光) 耀斑效果,类似太阳耀斑 需在摄像机上加 FlareLayer 脚本才能在 Game 窗口看到
渲染模式和剔除遮罩 Render Mode Auto(自动);Important(重要,效果好消耗大);Not Important(非重要) 根据性能和效果需求选择
Culling Mask(剔除遮罩) 决定哪些层的对象受到该光源影响 -
代码控制 intensity 控制光的强度乘以光颜色 light.intensity = 0.5f;

光面板(照明设置)

分类 参数 说明 示例或注意事项
环境相关设置 Skybox Material(天空盒材质) 改变天空盒,需创建天空盒着色器材质 -
Sun Source(太阳来源) 不设置会默认使用场景中最亮的方向光 -
环境光设置 Source(环境光光源颜色) Skybox(天空盒);Gradient(渐变,可单独设置天空、地平线、地面颜色) -
Intensity Multiplier(环境光亮度) 控制环境光亮度 -
Ambient Mode(环境模式) 全局光照模式,Realtime(已弃用)、Baked(烘焙) 需启用实时全局和全局烘焙
其它设置 Fog(雾开关) 控制雾的显示 -
Color(雾颜色) 设置雾的颜色 -
Mode(雾计算模式) Linear(线性);Exponential(指数);Exponential Qquare(指数平方) 不同模式需设置不同参数(如 Linear 需设置 Start 和 End 距离)
Halo Texture(光晕材质) 光源周围光环的纹理 -
Halo Strength(光晕强度) 光环可见性 -
Flare Fade Speed(炫光交叉淡化速度) 耀斑淡出时间 -
Flare Strength(炫光强度) 耀斑可见性 -
Spot Cookie(聚光灯剪影) 聚光灯剪影纹理 -

物理系统 - 刚体

刚体组件参数

英文参数 说明 示例或注意事项
Mass(质量) 默认为千克,质量越大惯性越大 -
Drag(空气阻力) 根据力移动对象时的空气阻力大小,0 表示无阻力 -
Angular Drag(角阻力) 阻碍对象旋转的阻力,越大越不容易旋转 -
Use Gravity(重力开关) 是否受重力影响 -
Is Kinematic 开启后不受力影响,只能通过 Transform 移动 -
Interpolate(插值运算) 让刚体移动更平滑 可更改 FixTime,开启插值运算可平滑移动
None(无插值) 不应用插值运算
Interpolate(插值模式) 根据前一帧变换平滑变换
Extrapolate(外推模式) 根据当前速度预测刚体位置
Collision Detection(碰撞检测) 防止快速移动对象穿过其它对象 -
Discrete(离散检测) 默认模式,适合一般速度物体,性能最优
Continuous(连续检测) 适合高速物体,性能消耗较高
Continuous Dynamic(连续动态检测) 适合快速移动物体与静止物体碰撞,性能消耗高
Continuous Speculative(连续推测检测) 预测物体位置进行碰撞检测,性能较高
Constraints(刚体约束) 对刚体运动的限制 -
Freeze Position(冻结位置) 停止刚体沿 X、Y、Z 轴的移动
Freeze Rotation(冻结旋转) 停止刚体围绕 X、Y、Z 轴旋转
Info(当前刚体信息) - -

刚体参数和方法

  • 获取刚体组件rigidBody = this.GetComponent<Rigidbody>();
  • AddForce 方法:相对世界坐标添加力,如 rigidBody.AddForce(Vector3.forward * 10);;相对自身朝向移动用 rigidBody.AddForce(this.transform.forward * 10);
  • AddRelativeForce 方法:相对本地坐标添加力,如 rigidBody.AddRelativeForce(Vector3.forward * 10);
  • AddTorque 方法:相对世界坐标添加扭矩力,如 rigidBody.AddTorque(Vector3.up * 10);
  • AddRelativeTorque 方法:相对本地坐标添加扭矩力,如 rigidBody.AddRelativeTorque(Vector3.up * 10);
  • velocity 变量:设置刚体速度,如 rigidBody.velocity = Vector3.forward * 5;
  • AddExplosionForce 方法:模拟爆炸效果,参数为(力的大小,中心,半径),如 rigidBody.AddExplosionForce(100, Vector3.zero, 10);
  • 力的模式(ForceMode)
    • Acceleration:加速度模式,忽略质量。
    • Force:力模式,与质量有关。
    • Impulse:冲击力模式,瞬间力。
    • VelocityChange:瞬时速度模式,忽略质量。
  • 恒力场组件:搜索 Constant Force 添加到物体,无需代码即可保持力。
  • 刚体的休眠:使用 IsSleeping() 判断是否休眠,WakeUp() 唤醒刚体。

物理系统 - 碰撞体

3D 碰撞器种类

  • 盒状碰撞器 (Box Collider)
  • 球状碰撞器 (Sphere Collider)
  • 胶囊碰撞器 (Capsule Collider)
  • 网格碰撞器 (Mesh Collider)
  • 轮胎碰撞器 (Wheel Collider)
  • 地形碰撞器 (Terrain Collider)

3D 碰撞器共同参数

英文参数 说明 示例或注意事项
Edit Collider 改变碰撞体大小 -
Is Trigger 启用后为触发器,忽略物理碰撞 -
Material 确定碰撞时的交互方式 -
Center 碰撞体在对象局部空间的中心点 -

常用碰撞器

碰撞器类型 英文参数 说明
Box Collider Size(大小) 碰撞体在 X、Y、Z 方向的大小
Sphere Collider Radius(半径) 球形碰撞体的半径大小
Capsule Collider Radius(半径) 胶囊体的半径
Height(高度) 胶囊体的高度
Direction(轴向) 胶囊体在对象局部空间的轴向

说明:异形物体可使用多种碰撞器组合。刚体对象的子对象碰撞器会参与碰撞检测(如金字塔预设体,仅在最高层级对象添加刚体,子对象的碰撞器仍生效)。

不常用碰撞器

碰撞器类型 英文参数 说明 示例或注意事项
Mesh Collider - 性能消耗较高,默认不显示碰撞器边框,开启 Convex 才显示 加了刚体的网格碰撞器必须开启 Convex 才能碰撞
Convex(凸面) - -
Cooking Options 网格烹制选项 -
Mesh(网格模型) 引用用于碰撞的网格 -
Wheel Collider - 国内赛车游戏公司较少使用 给车的父对象加刚体,子对象加车轮碰撞器模拟汽车
Mass(车轮质量) - -
Radius(车轮半径) - -
Wheel Damping Rate 车轮阻尼值 -
Suspension Distance 车轮悬架最大延伸距离 -
Force App Point Distance 车轮受力点 -
Suspension Spring 悬架弹簧力和阻尼力 -
Terrain Collider - 性能消耗较高 -
Terrain Data 地形数据 -
Enable Tree Colliders 启用树碰撞体 -

物理系统 - 物理材质

英文参数 说明
Dynamic Friction(动摩擦力) 已移动时使用的摩擦力,0 到 1 之间,0 像冰,1 使对象迅速静止
Static Friction(静摩擦力) 静止时使用的摩擦力,0 到 1 之间,0 像冰,1 难以移动
Bounciness(弹性) 表面弹性,0 不反弹,1 无能量损失
Friction Combine(摩擦力组合) 两个碰撞对象摩擦力的组合方式:Average(平均值)、Minimum(最小值)、Maximum(最大值)、Multiply(相乘)
Bounce Combine(反弹组合) 两个碰撞对象弹性的组合方式,模式与摩擦力组合相同

碰撞检测函数

碰撞器与触发器的核心条件对比

碰撞发生的必要条件
条件 说明 示例
至少1个刚体 提供物理模拟动力源 下落的立方体(带刚体)碰撞地面(无刚体但有碰撞器)
双方均有碰撞器 定义碰撞体积 子弹(刚体+碰撞器) vs 敌人(碰撞器)
碰撞器未开启 Is Trigger 必须为物理碰撞模式 关闭触发器的胶囊体碰撞
触发器触发的必要条件
条件 说明 示例
至少1个碰撞器开启 Is Trigger 标记为触发器,禁用物理碰撞 门的触发区域(碰撞器+Is Trigger)
至少1个刚体(可选) 非必须,但刚体存在时事件更稳定 玩家(刚体)进入触发器区域(无刚体的碰撞器)
双方碰撞器重叠 空间上产生交集 球形触发器包裹玩家

物理碰撞检测响应函数

// 碰撞触发接触时执行
private void OnCollisionEnter(Collision collision)
{
    Collider collider = collision.collider; // 碰撞对象的碰撞器
    GameObject gameObject = collision.gameObject; // 碰撞对象
    Transform transform = collision.transform; // 碰撞对象的位置
    
    int contactCount = collision.contactCount;
    ContactPoint[] pos = collision.contacts; // 接触点数组
    
    print(this.name + "被" + collision.gameObject.name + "撞到了");
}

// 碰撞结束分离时执行
private void OnCollisionExit(Collision collision)
{
    print(this.name + "被" + collision.gameObject.name + "结束碰撞了");
}

// 碰撞持续接触时执行(静止时不调用)
private void OnCollisionStay(Collision collision)
{
    print(this.name + "一直在和" + collision.gameObject.name + "接触");
}

触发器检测响应函数

// 触发开始时执行
protected virtual void OnTriggerEnter(Collider other)
{
    print(this.name + "被" + other.gameObject.name + "触发了");
}

// 触发结束时执行
private void OnTriggerExit(Collider other)
{
    print(this.name + "被" + other.gameObject.name + "结束触发状态了");
}

// 触发持续时执行
private void OnTriggerStay(Collider other)
{
    print(this.name + "和" + other.gameObject.name + "正在触发");
}

Unity 音效系统

音频文件导入

分类 知识点 说明/示例
支持格式 WAV、MP3、OGG、AIFF 推荐 WAV(无损)用于短音效,MP3/OGG 用于长音频
导入操作 直接拖拽到 Project 窗口 -
属性设置 Force To Mono(强制单声道) 多声道转单声道,适合语音类音频
LoadType(加载类型) Decompress On Load(小音效,内存高);Compress in Memory(大音效,内存低);Streaming(极长音频)
Preload Audio Data(预加载) 勾选:进入场景预加载;不勾选:首次播放时加载
预览与控制 底部工具栏播放/暂停/循环按钮 支持拖拽进度条预览音频

音频源(AudioSource)

音频源组件参数
分类 参数 说明 适用场景 注意事项
基础设置 AudioClip 拖拽音频文件,指定播放内容 背景音乐、UI 音效、技能特效 -
Play On Awake 启用时对象创建即播放(默认√) 背景音乐(√)、UI 点击音效(×) 动态生成对象需关闭此选项
Loop 循环播放(默认×) 背景音乐、环境音 短音效禁用循环
音量控制 Volume 音量(0-1,支持负数) 主音量调节、角色音量衰减 结合 PlayerPrefs 存储用户设置
Priority 优先级(0-255,0 最高,默认 128) 多音效冲突时高优先级优先播放 超过 32 个音效可能爆音
2D 音效 Stereo Pan 左右声道平衡(-1左 ~ 1右) UI 按钮立体声、2D 游戏音效 与 Spatial Blend=0 配合使用
3D 音效 Spatial Blend 空间混合(0=2D,1=3D) 3D 游戏脚步声、NPC 语音 设为 1 时需配置 Min/Max Distance 和衰减曲线
Doppler Level 多普勒效果(0-1,模拟运动音调变化) 车辆引擎声、飞行物音效 角色移动时生效,静态对象设为 0
Volume Rolloff 衰减模式:Logarithmic(真实)、Linear(线性)、Custom(自定义) 脚步声(Logarithmic)、环境音(Custom) Custom 需手动绘制曲线
Min/Max Distance 3D 音效生效范围 脚步声(Min=1,Max=5)、BOSS 语音(Min=2,Max=10) Min 过小、Max 过大影响性能
性能控制 Bypass Effects 跳过音效滤镜(如混响、延迟) 性能优化,禁用非必要特效 仅在低端设备或复杂场景使用
Output 输出到混音器(高级功能) 多声道混音、分组控制 需配合 AudioMixer 组件使用
音频源参数和方法
方法/属性 说明 示例代码
Play() 播放音频(从开头) audioSource.Play();
PlayDelayed(5f) 延迟播放(秒为单位) audioSource.PlayDelayed(2f);
Pause()/UnPause() 暂停/恢复(保留播放位置) audioSource.Pause();
Stop() 停止并重置位置 audioSource.Stop();
isPlaying 检测是否播放(只读) if (!audioSource.isPlaying) 播放完毕逻辑;
多 AudioSource 一个物体挂多个音频源,独立控制 AudioSource[] audios = GetComponents<AudioSource>(); audios[1].Play();

麦克风录制

功能 方法/属性 示例代码
获取设备 Microphone.devices string[] mics = Microphone.devices;
开始录制 Microphone.Start(设备名, 循环, 时长, 采样率) audioClip = Microphone.Start(null, false, 10, 44100);
停止录制 Microphone.End(设备名) Microphone.End(null);
获取音频数据 AudioClip.GetData(数组, 起始样本) float[] data = new float[clip.channels * clip.samples];
clip.GetData(data, 0);
播放录音 绑定 AudioSource 播放 audioSource.clip = 录音Clip; audioSource.Play();


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏