杰瑞科技汇

Unity3D实例教程如何快速入门?

Unity 3D 实例教程:从零开始的游戏开发之旅

Unity 是一款功能强大且广受欢迎跨平台游戏引擎,使用 C# 作为其主要编程语言,本教程将引导您通过一系列由浅入深的实例,掌握 Unity 的核心技能。

Unity3D实例教程如何快速入门?-图1
(图片来源网络,侵删)

第一部分:基础入门 (新手村)

这个阶段的目标是熟悉 Unity 的界面、基本工作流程和核心概念。

实例 1:创建你的第一个场景

  • 目标:了解 Unity 编辑器布局,创建一个包含基本元素的 3D 场景。
  • 核心概念
    • 场景:游戏中的一个独立环境,比如一个关卡、一个主菜单。
    • 游戏对象:场景中的一切事物,包括角色、灯光、摄像机、UI 元素等。
    • 层级视图:显示场景中所有游戏对象的层级结构。
    • 场景视图:3D 可视化编辑窗口,用于放置和调整对象。
    • 项目视图:存放你的所有资源,如模型、贴图、脚本等。
    • 检查器视图:显示选中游戏对象的组件和属性。
  • 操作步骤
    1. 打开 Unity Hub,创建一个新项目(选择 3D 模板)。
    2. 在层级视图中,右键创建一个 3D 对象 -> 立方体
    3. 在场景视图中移动、旋转、缩放这个立方体。
    4. 再创建一个 3D 对象 -> 平面,作为地面。
    5. 创建一个 主摄像机,调整其位置,使其能俯瞰场景。
    6. 创建一个 方向光,照亮场景。
    7. 点击顶部的播放按钮,预览你的场景。

实例 2:让物体动起来

  • 目标:编写第一个 C# 脚本,让立方体在场景中旋转。

  • 核心概念

    • 组件:附加在游戏对象上,赋予对象特定功能的模块。Transform(变换)、Mesh Renderer(网格渲染器)。
    • 脚本:用 C# 编写的组件,用于定义游戏逻辑。
    • MonoBehaviour:所有 Unity 脚本的基类,继承它才能让脚本在 Unity 中正常工作。
    • Start()Update()Start() 在游戏开始时执行一次,Update() 每一帧都执行一次,是处理游戏逻辑的主要方法。
  • 操作步骤

    Unity3D实例教程如何快速入门?-图2
    (图片来源网络,侵删)
    1. 在项目视图中,右键创建一个 C# 脚本,命名为 CubeRotator

    2. 双击脚本,用 Visual Studio 或 Rider 打开它。

    3. 编写以下代码:

      using UnityEngine;
      public class CubeRotator : MonoBehaviour
      {
          // Start is called before the first frame update
          void Start()
          {
              Debug.Log("立方体开始旋转了!");
          }
          // Update is called once per frame
          void Update()
          {
              // 每一帧都让立方体绕 Y 轴旋转 1 度
              transform.Rotate(0, 1, 0);
          }
      }
    4. 回到 Unity,将 CubeRotator 脚本拖拽到场景中的立方体游戏对象上。

      Unity3D实例教程如何快速入门?-图3
      (图片来源网络,侵删)
    5. 点击播放,你会看到立方体开始旋转,在检查器视图中,你还可以调整旋转速度。


第二部分:核心机制探索 (解锁技能)

掌握了基础后,我们来学习游戏开发中最常用的几个核心系统。

实例 3:玩家控制与物理

  • 目标:创建一个可以用键盘(WASD 或方向键)控制的玩家小球,并让它能与地面发生物理碰撞。

  • 核心概念

    • 刚体:组件,使游戏对象受物理引擎影响,如重力、碰撞、力。
    • 碰撞器:组件,定义对象的物理形状,用于检测碰撞。
    • 输入管理Input 类,用于获取键盘、鼠标、手柄等输入。
    • 力与速度:通过 rigidbody.AddForce() 或直接修改 rigidbody.velocity 来移动物体。
  • 操作步骤

    1. 创建一个 3D 对象 -> 球体,作为玩家。

    2. 选中球体,在检查器中点击 添加组件,搜索并添加 刚体

    3. 创建一个 3D 对象 -> 平面 作为地面,确保它有碰撞器(默认自带)。

    4. 创建一个新的 C# 脚本 PlayerController,编写代码:

      using UnityEngine;
      public class PlayerController : MonoBehaviour
      {
          public float speed = 5f;
          private Rigidbody rb;
          void Start()
          {
              rb = GetComponent<Rigidbody>();
          }
          void FixedUpdate()
          {
              // FixedUpdate 适合处理物理
              float moveHorizontal = Input.GetAxis("Horizontal"); // A/D 或 左/右方向键
              float moveVertical = Input.GetAxis("Vertical");   // W/S 或 上/下方向键
              Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);
              rb.AddForce(movement * speed);
          }
      }
    5. PlayerController 脚本拖拽到玩家球体上。

    6. 点击播放,现在你可以用键盘控制小球在平面上滚动了。

实例 4:碰撞检测与交互

  • 目标:当玩家小球碰到一个带有“收集品”标签的物体时,该物体消失,并在控制台打印信息。

  • 核心概念

    • 碰撞事件OnCollisionEnter()OnCollisionStay()OnCollisionExit(),用于处理两个刚体发生碰撞的事件。
    • 用于给游戏对象分类,方便在代码中进行识别。
  • 操作步骤

    1. 创建一个新的 3D 对象 -> 立方体,作为收集品。

    2. 在层级视图中选中这个立方体,在检查器的顶部 Tag 下拉菜单中,选择 Add Tag...,创建一个新标签 Collectible,然后选中这个立方体,将其标签设置为 Collectible

    3. 创建一个新的 C# 脚本 CollectibleItem,编写代码:

      using UnityEngine;
      public class CollectibleItem : MonoBehaviour
      {
          void OnCollisionEnter(Collision collision)
          {
              // 检查碰撞到的物体是否带有 "Player" 标签
              if (collision.gameObject.CompareTag("Player"))
              {
                  Debug.Log("你收集了一个物品!");
                  // 销毁当前物体(收集品)
                  Destroy(gameObject);
              }
          }
      }
    4. CollectibleItem 脚本拖拽到收集品立方体上。

    5. 确保玩家球体有 Player 标签(如果没有,可以像创建 Collectible 一样创建)。

    6. 点击播放,控制小球去碰撞立方体,观察控制台输出和立方体的消失。

实例 5:用户界面

  • 目标:在屏幕上创建一个计分板,显示当前收集到的物品数量。

  • 核心概念

    • Canvas:UI 的画布,所有 UI 元素都必须放在 Canvas 下。
    • Text - TextMeshPro:用于显示文本的 UI 元素(推荐使用,比旧的 Text 功能更强)。
    • 脚本管理全局状态:创建一个 GameManager 脚本来管理分数等全局数据。
  • 操作步骤

    1. 在层级视图中右键,选择 UI -> Canvas,这会自动创建一个 Canvas 和一个 EventSystem。

    2. 在 Canvas 下右键,选择 UI -> Text - TextMeshPro,这会自动创建一个 TextMeshPro 对象。

    3. 调整 Text 对象的位置和大小,在检查器中修改其文本内容,"Score: 0"。

    4. 创建一个新的 C# 脚本 GameManager

      using UnityEngine;
      using TMPro; // 引入 TextMeshPro 命名空间
      public class GameManager : MonoBehaviour
      {
          public static GameManager instance; // 单例模式,方便其他脚本访问
          public int score = 0;
          public TextMeshProUGUI scoreText; // 在检查器中拖拽赋值
          void Awake()
          {
              if (instance == null)
                  instance = this;
              else
                  Destroy(gameObject);
          }
          public void AddScore(int amount)
          {
              score += amount;
              scoreText.text = "Score: " + score;
          }
      }
    5. GameManager 脚本拖拽到场景中(比如一个空的游戏对象上)。

    6. 选中 GameManager 对象,在检查器中找到 Score Text 字段,将场景中的 TextMeshPro 对象拖拽进去。

    7. 修改 CollectibleItem 脚本,当被收集时调用 GameManager

      // 在 CollectibleItem.cs 中
      using UnityEngine;
      public class CollectibleItem : MonoBehaviour
      {
          void OnCollisionEnter(Collision collision)
          {
              if (collision.gameObject.CompareTag("Player"))
              {
                  Debug.Log("你收集了一个物品!");
                  // 调用 GameManager 的 AddScore 方法
                  GameManager.instance.AddScore(10); // 每个物品加10分
                  Destroy(gameObject);
              }
          }
      }
    8. 点击播放,当你收集物品时,屏幕上的分数会更新。


第三部分:项目实战 (小试牛刀)

将学到的知识整合起来,完成一个简单但完整的小游戏。

项目:简单的 3D 收集游戏

游戏设计

  • 玩家控制一个球体。
  • 场景中随机分布着一些金色的收集品(立方体)。
  • 收集所有物品后,显示胜利信息。

实现步骤

  1. 场景搭建:创建一个较大的平面作为地面,放置玩家球体。

  2. 生成收集品

    • 创建一个空的 GameObject,命名为 SpawnManager
    • 创建一个 C# 脚本 SpawnManager,用于在场景中随机生成多个收集品。
      // SpawnManager.cs
      using UnityEngine;
      using System.Collections.Generic;

    public class SpawnManager : MonoBehaviour { public GameObject collectiblePrefab; public int numberOfCollectibles = 10; public Vector3 spawnAreaSize = new Vector3(20, 0, 20);

    void Start()
    {
        for (int i = 0; i < numberOfCollectibles; i++)
        {
            Vector3 randomPosition = new Vector3(
                Random.Range(-spawnAreaSize.x / 2, spawnAreaSize.x / 2),
                0.5f, // 稍微抬高一点,避免陷入地面
                Random.Range(-spawnAreaSize.z / 2, spawnAreaSize.z / 2)
            );
            Instantiate(collectiblePrefab, randomPosition, Quaternion.identity);
        }
    }
    
    *   将你的收集品预制体(先创建一个收集品,从层级视图拖拽到项目视图,就变成了预制体)拖拽到 `SpawnManager` 脚件的 `Collectible Prefab` 字段。
  3. 胜利条件

    • 修改 GameManager,添加一个检查胜利的方法。

      // GameManager.cs
      public class GameManager : MonoBehaviour
      {
      // ... 其他代码 ...
      public void AddScore(int amount)
      {
          score += amount;
          scoreText.text = "Score: " + score;
          CheckWinCondition();
      }
      void CheckWinCondition()
      {
          // 假设总共有10个物品
          if (score >= 10 * 10) // 因为每个10分
          {
              Debug.Log("恭喜你赢了!");
              // 可以在这里显示一个胜利的UI文本
          }
      }
      }
  4. 完成与优化:运行游戏,测试流程,你可以添加音效、粒子特效(当收集时)、更美观的材质和光照,让游戏更完善。


第四部分:进阶方向与学习资源

当你掌握了基础后,可以探索更广阔的领域。

进阶学习方向

  • 动画系统:学习使用 Animator 控制角色动画,如行走、攻击。
  • UI 系统:深入学习 UI,如按钮、滑块、生命条、主菜单等。
  • 场景管理:学习如何加载和卸载不同的场景(如从主菜单进入游戏)。
  • 寻路系统:让 AI 角色能够智能地在地图上移动。
  • Shader Graph:通过可视化节点创建自定义的材质和着色器,无需编写代码。
  • 性能优化:学习 Profiler 分析性能,优化 Draw Call、内存使用等。
  • VR/AR 开发:利用 Unity 的 XR Interaction Toolkit 开发虚拟现实或增强现实应用。

优质学习资源

  1. 官方资源

  2. 视频教程

    • Brackeys (YouTube): 虽然已停止更新,但留下了大量经典、通俗易懂的入门教程,是很多人的启蒙老师。
    • Sebastian Lague (YouTube): 专注于算法、程序化生成和高质量游戏设计,内容非常有深度。
    • Code Monkey (YouTube): 提供大量实用的 C# 编程和 Unity 功能实现教程。
    • B站/YouTube: 搜索 "Unity 教程",有大量国内外的优秀 UP 主持续更新内容。
  3. 社区与问答

学习建议

  • 动手实践:看十遍不如自己做一遍,跟着教程做,然后尝试自己修改、添加新功能。
  • 多看优秀项目:在 Unity Asset Store、GitHub、Itch.io 上看别人的开源项目和游戏,学习他们的实现思路。
  • 不要怕犯错:调试是编程的一部分,学会看错误信息、使用 Debug.Log 是必备技能。
  • 从小开始:不要一开始就想做 3A 大作,先从克隆经典小游戏(如 Pong, Flappy Bird)开始,逐步建立信心。

祝你在 Unity 的世界里探索愉快,创造出属于自己的精彩游戏!

分享:
扫描分享到社交APP
上一篇
下一篇