那天在咖啡厅看到邻座小哥用手机玩3D版的贪吃蛇,蛇身在立体迷宫里穿梭的样子特别酷。回家后我就琢磨着:用Unity做个这样的游戏到底有多难?结果发现比想象中简单!今天就把我的踩坑经验整理成保姆级教程,咱们一起用C做个会「立体漂移」的贪吃蛇。
一、开工前的三样准备
就像做菜要备齐食材,咱们先搞定这些:
- Unity Hub:选2021.3 LTS版本最稳当
- Visual Studio:记得勾选Unity开发套件
- 美术素材:在Asset Store搜「Low Poly Snake」有免费模型包
1.1 创建新项目的正确姿势
打开Unity后别急着点创建,注意这两个配置:
| 模板类型 | 3D核心模板 |
| 渲染管线 | 选Built-in就好 |
二、搭建游戏舞台
好的场景是成功的一半,咱们先来布置3D舞台。
2.1 给地板加点料
在层级窗口右键创建3D Object -> Plane,然后这么设置:
- 缩放Scale改成(10,1,10)
- 材质换成蓝白棋盘格
- 加个Box Collider组件
这时候运行场景,应该能看到20x20的棋盘地面。要是觉得单调,可以加几个悬浮的平台——按住Ctrl+D复制地板,把Y坐标调到3,马上就有立体迷宫的感觉了!
2.2 蛇的诞生记
把下载的蛇头模型拖进场景,添加刚体组件时注意勾选Is Kinematic,这样它才不会乱滚。然后新建SnakeController.cs脚本,先写个移动逻辑:

public class SnakeController : MonoBehaviour {public float moveSpeed = 5f;private Vector3 targetDirection;void Update {if (Input.GetKey(KeyCode.W)) targetDirection = Vector3.forward;if (Input.GetKey(KeyCode.S)) targetDirection = Vector3.back;if (Input.GetKey(KeyCode.A)) targetDirection = Vector3.left;if (Input.GetKey(KeyCode.D)) targetDirection = Vector3.right;transform.Translate(targetDirection moveSpeed Time.deltaTime);这时候按WASD,蛇头应该能在地面滑动了。不过你会发现它不会「拐弯」,这个问题咱们后面解决。
三、贪吃蛇的灵魂功能
现在要让这条蛇能吃东西、会变长,这才是贪吃蛇的精髓。
3.1 苹果生成术
在场景里创建红色球体作为苹果,给它添加标签Food。然后写个生成器脚本:
public class FoodSpawner : MonoBehaviour {public GameObject foodPrefab;public Vector3 spawnArea;void SpawnNewFood {Vector3 randomPos = new Vector3(Random.Range(-spawnArea.x, spawnArea.x),0.5f,Random.Range(-spawnArea.z, spawnArea.z));Instantiate(foodPrefab, randomPos, Quaternion.identity);把生成区域设为(9,0,9),这样苹果就不会出现在边界外。记得在蛇的碰撞检测里调用生成方法,吃完一个马上刷新的苹果。
3.2 蛇身变长秘籍
这里有个小技巧:用队列保存蛇身关节的位置。每次移动时:
- 记录头部新位置
- 移除队列最后一个元素
- 在头部插入新位置
- 吃苹果时直接添加新位置
具体实现代码:
private QueuebodyPositions = new Queue ;public GameObject bodyPrefab;void GrowSnake {Vector3 newBodyPos = bodyPositions.Last;Instantiate(bodyPrefab, newBodyPos, Quaternion.transform);bodyPositions.Enqueue(newBodyPos);
四、让游戏更带感的三个技巧
基础功能完成后,加点料让游戏更好玩:
- 死亡机制:检测蛇头与身体的碰撞
- 动态难度:每吃5个苹果加速10%
- 镜头跟随:给主摄像机加平滑跟随脚本
推荐参考《Unity游戏开发实战》里的摄像机控制章节,里面有详细的参数调节技巧。比如这个跟随代码:
public class CameraFollow : MonoBehaviour {public Transform target;public float smoothTime = 0.3f;private Vector3 velocity = Vector3.zero;void LateUpdate {Vector3 targetPosition = target.position + new Vector3(0,5,-10);transform.position = Vector3.SmoothDamp(transform.position, targetPosition, ref velocity, smoothTime);五、调试时的救命锦囊
开发过程中肯定会遇到这些坑:
| 问题现象 | 解决办法 |
| 蛇身抖动 | 把Fixed Timestep改为0.016 |
| 穿墙而过 | 检查碰撞器的Is Trigger设置 |
| 苹果卡墙里 | 生成时用Physics.CheckSphere检测空间 |
记得多使用Debug.DrawRay来可视化移动方向,这个技巧帮我省了至少3小时调试时间。
最后的小彩蛋
试着在Update方法里加这句代码,能让蛇身像霓虹灯一样闪烁:
GetComponent.material.color = Color.HSVToRGB(Mathf.PingPong(Time.time, 1), 1, 1);
窗外的天色渐渐暗下来,屏幕里的贪吃蛇正在立体迷宫里灵巧穿梭。保存工程文件时,突然想起忘记做暂停功能——看来今晚又要和Unity继续约会了。不过这就是游戏开发的魅力啊,不是吗?