一、Unity 基础


文档摘要

一、Unity 基础 一、Unity 基础章节:迈向游戏开发的第一步 Unity 是一款强大的跨平台游戏引擎,被广泛应用于 2D、3D 游戏、AR/VR 应用以及各种互动体验的开发。本章节将带您深入了解 Unity 的基础知识,为您的游戏开发之旅打下坚实的基础。 1. Unity 编辑器概览:您的创作中心 Unity 编辑器是您在 Unity 中进行所有创作的核心工具。熟悉编辑器界面是高效开发的第一步。 内容详解: 菜单栏 (Menu Bar): 位于编辑器顶部,包含文件、编辑、资源、游戏对象、组件、窗口、帮助等菜单,提供各种操作命令。例如: File (文件): 创建、打开、保存项目和场景,构建发布游戏等。 Edit (编辑): 撤销、重做、复制、粘贴、删除等常用编辑操作。

一、Unity 基础

一、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); } }

操作步骤:

  1. 在 Unity 编辑器中创建一个新的 3D 项目。

  2. 在层级窗口中创建一个新的 C# 脚本,命名为 EditorOverviewExample

  3. 将脚本拖拽到场景中的任何一个游戏对象上 (例如默认的 Main Camera)。

  4. 打开 EditorOverviewExample.cs 脚本,将上述代码复制粘贴到脚本中,并保存。

  5. 点击编辑器工具栏上的 "Play" 按钮运行游戏。

  6. 打开控制台窗口 (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!"); } } }

操作步骤:

  1. 在 Unity 项目的 "Assets" 文件夹中创建一个新的文件夹,命名为 _Textures

  2. 将一张图片 (例如 PNG 或 JPG 格式) 拖拽到 _Textures 文件夹中,导入为纹理资源。

  3. 在场景中创建一个新的 3D 对象,例如 Cube。

  4. 创建一个新的 C# 脚本,命名为 ResourceManagementExample

  5. 将脚本拖拽到 Cube 对象上。

  6. 打开 ResourceManagementExample.cs 脚本,将上述代码复制粘贴到脚本中,并保存。

  7. 在检视面板中,找到 ResourceManagementExample (Script) 组件的 "My Texture" 属性,将 _Textures 文件夹中的纹理资源拖拽到该属性框中。

  8. 运行游戏,查看 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); } }

操作步骤:

  1. 在 Unity 编辑器中创建一个新的场景。

  2. 在场景中创建一个新的 3D 对象,例如 Cube (或者使用场景中已有的对象)。

  3. 创建一个新的 C# 脚本,命名为 SceneGameObjectExample

  4. 将脚本拖拽到 Cube 对象上。

  5. 打开 SceneGameObjectExample.cs 脚本,将上述代码复制粘贴到脚本中,并保存。

  6. 运行游戏,观察 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); } }

操作步骤:

  1. 在 Unity 编辑器中创建一个新的 3D 对象,例如 Cube。

  2. 创建一个新的 C# 脚本,命名为 ComponentSystemExample

  3. 将脚本拖拽到 Cube 对象上。

  4. 打开 ComponentSystemExample.cs 脚本,将上述代码复制粘贴到脚本中,并保存。

  5. 运行游戏,观察 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!"); } } }

操作步骤:

  1. 在 Unity 编辑器中创建一个新的 3D 对象,例如 Cube。

  2. 创建一个新的 C# 脚本,命名为 ScriptingExample

  3. 将脚本拖拽到 Cube 对象上。

  4. 打开 ScriptingExample.cs 脚本,将上述代码复制粘贴到脚本中,并保存。

  5. 在检视面板中,可以调整 Move SpeedRotation Speed 属性值。

  6. 运行游戏,使用 W/S/A/D 键或方向键控制 Cube 的前后左右移动,使用鼠标左右移动控制 Cube 的水平旋转,按下空格键查看控制台输出信息。


发布者: 作者: 转发
评论区 (0)
U