36.Unity入门基础知识总结
发布时间 :
字数:8.4k
阅读 :
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 主要用于游戏对象的位移、旋转、缩放、父子关系、坐标转换等操作。
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.forward
、transform.up
、transform.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)); |
鼠标输入(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