news 2026/7/17 14:17:31

【Unity】贪吃蛇-基础框架

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【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();//新增这一段代码 } } } }

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/14 14:05:42

java.lang.ClassNotFoundException: org.slf4j.Logger

java.lang.ClassNotFoundException: org.slf4j.Logger本来还好好的&#xff0c;找了半天&#xff0c;原来是没编译过去&#xff0c;我的天哪&#xff01;&#xff01;&#xff01;编译好几次&#xff0c;重启eclipse&#xff0c;刷新工程&#xff0c;maven&#xff0c;update p…

作者头像 李华
网站建设 2026/7/14 14:05:54

数字内容访问革命:3步掌握付费墙绕过技术

数字内容访问革命&#xff1a;3步掌握付费墙绕过技术 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 在当今信息爆炸的时代&#xff0c;付费墙已成为优质内容获取的主要障碍。Bypass …

作者头像 李华
网站建设 2026/7/14 14:05:42

嘎嘎降AI和率零哪个好用?200块实测两款降AI工具结果出来了

嘎嘎降AI和率零哪个好用&#xff1f;200块实测两款降AI工具结果出来了 最近写论文用了DeepSeek帮忙整理框架和部分段落&#xff0c;结果拿去查了一下AIGC检测&#xff0c;知网直接给了62.7%的AI率。说实话看到这个数字的时候心里一凉&#xff0c;离答辩还有不到一个月&#xf…

作者头像 李华
网站建设 2026/7/14 14:05:43

利用Spring Boot构建高效文学名著共享平台的技术实践

1. 为什么选择Spring Boot构建文学共享平台 第一次接触文学名著共享平台的需求时&#xff0c;我脑海中闪过的第一个念头就是&#xff1a;这玩意儿得扛得住高并发啊&#xff01;想象一下《红楼梦》新版本上线时&#xff0c;成千上万书迷同时涌入的场景&#xff0c;传统Java EE架…

作者头像 李华