一、Unity 基础 一、Unity 基础章节:迈向游戏开发的第一步 Unity 是一款强大的跨平台游戏引擎,被广泛应用于 2D、3D 游戏、AR/VR 应用以及各种互动体验的开发。本章节将带您深入了解 Unity 的基础知识,为您的游戏开发之旅打下坚实的基础。 1. Unity 编辑器概览:您的创作中心 Unity 编辑器是您在 Unity 中进行所有创作的核心工具。熟悉编辑器界面是高效开发的第一步。 内容详解: 菜单栏 (Menu Bar): 位于编辑器顶部,包含文件、编辑、资源、游戏对象、组件、窗口、帮助等菜单,提供各种操作命令。例如: File (文件): 创建、打开、保存项目和场景,构建发布游戏等。 Edit (编辑): 撤销、重做、复制、粘贴、删除等常用编辑操作。
一、Unity 基础章节:迈向游戏开发的第一步
Unity 是一款强大的跨平台游戏引擎,被广泛应用于 2D、3D 游戏、AR/VR 应用以及各种互动体验的开发。本章节将带您深入了解 Unity 的基础知识,为您的游戏开发之旅打下坚实的基础。
1. Unity 编辑器概览:您的创作中心
Unity 编辑器是您在 Unity 中进行所有创作的核心工具。熟悉编辑器界面是高效开发的第一步。
内容详解:
菜单栏 (Menu Bar): 位于编辑器顶部,包含文件、编辑、资源、游戏对象、组件、窗口、帮助等菜单,提供各种操作命令。例如:
File (文件): 创建、打开、保存项目和场景,构建发布游戏等。
Edit (编辑): 撤销、重做、复制、粘贴、删除等常用编辑操作。
Assets (资源): 导入、导出、创建资源,管理资源包等。
GameObject (游戏对象): 创建各种游戏对象,如 3D 对象、UI 元素、灯光、摄像机等。
Component (组件): 为游戏对象添加组件,例如物理组件、渲染组件、脚本组件等。
Window (窗口): 打开和管理各种编辑器窗口,例如 Animation、Animator、Profiler 等。
Help (帮助): 访问 Unity 文档、教程、社区等资源。
工具栏 (Toolbar): 位于菜单栏下方,提供常用的快捷操作按钮,例如:
Transform Tools (变换工具): 移动、旋转、缩放游戏对象。
Play/Pause/Step Buttons (播放/暂停/步进按钮): 控制游戏运行。
Layers (图层): 管理场景对象的图层,用于渲染排序和碰撞检测。
Layouts (布局): 保存和加载编辑器窗口布局。
场景视图 (Scene View): 编辑器中心区域,您可以在此视图中可视化地编辑场景,放置、移动、旋转和缩放游戏对象。
Scene Gizmo (场景轴心): 位于场景视图右上角,用于控制场景视图的视角方向。
工具栏按钮: 场景视图工具栏提供平移、旋转、缩放场景视图的工具。
游戏视图 (Game View): 模拟游戏运行时玩家看到的画面。您可以在此视图中预览游戏效果,并进行调试。
Aspect Ratio (宽高比): 设置游戏视图的宽高比,模拟不同设备屏幕的显示效果。
Maximize on Play (运行时最大化): 设置游戏运行时是否最大化游戏视图。
层级窗口 (Hierarchy Window): 以树状结构显示当前场景中的所有游戏对象。您可以在此窗口中选择、重命名、排序、创建和删除游戏对象,以及管理游戏对象的父子关系。
项目窗口 (Project Window): 显示项目资源文件夹 (Assets 文件夹) 的内容。您可以在此窗口中浏览、创建、导入、重命名、移动和删除资源,例如脚本、模型、纹理、材质、音频等。
搜索栏: 快速查找项目资源。
资源类型过滤器: 过滤显示特定类型的资源。
检视面板 (Inspector Window): 显示当前选中游戏对象或资源的属性和组件。您可以在此面板中修改游戏对象的位置、旋转、缩放、组件参数等。
控制台窗口 (Console Window): 显示 Unity 编辑器和脚本输出的日志信息,包括错误、警告和调试信息。对于调试和排查问题非常重要。
代码实践:
using UnityEngine; public class EditorOverviewExample : MonoBehaviour { void Start() { // 使用 Debug.Log 在控制台窗口输出信息 Debug.Log("Hello Unity! This is a debug message."); Debug.Warning("This is a warning message."); Debug.LogError("This is an error message."); // 获取当前游戏对象的名字并在控制台输出 Debug.Log("GameObject Name: " + gameObject.name); // 获取当前游戏对象在场景中的位置并在控制台输出 Debug.Log("GameObject Position: " + transform.position); } }
操作步骤:
在 Unity 编辑器中创建一个新的 3D 项目。
在层级窗口中创建一个新的 C# 脚本,命名为 EditorOverviewExample。
将脚本拖拽到场景中的任何一个游戏对象上 (例如默认的 Main Camera)。
打开 EditorOverviewExample.cs 脚本,将上述代码复制粘贴到脚本中,并保存。
点击编辑器工具栏上的 "Play" 按钮运行游戏。
打开控制台窗口 (Window -> Console),查看输出的信息。
2. 项目结构与资源管理:井然有序的资源库
Unity 项目的组织结构对于项目的可维护性和团队协作至关重要。理解项目结构,合理管理资源是高效开发的关键。
内容详解:
Assets 文件夹: 项目资源文件夹,您创建和导入的所有资源都存放在这里。这是您最常用的文件夹,需要精心组织。
场景文件 (.unity): 保存场景数据的二进制文件。
脚本文件 (.cs): C# 脚本文件,包含游戏逻辑代码。
模型文件 (.fbx, .obj): 3D 模型文件。
纹理文件 (.png, .jpg): 图像文件,用于材质、UI 等。
材质文件 (.mat): 定义物体表面外观的材质文件。
预制体文件 (.prefab): 预制体资源,可重复使用的游戏对象模板。
音频文件 (.mp3, .wav): 音频资源。
其他资源: 动画、字体、视频、着色器等。
资源管理建议:
清晰的目录结构: 根据资源类型、功能模块等创建子文件夹,例如 _Scenes, _Scripts, _Models, _Textures, _Materials, _Prefabs, _Audio 等。
统一的命名规范: 使用有意义的名称,例如 PlayerModel_01.fbx, MainMenuScene.unity, EnemyAIScript.cs 等。
避免资源冗余: 及时清理无用资源,减少项目体积。
使用版本控制: 例如 Git,管理项目资源和代码的版本,方便团队协作和回溯。
Library 文件夹: Unity 编辑器缓存文件夹,包含导入资源的缓存数据、临时文件等。通常不需要手动修改此文件夹内容,Unity 会自动管理。
ProjectSettings 文件夹: 包含项目设置文件,例如编辑器设置、图形设置、物理设置、构建设置等。您可以在 "Edit -> Project Settings" 窗口中修改这些设置。
Packages 文件夹: 包含项目依赖的 Unity 包管理器 (Package Manager) 包。Unity 包管理器用于管理和更新 Unity 功能模块和第三方库。
代码实践:
using UnityEngine; public class ResourceManagementExample : MonoBehaviour { public Texture2D myTexture; // 在检视面板中拖拽纹理资源 void Start() { if (myTexture != null) { Debug.Log("Texture Width: " + myTexture.width); Debug.Log("Texture Height: " + myTexture.height); GetComponent<Renderer>().material.mainTexture = myTexture; // 将纹理应用到 Renderer 组件的材质上 } else { Debug.LogError("Texture is not assigned in the Inspector!"); } } }
操作步骤:
在 Unity 项目的 "Assets" 文件夹中创建一个新的文件夹,命名为 _Textures。
将一张图片 (例如 PNG 或 JPG 格式) 拖拽到 _Textures 文件夹中,导入为纹理资源。
在场景中创建一个新的 3D 对象,例如 Cube。
创建一个新的 C# 脚本,命名为 ResourceManagementExample。
将脚本拖拽到 Cube 对象上。
打开 ResourceManagementExample.cs 脚本,将上述代码复制粘贴到脚本中,并保存。
在检视面板中,找到 ResourceManagementExample (Script) 组件的 "My Texture" 属性,将 _Textures 文件夹中的纹理资源拖拽到该属性框中。
运行游戏,查看 Cube 对象是否应用了指定的纹理。
3. 场景与游戏对象:构建虚拟世界的基石
场景 (Scene) 是 Unity 项目的基本构建单元,代表游戏中的一个关卡、一个菜单界面或者一个独立的模块。游戏对象 (GameObject) 是场景中的基本元素,构成游戏世界的各种实体。
内容详解:
场景 (Scene):
代表游戏中的一个关卡或模块。
包含多个游戏对象,构成游戏世界的场景内容。
可以通过 "File -> New Scene" 创建新的场景。
可以通过 "File -> Save Scene" 或 "File -> Save Scene As..." 保存场景。
可以通过 "File -> Open Scene" 打开已保存的场景。
在 "Build Settings" 窗口中管理项目包含的场景列表。
游戏对象 (GameObject):
Unity 世界中的基本实体,所有物体、角色、特效、UI 元素等都是游戏对象。
每个游戏对象都有一个唯一的名称和一个 Transform 组件。
可以通过 "GameObject" 菜单创建各种类型的游戏对象。
可以通过层级窗口管理场景中的游戏对象。
可以通过检视面板查看和修改游戏对象的属性和组件。
父子关系: 游戏对象可以建立父子关系,子对象会继承父对象的位置、旋转和缩放变换。
Transform 组件: 每个游戏对象都自带的组件,用于控制游戏对象在场景中的位置、旋转和缩放。
Position (位置): 游戏对象在世界坐标系中的位置 (X, Y, Z 坐标)。
Rotation (旋转): 游戏对象的旋转角度 (Euler 角或四元数)。
Scale (缩放): 游戏对象在 X, Y, Z 轴方向上的缩放比例。
代码实践:
using UnityEngine; public class SceneGameObjectExample : MonoBehaviour { void Start() { // 获取当前游戏对象的 Transform 组件 Transform currentTransform = transform; // 修改游戏对象的位置 currentTransform.position = new Vector3(2, 1, 0); // 修改游戏对象的旋转 (绕 Y 轴旋转 45 度) currentTransform.rotation = Quaternion.Euler(0, 45, 0); // 修改游戏对象的缩放 currentTransform.localScale = new Vector3(2, 2, 2); // 创建一个新的 Cube 游戏对象 GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube); cube.name = "NewCube"; // 设置游戏对象的名字 cube.transform.position = new Vector3(0, 0.5f, 0); // 设置新 Cube 的位置 // 将当前游戏对象设置为新 Cube 的父对象 transform.SetParent(cube.transform); } }
操作步骤:
在 Unity 编辑器中创建一个新的场景。
在场景中创建一个新的 3D 对象,例如 Cube (或者使用场景中已有的对象)。
创建一个新的 C# 脚本,命名为 SceneGameObjectExample。
将脚本拖拽到 Cube 对象上。
打开 SceneGameObjectExample.cs 脚本,将上述代码复制粘贴到脚本中,并保存。
运行游戏,观察 Cube 对象的位置、旋转、缩放是否发生变化,以及是否创建了一个新的 Cube 对象,并且原始 Cube 对象成为了新 Cube 的子对象。
4. 组件系统详解:赋予游戏对象行为和属性
组件 (Component) 是 Unity 引擎的核心概念之一。组件为游戏对象赋予各种功能和属性,例如渲染、物理、动画、脚本逻辑等。Unity 采用组件化的架构,使得游戏对象的行为和外观可以灵活组合和扩展。
内容详解:
组件 (Component) 的概念:
组件是附加到游戏对象上的模块化功能单元。
每个组件负责游戏对象的一个特定方面,例如渲染、物理、行为逻辑等。
一个游戏对象可以附加多个组件,组合成复杂的功能。
Unity 内置了丰富的组件库,涵盖各种常用功能。
用户可以编写自定义脚本组件,扩展游戏对象的功能。
常用组件类型:
Transform 组件 (UnityEngine.Transform): 控制游戏对象的位置、旋转和缩放,每个游戏对象都必须有 Transform 组件。
Renderer 组件 (UnityEngine.Renderer): 负责游戏对象的渲染,决定游戏对象在屏幕上的外观。常见的 Renderer 组件包括:
Mesh Renderer (UnityEngine.MeshRenderer): 渲染 3D 模型网格。
Sprite Renderer (UnityEngine.SpriteRenderer): 渲染 2D 精灵图像。
Collider 组件 (UnityEngine.Collider): 定义游戏对象的碰撞形状,用于物理碰撞检测。常见的 Collider 组件包括:
Box Collider (UnityEngine.BoxCollider): 立方体碰撞体。
Sphere Collider (UnityEngine.SphereCollider): 球形碰撞体。
Mesh Collider (UnityEngine.MeshCollider): 基于模型网格的碰撞体 (性能消耗较高)。
Rigidbody 组件 (UnityEngine.Rigidbody): 使游戏对象受物理引擎控制,产生重力、碰撞、力等物理效果。
Script 组件 (自定义脚本): 用户编写的 C# 脚本,用于控制游戏对象的行为逻辑。
组件操作:
添加组件: 在检视面板中,点击 "Add Component" 按钮,选择要添加的组件类型。
获取组件: 通过脚本代码,使用 GetComponent< 组件类型 >() 方法获取游戏对象上的组件实例。
移除组件: 在检视面板中,点击组件右上角的齿轮图标,选择 "Remove Component"。
访问组件属性: 通过脚本代码,访问组件实例的公共属性和方法,控制组件的行为。
代码实践:
using UnityEngine; public class ComponentSystemExample : MonoBehaviour { void Start() { // 获取 Mesh Renderer 组件 MeshRenderer meshRenderer = GetComponent<MeshRenderer>(); if (meshRenderer != null) { // 修改材质颜色 meshRenderer.material.color = Color.red; } // 获取 Rigidbody 组件 Rigidbody rigidbody = GetComponent<Rigidbody>(); if (rigidbody == null) { // 如果没有 Rigidbody 组件,则添加一个 rigidbody = gameObject.AddComponent<Rigidbody>(); } // 设置刚体的质量 rigidbody.mass = 10f; // 给刚体施加一个向上的力 rigidbody.AddForce(Vector3.up * 500f); } }
操作步骤:
在 Unity 编辑器中创建一个新的 3D 对象,例如 Cube。
创建一个新的 C# 脚本,命名为 ComponentSystemExample。
将脚本拖拽到 Cube 对象上。
打开 ComponentSystemExample.cs 脚本,将上述代码复制粘贴到脚本中,并保存。
运行游戏,观察 Cube 对象的颜色是否变为红色,是否受到向上的力而向上运动 (如果场景中有光源,颜色变化会更明显)。
5. 脚本编程入门:控制游戏逻辑的灵魂
脚本 (Script) 是 Unity 游戏开发的核心,使用 C# 语言编写,用于控制游戏对象的行为逻辑、处理用户输入、实现游戏规则等。Unity 提供了丰富的 API (应用程序编程接口) 供脚本调用,方便开发者实现各种游戏功能。
内容详解:
C# 语言基础: Unity 脚本使用 C# 语言编写,需要掌握 C# 的基本语法,例如:
类 (Class): 脚本的基本组织单位,用于定义游戏对象的行为和数据。
变量 (Variable): 用于存储数据,例如整数、浮点数、字符串、游戏对象、组件等。
函数 (Function): 用于执行特定任务的代码块,例如初始化、更新、事件处理等。
控制语句 (Control Statements): 例如 if, else, for, while, switch,用于控制程序流程。
命名空间 (Namespace): 用于组织代码,避免命名冲突。Unity API 位于 UnityEngine 命名空间下。
Unity API 常用类和方法:
UnityEngine 命名空间: 包含 Unity 引擎的核心类和方法。
GameObject 类: 代表游戏对象,提供访问游戏对象属性和组件的方法,例如 GetComponent(), AddComponent(), Find(), Instantiate(), Destroy(), name, transform, tag 等。
Transform 类: 控制游戏对象的位置、旋转和缩放,提供访问和修改变换属性的方法,例如 position, rotation, localScale, Translate(), Rotate(), LookAt() 等。
Component 类: 所有组件的基类,提供访问组件属性和方法的方法,例如 GetComponent(), gameObject 等。
Input 类: 处理用户输入,例如键盘、鼠标、触摸、摇杆等,提供获取输入状态的方法,例如 GetKey(), GetMouseButton(), GetAxis() 等。
Debug 类: 用于调试和输出日志信息,提供 Log(), Warning(), LogError() 等方法。
Time 类: 提供时间相关的信息,例如 deltaTime (帧时间间隔), time (游戏运行时间) 等。
Mathf 类: 提供数学运算函数,例如 Sin(), Cos(), Sqrt(), Clamp(), Lerp() 等。
脚本生命周期函数: Unity 脚本有一些预定义的生命周期函数,在游戏运行的不同阶段自动调用,用于处理不同的逻辑:
Awake(): 在脚本实例被创建后立即调用,用于初始化变量、获取组件等 (在 Start 函数之前调用)。
Start(): 在脚本第一次被启用前调用,用于执行初始化逻辑 (在第一帧 Update 之前调用)。
Update(): 每帧调用一次,用于执行帧更新逻辑,例如移动、动画、输入处理等 (频率取决于帧率)。
FixedUpdate(): 以固定的时间间隔调用,用于执行物理相关的更新逻辑 (频率固定,不受帧率影响)。
LateUpdate(): 在 Update 函数之后调用,用于执行需要在所有 Update 之后执行的逻辑,例如摄像机跟随。
OnDestroy(): 在脚本实例被销毁前调用,用于清理资源、释放内存等。
OnEnable(): 在脚本组件被启用时调用。
OnDisable(): 在脚本组件被禁用时调用。
代码实践:
using UnityEngine; public class ScriptingExample : MonoBehaviour { public float moveSpeed = 5f; public float rotationSpeed = 100f; void Update() { // 获取水平和垂直方向的输入 float horizontalInput = Input.GetAxis("Horizontal"); // 左右方向 (A/D 键或左右方向键) float verticalInput = Input.GetAxis("Vertical"); // 上下方向 (W/S 键或上下方向键) // 基于输入移动游戏对象 Vector3 movement = new Vector3(horizontalInput, 0f, verticalInput) * moveSpeed * Time.deltaTime; transform.Translate(movement); // 基于鼠标 X 轴输入旋转游戏对象 float mouseXInput = Input.GetAxis("Mouse X"); transform.Rotate(Vector3.up * mouseXInput * rotationSpeed * Time.deltaTime); // 按下空格键时在控制台输出信息 if (Input.GetKeyDown(KeyCode.Space)) { Debug.Log("Space key pressed!"); } } }
操作步骤:
在 Unity 编辑器中创建一个新的 3D 对象,例如 Cube。
创建一个新的 C# 脚本,命名为 ScriptingExample。
将脚本拖拽到 Cube 对象上。
打开 ScriptingExample.cs 脚本,将上述代码复制粘贴到脚本中,并保存。
在检视面板中,可以调整 Move Speed 和 Rotation Speed 属性值。
运行游戏,使用 W/S/A/D 键或方向键控制 Cube 的前后左右移动,使用鼠标左右移动控制 Cube 的水平旋转,按下空格键查看控制台输出信息。