玩游戏不如做游戏。今天带你从零开始,用Unity开发一款可玩的“星星收集者”,顺便学会C#编程基础。
👋 你好,我是 Evan,一名计算机专业的学长,也是《大一突围》专栏的作者。大一时我沉迷游戏,后来想:与其被动玩,不如主动做。于是自学Unity,花两周做出了第一个小游戏。那种“我的代码创造了世界”的成就感,比通关任何3A大作都爽。今天,我就把这套方法教给你——不需要游戏开发经验,只要会一点编程基础,就能跟着做出一个能玩的小游戏。你会发现,游戏和编程本就是天生一对。
欢迎来到《大一突围》专栏。
一、为什么大一就要尝试做游戏?
即时正反馈:你改一个数字,游戏里角色就跑得更快,这种刺激让你愿意持续优化。
综合能力锻炼:涉及逻辑、数学、美术(至少布局)、音效、用户体验。
作品集杀手锏:一份能玩的游戏,比10个控制台项目更让面试官记住你。
二、准备:安装Unity并创建第一个项目
2.1 下载并安装Unity Hub
访问 unity.com/cn,下载Unity Hub。
在Hub中安装Unity 2022 LTS版本(长期支持版,稳定)。
安装时勾选Windows Build Support(如果使用Mac则选Mac)和Visual Studio(或VS Code)组件。
2.2 创建新项目
打开Unity Hub →New project→ 选择2D Core(我们做2D游戏更简单)。
项目名称:
StarCollector位置:自己记住的文件夹
点击Create project
界面速览:
Scene视图:摆放游戏物体的工作区。
Game视图:运行时看到的画面。
Hierarchy:场景中所有物体列表。
Inspector:选中物体的属性面板。
Project:项目文件(脚本、素材等)。
💡 首次打开可能需要编译,耐心等待。
三、游戏设计:星星收集者
游戏玩法
玩家控制一个小球(Player)在场景中移动。
场景中随机生成若干星星(Star),触碰星星则得分,星星消失并重生到新位置。
显示当前得分。
加上一个倒计时(60秒),时间到显示最终分数。
核心知识点
玩家移动(通过键盘方向键/WASD)。
碰撞检测(触发器)。
UI 文本更新(得分、倒计时)。
随机生成位置。
游戏循环(Update、FixedUpdate、协程)。
四、搭建游戏场景(一步一步截图说明,这里用文字+图示)
4.1 创建玩家(Player)
在Hierarchy右键 →2D Object→Sprites→Circle,命名为
Player。在Inspector中设置Transform的 Position 为 (0, 0, 0)。
添加Rigidbody 2D组件(用于物理移动):
点击
Player→Add Component→Rigidbody 2D将Body Type设为
Dynamic将Linear Drag设为
2(让移动有摩擦力,不会一直滑)将Gravity Scale设为
0(不要受重力影响)
添加Circle Collider 2D组件(用于碰撞检测):
点击
Player→Add Component→Circle Collider 2D勾选
Is Trigger?不,我们想要物理碰撞,所以不勾。但为了收集星星,星星的碰撞器要设为触发器。
4.2 创建星星(Star)
创建一个2D Object→Sprites→Star(如果默认没有星星形状,可用Square代替,稍后改颜色或贴图)。
命名为
Star。添加Circle Collider 2D(或 Box Collider 2D),勾选
Is Trigger,这样玩家碰到它不会物理反弹,而是触发事件。将星星做成Prefab(预制体):将
Star从 Hierarchy 拖拽到 Project 窗口中的文件夹(例如新建Prefabs文件夹)。然后删掉场景中的星星,我们稍后用代码生成多个。
4.3 创建地面(边界墙壁)
为了让玩家不跑出屏幕,我们创建四面墙壁:
创建四个2D Object→Sprites→Square,分别命名为
WallTop、WallBottom、WallLeft、WallRight。调整它们的 Transform:
位置:根据 Camera 视图(默认Camera是正交,大小5,意味着屏幕高度10单位,宽度取决于分辨率)。简易做法:设置墙壁厚度0.5,长度足够。
建议:Top 墙位置 (0, 5.5),Scale (12, 0.5);Bottom 墙 (0, -5.5);Left 墙 (-6.5, 0),Scale (0.5, 11);Right 墙 (6.5, 0)。
给每个墙壁添加Box Collider 2D(不要勾选 Is Trigger),使玩家无法穿过。
也可以采用另一种方法:给玩家添加移动范围限制代码,但墙壁更直观。
4.4 UI 文本(得分和倒计时)
右键 Hierarchy →UI→Text - TextMeshPro(如果没有TMP,Unity会提示导入,同意即可)。
命名为
ScoreText,设置位置左上角(例如 -300, 200)。复制一个,命名为
TimerText,放在右上角。在 Inspector 中可调节字体大小、颜色。
五、编写脚本(核心代码,有详细注释)
5.1 玩家移动脚本PlayerController.cs
在 Project 窗口中右键 →Create→C# Script,命名PlayerController,双击打开(Visual Studio)。
using UnityEngine; public class PlayerController : MonoBehaviour { public float moveSpeed = 10f; // 移动速度 private Rigidbody2D rb; void Start() { rb = GetComponent<Rigidbody2D>(); } void Update() { // 获取输入(水平左右,垂直上下) float moveX = Input.GetAxisRaw("Horizontal"); float moveY = Input.GetAxisRaw("Vertical"); // 移动方向向量 Vector2 moveDirection = new Vector2(moveX, moveY).normalized; rb.velocity = moveDirection * moveSpeed; } }将这个脚本拖拽到Player物体上。运行游戏,应该能用方向键移动了。
5.2 星星收集脚本Star.cs
创建脚本Star,挂载到Star预制体上。
using UnityEngine; public class Star : MonoBehaviour { // 当玩家进入触发器时调用 private void OnTriggerEnter2D(Collider2D other) { if (other.CompareTag("Player")) { // 通知 GameManager 增加分数 GameManager.Instance.AddScore(10); // 将星星移动到随机位置 Reposition(); } } void Reposition() { // 随机位置范围:X -5.5 到 5.5,Y -4.5 到 4.5(根据边界调整) float randomX = Random.Range(-5.5f, 5.5f); float randomY = Random.Range(-4.5f, 4.5f); transform.position = new Vector2(randomX, randomY); } }注意:需要给
Player添加Player标签(Inspector 中 Tag 下拉菜单选择 Player,如果不存在就 Add Tag)。
5.3 游戏管理器GameManager.cs
这个脚本负责分数、计时器、游戏结束等全局逻辑。创建脚本GameManager。
using UnityEngine; using UnityEngine.UI; // 使用 UI 需要引入 using TMPro; // TextMeshPro public class GameManager : MonoBehaviour { public static GameManager Instance; // 单例模式 public int score = 0; public float timeRemaining = 60f; // 倒计时60秒 public TMP_Text scoreText; public TMP_Text timerText; public GameObject gameOverPanel; // 游戏结束面板(稍后创建) private bool isGameOver = false; void Awake() { // 实现单例 if (Instance == null) Instance = this; else Destroy(gameObject); } void Start() { UpdateScoreUI(); UpdateTimerUI(); gameOverPanel.SetActive(false); } void Update() { if (isGameOver) return; // 倒计时逻辑 if (timeRemaining > 0) { timeRemaining -= Time.deltaTime; UpdateTimerUI(); } else { GameOver(); } } public void AddScore(int amount) { if (isGameOver) return; score += amount; UpdateScoreUI(); } void UpdateScoreUI() { scoreText.text = "得分: " + score; } void UpdateTimerUI() { // 显示整数秒 timerText.text = "时间: " + Mathf.CeilToInt(timeRemaining).ToString(); } void GameOver() { isGameOver = true; gameOverPanel.SetActive(true); // 停止玩家移动(通过查找玩家并禁用脚本) GameObject player = GameObject.FindGameObjectWithTag("Player"); if (player != null) player.GetComponent<PlayerController>().enabled = false; // 禁用所有星星的触发器(可选) // 显示最终分数在面板上 Text finalText = gameOverPanel.GetComponentInChildren<Text>(); if (finalText != null) finalText.text = "游戏结束!总分: " + score; Time.timeScale = 0; // 暂停游戏 } }在场景中创建一个空物体(GameObject → Create Empty),命名为GameManager,挂载此脚本。然后将ScoreText和TimerText从 Hierarchy 拖到脚本对应槽位。创建gameOverPanel:
在 Hierarchy 右键 → UI → Panel,命名为
GameOverPanel。在其下创建 Text 作为标题,以及一个 Button(Restart)。按钮功能我们先不实现复杂重启,可以简单显示分数。
将
GameOverPanel拖到脚本的gameOverPanel槽位,并在 Start 中 SetActive(false)。
5.4 生成多个星星
在GameManager中添加一个数组public GameObject starPrefab;和public int starCount = 10;,然后在Start中循环生成。
public GameObject starPrefab; public int starCount = 10; void Start() { // ... 原有代码 for (int i = 0; i < starCount; i++) { Instantiate(starPrefab, GetRandomPosition(), Quaternion.identity); } } Vector2 GetRandomPosition() { float x = Random.Range(-5.5f, 5.5f); float y = Random.Range(-4.5f, 4.5f); return new Vector2(x, y); }在 Inspector 中将Star预制体拖到starPrefab槽位,设置starCount为 10。
注意:星星的OnTriggerEnter2D中调用GameManager.Instance.AddScore(10);之前已经写了。需要确保星星预制体上挂载了Star脚本。
六、运行与调试
点击 Unity 编辑器顶部的Play按钮。
使用 WASD 或方向键控制小球移动,触碰星星会加分并跳转到随机位置。
倒计时结束后,游戏停止,显示结束面板。
常见问题:
玩家移动卡顿?调整
Linear Drag或者增加速度。星星穿墙?确保墙壁的 Collider 2D 没有勾选
Is Trigger。分数不增加?检查
Star脚本中other.CompareTag("Player")是否准确,且 Player 标签已设置。游戏结束后还能移动?
GameOver中已经禁用PlayerController,但如果有 Rigidbody 速度,还需设置rb.velocity = Vector2.zero。
七、让游戏更好玩:改进和扩展思路
具体改进建议:
计时器加速:随着时间减少,星星移动速度变快,或玩家速度变慢。
音效:收集星星时播放“叮”声。导入音频片段,使用
AudioSource.PlayClipAtPoint。粒子特效:收集星星时播放闪光粒子。
不同分值:金色星星+20,蓝色+5。
排行榜:保存最高分(PlayerPrefs)。
八、发布游戏给朋友玩
Build Settings:File → Build Settings → 点击
Add Open Scenes添加当前场景。选择平台(PC、Mac、WebGL等)。
点击Build,选择一个文件夹,生成可执行文件(.exe)或网页版。
发送给朋友,对方无需安装Unity即可运行。
九、总结与学习资源推荐
通过这个小游戏,你学会了:
Unity 2D 基础操作
Rigidbody2D 和碰撞器
触发器检测和游戏逻辑
UI 更新、单例模式、协程(虽然没有用,但可以扩展)
发布游戏
下一步学习资源:
Unity Learn 官方教程(免费)
Brackeys YouTube 频道(经典)
《Unity 实战》书籍
📌Evan 说:做游戏是学习编程最快乐的方式。当你看到朋友玩你做的游戏时,那份成就感会推着你不断深入。别怕代码报错,每个Bug都是你成长的机会。
❓ 问题:你想用Unity做什么类型的游戏?RPG、平台跳跃还是射击?或者在制作过程中遇到了什么奇葩Bug?欢迎在评论区分享,我会选出 3 位同学,送出《Unity 常用脚本片段合集》和《游戏设计脑图模板》。
📌如果本文点燃了你做游戏的热情,请点 👍 赞 + 关注,本专栏《大一突围》持续输出编程与游戏开发干货。
收藏本文,跟着步骤做出你的第一款游戏,然后分享给我玩!