当前位置: 首页 > news >正文

【Unity】贪吃蛇-基础框架

经典游戏,玩法就不用赘述了,从零开始拆解这个游戏的机制:

1、蛇头可以上下左右移动,蛇头在切换方向前会沿着上一个方向一直缓慢移动(初始默认一个方向)

2、随机出现可以“吃”的食物,蛇头在“吃”到食物后,会增加一个蛇身体。

3、蛇的身体会跟着蛇头的轨迹移动。

机制实现思路:

1、创建2D object - Sprite - Square 作为蛇头,添加Script脚本控制蛇头的移动

基础方案:InvokeRepeating

建议:使用nameof(方法名)代替直接写字符串"方法名",这样如果你重命名了方法,编译器会自动报错提醒,避免写错。

public float moveStep = 0.5f; // 初始移动间隔 void Start() { // 游戏开始 1 秒后移动,之后每隔 moveStep 秒移动一次 InvokeRepeating(nameof(Move), 1f, moveStep); } void Move() { // 这里写蛇头移动和身体跟随的逻辑 transform.position += direction; }

缺点:贪吃蛇吃到食物通常需要加速。但InvokeRepeating一旦启动,你无法在中途修改moveStep。你必须先CancelInvoke()再重新调用,这会导致移动节奏瞬间“断档”。

更好的替代方案:协程 (Coroutine)

这是现代 Unity 开发最推荐的方式,因为它支持动态调速,且逻辑连贯。

public float moveSpeed = 0.5f; void Start() { StartCoroutine(MovementRoutine()); } IEnumerator MovementRoutine() { while (true) { Move(); // 执行移动逻辑 // 等待一段时间后再进入下一次循环 yield return new WaitForSeconds(moveSpeed); } } // 吃到食物时直接修改 moveSpeed 变量,下一格移动就会自动变快 public void EatFood() { moveSpeed *= 0.9f; }

2、创建管理器,用于随机在屏幕视野内创建食物;

创建创建2D object - Sprite - Square 作为食物,添加碰撞检测的脚本

为了让碰撞生效,请检查以下三点:

  1. Collider 2D 设置:
    • 食物的BoxCollider2D必须勾选Is Trigger
    • 蛇头的BoxCollider2D也建议勾选Is Trigger
  2. Rigidbody 2D:
    • 蛇头必须挂载Rigidbody2D组件(否则无法检测触发)。
    • 将蛇头的Gravity Scale设为0
    • Collision Detection设为Continuous以防移动太快漏检。
  3. 标签 (Tag):
    • 在 Unity 编辑器中,点击蛇头,将它的Tag设置为"Player"
public class FoodController : MonoBehaviour { void OnTriggerEnter2D(Collider2D collision) { //1. 检测是不是蛇头 if (collision.CompareTag("Player")) { // 2. 获取蛇脚本并调用 AddBodys 方法 SnakeHeadController shc = collision.GetComponent<SnakeHeadController>(); if(shc != null) { shc.AddBodys(); Destroy(this.gameObject);//销毁食物 } } } }

在蛇头的控制类(SnakeHeadController)上添加AddBodys的方法

public void AddBodys() { GameObject newbody = Instantiate(bodyPrefab); newbody.transform.position = snakeBodys[snakeBodys.Count -1].position; snakeBodys.Add(newbody.transform); }

添加食物创建的管理类(单例模式)

public class FoodGenerateController : MonoBehaviour { public static FoodGenerateController Instance;//单例 public BoxCollider2D gridArea;//食物生成的边界 public GameObject foodPrefab;//食物的预制件 private void Awake() { // 确保场景中只有一个 Manager if (Instance == null) { Instance = this; } else { Destroy(gameObject); } } private void Start() { // 游戏开始时生成第一个食物 SpawnFood(); } public void SpawnFood() { float minX = gridArea.bounds.min.x; float minY = gridArea.bounds.min.y; float maxX = gridArea.bounds.max.x; float maxY = gridArea.bounds.max.y; // 随机坐标并对齐格子 float x = Mathf.Round(Random.Range(minX, maxX)); float y = Mathf.Round(Random.Range(minY, maxY)); // 进阶:这里可以加入“检查是否生在蛇身上”的逻辑 // 如果位置重叠,则重新执行 SpawnFood() Instantiate(foodPrefab, new Vector3(x, y, 0), Quaternion.identity); } private void OnDrawGizmos() {//绘制边界 可视化 if (gridArea != null) { Gizmos.color = Color.green; Gizmos.DrawWireCube(gridArea.bounds.center, gridArea.bounds.size); } }

在食物的控制类里调用单例生成下一个食物

public class FoodController : MonoBehaviour { void OnTriggerEnter2D(Collider2D collision) { if (collision.CompareTag("Player")) { SnakeHeadController shc = collision.GetComponent<SnakeHeadController>(); if(shc != null) { shc.AddBodys(); shc.SpeedUp();//吃完食物后,速度提升 Destroy(this.gameObject); FoodGenerateController.Instance.SpawnFood();//新增这一段代码 } } } }

至此,基础框架已经完成。

http://www.jsqmd.com/news/514828/

相关文章:

  • AIGlasses_for_navigation应用构建平台:基于Dify实现低代码导航AI工作流
  • 2026冶金高温高压工况磁翻板液位计推荐榜:氟利昂液位计/氟利昂液位计/氨水液位计/氨水液位计/氯气流量计/氯气流量计/选择指南 - 优质品牌商家
  • BEYOND REALITY Z-Image实际作品:无磨皮、无失真、保留毛孔纹理的高清人像
  • Pandownload与网盘直链下载助手深度测评:不限速与体验的全面对比
  • SEO_详解SEO核心关键词研究与布局策略
  • Qwen-Image定制镜像保姆级教程:RTX4090D+CUDA12.4环境搭建与Qwen-VL推理脚本详解
  • 2026年电爪品牌推荐,高精密夹持选型全攻略 - 品牌2026
  • 终极指南:如何在Linux上轻松安装Realtek 8852CE无线网卡驱动
  • 2026年新能源光伏领域优质螺母厂家指南:双头螺栓/国标螺栓/圆螺母/塔吊螺栓/外六角螺栓/尼龙螺母/开槽螺母/选择指南 - 优质品牌商家
  • 避坑指南:在CentOS 7上独立部署Apache Atlas 2.0,搞定Hadoop 3.1.1、Hive 3.1.0和HBase 2.2.2的版本兼容
  • labelCloud:3D点云标注的终极解决方案,快速生成高质量训练数据
  • 手把手教你用MATLAB实现一阶RC低通滤波器(附完整代码与避坑指南)
  • 半导体探针卡选购避坑指南:从MEMS技术到3D封装测试的5个关键指标
  • 为中文点赞,为汉字称好!世界上最美的文字,最方便的语言
  • Linux终端进度条实现原理与C语言工程实践
  • ARM架构演进图谱:从Cortex内核到旗舰芯片,看技术如何驱动产品落地
  • NSudo 终极权限管理工具:Windows系统管理员的高效利器
  • 隐私安全!本地离线部署Qwen3-4B写作大师,数据不出门
  • Z-Image-Turbo_UI界面场景应用:设计师、创作者必备,快速产出视觉内容
  • 蓝桥杯最大正方形 暴力法核心知识点+易错点总结
  • 零基础玩转Qwen2.5-7B:手把手教你用Docker部署大模型服务
  • 避坑指南:CasaOS安装Home Assistant ARM版常见错误及解决方案
  • STM32F103C8T6测频计进阶:从1Hz到72MHz的宽频捕获与OLED显示优化
  • 革新UI自动化:FlaUInspect智能元素探查工具的实战指南
  • 瓷泳系统门窗靠谱高性价比厂家排行榜:瓷泳系统窗一平方、瓷泳系统窗一方、瓷泳系统窗价格、瓷泳系统窗优点、瓷泳系统窗优点选择指南 - 优质品牌商家
  • 特殊字符输入器技术特点解析:472KB软件的设计思路与功能实现
  • Kimi-VL-A3B-Thinking一键部署:预置llm.log监控、自动加载检测与错误提示机制
  • Lychee-Rerank实战教程:使用自定义Instruction提升专业术语匹配精度
  • js手写——函数柯里化
  • JAVA同城预约服务预约理发系统源码支持小程序+公众号+H5