01-unity基础api详解
Course: Unity 逆向
🎮 Unity基础API详解(脚本生命周期+对象操作)
核心目标:掌握Unity脚本核心生命周期函数的调用逻辑,学会使用基础API查找、修改Game Object,理解组件激活/实例化的核心概念
🏛️ 脚本核心生命周期函数
Unity脚本的内置函数由引擎自动调用,无需手动触发,核心围绕「对象实例化→激活→运行→销毁」的流程执行。
✅ 关键生命周期函数详解
| 函数名 | 调用时机 | 核心特点 | 注意事项 |
|---|---|---|---|
| 🔧 Awake | 对象被实例化后立即调用 | 仅调用1次,不受激活状态影响 | 初始化对象基础数据(如变量赋值),优先于Start执行 |
| 🚀 Start | 对象第一次激活后调用 | 仅调用1次,依赖激活状态 | 适合初始化需要依赖其他组件的逻辑(如获取组件引用) |
| 🔄 Update | 游戏每一帧自动调用 | 帧频不固定(默认60帧/秒) | 处理核心游戏逻辑(如移动、输入检测) |
| ✅ OnEnable | 对象被激活时调用(包括首次激活) | 可多次调用(激活一次调用一次) | 组件激活后执行的逻辑(如开启协程、显示UI) |
| ❌ OnDisable | 对象被取消激活或关卡结束时调用 | 可多次调用(取消激活一次调用一次) | 组件禁用前执行的逻辑(如关闭协程、隐藏UI) |
⚡ 生命周期执行顺序(关键!)
- 对象实例化 → 🔧 Awake(无论是否激活都执行)
- 对象激活 → ✅ OnEnable → 🚀 Start(仅首次激活执行)
- 游戏运行 → 🔄 Update(每帧执行)
- 对象取消激活 → ❌ OnDisable
- 关卡结束 → ❌ OnDisable(所有组件自动调用)
📌 核心区别对比(Awake vs Start)
| 对比维度 | Awake | Start |
|---|---|---|
| 触发条件 | 对象实例化(场景加载时自动实例化) | 对象第一次激活(勾选组件/代码激活) |
| 执行优先级 | 更高(先于所有Start执行) | 更低(后于所有Awake执行) |
| 激活依赖 | 无(未激活的对象也会执行) | 有(未激活的对象不会执行) |
| 典型用途 | 初始化独立数据(如自身变量、组件引用) | 初始化依赖数据(如获取其他对象的组件) |
🛠️ 基础API实战:查找与修改Game Object
核心API:FindObjectsOfType<GameObject>()
- 功能:查找场景中所有指定类型的对象,返回对象数组(此处类型为GameObject,即查找所有游戏对象)
- 特点:模板函数,支持查找任意组件/对象类型,适合批量遍历对象
实战案例:查找Player并修改名称
1. 需求
遍历场景中所有Game Object,找到名为「Player」的对象,将其名称修改为「ACC」(或自定义名称)
2. 实现步骤(脚本代码)
using UnityEngine;
public class Test : MonoBehaviour
{
// 1. 启动时执行一次(适合初始化查找)
void Start()
{
// 查找场景中所有GameObject,返回数组
GameObject[] allObjects = FindObjectsOfType<GameObject>();
// 遍历所有对象
for (int i = 0; i < allObjects.Length; i++)
{
// 字符串比对,找到名为"Player"的对象
if (allObjects[i].name == "Player")
{
// 修改对象名称
allObjects[i].name = "ACC";
Debug.Log("找到Player,已修改名称为:ACC");
}
}
}
// 2. 每帧执行(验证效果,可注释)
void Update()
{
// Debug.Log("Update每帧执行");
}
}3. 关键说明
Debug.Log():在控制台输出日志,用于调试(控制台打开方式:窗口→常规→控制台)- 对象名称
name:Unity中每个Game Object自带的属性,可直接读取/修改 - 遍历逻辑:通过for循环遍历对象数组,利用字符串比对精准查找目标对象
📝 关键注意事项
- 🖥️ 脚本编辑工具设置:若点击「编辑脚本」无法打开,需在「编辑→首选项→外部工具」中手动选择代码编辑器(如Visual Studio)
- 📊 控制台使用:日志过多时可点击「Clear」清空,折叠日志需点击控制台左侧折叠按钮
- 🔌 组件激活状态:脚本组件的勾选框控制「激活/取消激活」,仅影响OnEnable/OnDisable,不影响Awake(实例化时已执行)
- 代码规范:生命周期函数名需严格区分大小写(如
OnEnable不能写成onEnable),否则引擎无法自动调用
🎯 核心总结
- 生命周期函数是Unity脚本的基础,需牢记「Awake先于Start,Update每帧执行,OnEnable/OnDisable对应激活状态切换」
FindObjectsOfType<GameObject>()是批量操作对象的核心API,适合逆向查找、批量修改场景对象- 激活≠实例化:实例化是对象创建(场景加载时自动完成),激活是对象是否参与游戏逻辑(可手动勾选控制)