Unity3D 小案例 像素贪吃蛇 03 蛇的碰撞

Unity3D 小案例 像素贪吃蛇 第三期 蛇的碰撞(完结)

像素贪吃蛇

碰撞蛇身

当蛇头碰撞到蛇身时,游戏应该判定为失败。

找到蛇身预制体,添加 Body 标签和碰撞体,碰撞体的大小为 0.5,跟蛇头和蛇身的碰撞体范围一样,避免因碰撞范围过大而产生错误的碰撞效果。

添加蛇身标签

修改一下 OnTriggerEnter2D 方法,判断碰撞到 Body 标签的物体,判定游戏失败,蛇停止移动。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Snake : MonoBehaviour
{void OnTriggerEnter2D(Collider2D other){if (other.CompareTag("Food")){// ...}else if (other.CompareTag("Body")){// 取消定时器CancelInvoke(nameof(Move));}}
}

如果此时运行游戏,会发现蛇一开始就不动了。因为之前初始生成身体时,都在同一个位置生成,一开始就会碰撞蛇身。

修改一下之前的逻辑,让初始生成的蛇身偏移位置。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Snake : MonoBehaviour
{Vector2 initPos;  // 初始位置void Start(){initPos = transform.position;// 初始生成身体for (int i = 0; i < initBodyCount; i++){GenerateBody(true);}// ...}void GenerateBody(bool isInit = false){GameObject obj = Instantiate(body);// 初始生成if (isInit){obj.transform.position = initPos + Vector2.left;initPos = obj.transform.position;}else{// 已有身体if (bodyList.Count > 0){// 获取最后一个身体,在它的位置生成GameObject lastBody = bodyList[bodyList.Count - 1];obj.transform.position = lastBody.transform.position;}// 没有身体else{// 以蛇头的位置生成身体obj.transform.position = transform.position;}}// ...}
}

现在运行游戏,蛇身的初始位置就不会跟蛇头重叠了。

初始位置

另外,蛇头的层级也要调整一下,当蛇头与蛇身重叠时,让蛇头能够显示在蛇身之上。

调整层级

运行效果:

蛇头碰撞蛇身

添加墙壁

创建四个正方形,调整缩放和位置,调整颜色,分别布置在上下左右四个方向。

因为蛇的移动范围,在 X 轴是 [-8, 8],在 Y 轴是 [-4, 4],所以左右的墙壁分别放置在 X 轴的 -9 和 9 的位置,上下的墙壁分别放置在 Y 轴的 5 和 -5 的位置。

布置墙壁

然后给墙壁也添加标签 Wall,并且要添加碰撞体,碰撞体的大小保持默认的 1 即可。

添加墙壁标签

在代码中也添加碰撞墙壁的逻辑。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Snake : MonoBehaviour
{void OnTriggerEnter2D(Collider2D other){if (other.CompareTag("Food")){// ...}else if (other.CompareTag("Body") || other.CompareTag("Wall")){// 取消定时器CancelInvoke(nameof(Move));}}
}

运行效果:

蛇头碰撞墙壁

游戏失败

显示失败界面

简单搭建一个游戏失败界面。

游戏失败界面

创建一个 UIGameOver.cs 脚本,引用命名空间 UnityEngine.UI,定义 UI 组件变量,拖拽引用。

using UnityEngine;
using UnityEngine.UI;public class UIGameOver : MonoBehaviour
{public Button btnRestart;public CanvasGroup canvasGroup;void Start(){}
}

拖拽引用

创建一个 GameManager.cs 脚本,引用命名空间 System,创建单例。

定义一个 Action 事件 showGameOver,带一个布尔值参数,并对外提供一个接口,用于触发事件。

using System;
using UnityEngine;public class GameManager : MonoBehaviour
{public static GameManager instance;public event Action<bool> showGameOver;void Awake(){if (instance == null){instance = this;}else{Destroy(gameObject);}}public void TriggerGameOver(bool isShow){showGameOver.Invoke(isShow);}
}

界面脚本添加事件监听,根据是否显示界面,修改 canvasGroup 的参数。

using UnityEngine;
using UnityEngine.UI;public class UIGameOver : MonoBehaviour
{public Button btnRestart;public CanvasGroup canvasGroup;void Start(){GameManager.instance.showGameOver += (isShow) =>{canvasGroup.alpha = isShow ? 1 : 0;canvasGroup.blocksRaycasts = isShow;};}
}

当蛇碰撞时,触发事件显示游戏失败界面。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Snake : MonoBehaviour
{void OnTriggerEnter2D(Collider2D other){if (other.CompareTag("Food")){// ...}else if (other.CompareTag("Body") || other.CompareTag("Wall")){// 取消定时器CancelInvoke(nameof(Move));// 显示游戏失败界面GameManager.instance.TriggerGameOver(true);}}
}

运行效果:

显示游戏失败

重开游戏

UIGameOver.cs 脚本上添加按钮事件,隐藏失败界面,重新开始游戏。

using UnityEngine;
using UnityEngine.UI;public class UIGameOver : MonoBehaviour
{public Button btnRestart;public CanvasGroup canvasGroup;void Start(){// ...btnRestart.onClick.AddListener(()=>{GameManager.instance.TriggerGameOver(false);GameManager.instance.RestartGame();});}
}

GameManager.cs 脚本上添加重开游戏的事件和触发接口。

using System;
using UnityEngine;public class GameManager : MonoBehaviour
{//...public event Action restartGame;// ...public void RestartGame(){restartGame.Invoke();}
}

FoodManager.cs 脚本上添加重置网格接口,同时定义一个变量记录当前生成的食物,在重置网格时销毁当前食物。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class FoodManager : MonoBehaviour
{// ...public GameObject currentFood;public void GenerateFood(){// ...currentFood = obj;}public void ResetGrid(){gridList.Clear();for (int i = 0; i < rowMax; i++){for (int j = 0; j < colMax; j++){gridList.Add(new Vector3(borderLeft + j, borderTop - i, 0));}}Destroy(currentFood);}
}

最后,在 Snake.cs 脚本上添加事件监听,重置网格、蛇头、蛇身、食物,最后再次开启定时器,让蛇头重新开始移动。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Snake : MonoBehaviour
{// ...void Start(){// ...// 重开游戏,重置游戏物体GameManager.instance.restartGame += ()=>{// 重置网格FoodManager.instance.ResetGrid();// 销毁蛇身for (int i = 0; i < bodyList.Count; i++){Destroy(bodyList[i]);}bodyList.Clear();// 重置蛇头位置和方向transform.position = Vector3.zero;FoodManager.instance.MarkGridList(transform.position, true);direction = Vector2.right;lastDirection = Vector2.right;firstDirection = Vector2.right;initPos = transform.position;// 初始生成身体for (int i = 0; i < initBodyCount; i++){GenerateBody(true);}// 初始生成食物FoodManager.instance.GenerateFood();// 重新开始移动InvokeRepeating(nameof(Move), time, time);};}
}

运行效果:

重开游戏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/54763.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AlDente Pro for Mac电池健康保护工具

AlDente Pro for Mac 是一款适用于 Mac 的实用电池健康保护工具。以下是它的主要特点和优势&#xff1a; 软件下载地址 一、保护电池寿命的原理 锂离子和聚合物电池&#xff08;如 Mac 笔记本中的电池&#xff09;在 30% 到 80% 之间运行时使用寿命最长。始终将电池电量保持…

Windows 10 on ARM, version 22H2 (updated Aug 2024) ARM64 AArch64 中文版、英文版下载

Windows 10 on ARM, version 22H2 (updated Aug 2024) ARM64 AArch64 中文版、英文版下载 基于 ARM 的 Windows 10 请访问原文链接&#xff1a;https://sysin.org/blog/windows-10-arm/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;s…

【VUE3.0】动手做一套像素风的前端UI组件库---Message

目录 引言自己整一个UI设计稿代码编写1. 设计信息窗口基础样式2. 设置打开和关闭的方法3. 编写实例化组件的js文件4. 看下最终效果5. 组件完整代码6. 组件调用方式 总结 引言 本教程基于前端UI样式库 NES.css 的UI设计&#xff0c;自行研究复现。欢迎大家交流优化实现方法~ 此次…

《线性代数》学渣笔记

文章目录 1 行列式1.1 克拉默法则1.2 基本性质1.3 余子式 M i j M_{ij} Mij​1.4 代数余子式 A i j ( − 1 ) i j ⋅ M i j A_{ij} (-1)^{ij} \cdot M_{ij} Aij​(−1)ij⋅Mij​1.5 具体型行列式计算&#xff08;化为基本型&#xff09;1.5.1 主对角线行列式&#xff1a;主…

基于数据挖掘的航空客户满意度分析预测系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 航空公司致力于提供多样化的服务以满足乘客需求&#xff0c;包括但不限于提供免费无线网络、免费食物饮品、提供网上预约服务、飞机出口位置、座椅舒适度、卫生状况等&#xff0c;并希望以此提升乘…

SQL面试常见题目

SQL面试常见题目涉及多个方面&#xff0c;包括数据查询、数据操作、表的设计与优化等。以下列举一些经典的SQL面试题目&#xff0c;并附上解析答案&#xff1a; 1. 查询一张表中重复的数据 题目&#xff1a; 给定一个表 employees&#xff0c;包含 id, name, salary 列。如何…

SpringBoot框架之KOB项目 - 配置Mysql与注册登录模块(中)

修改Spring Security 登录验证模式 传统的验证登录模式 公开页面&#xff1a;输入url就可以直接访问授权页面&#xff1a;登录之后才可以访问 Jwt验证模式 容易实现跨域不需要在服务器端存储 对比于传统模式将所有的sessionId换成jwt token access token refresh token 过…

分发饼干00

题目链接 分发饼干 题目描述 注意点 1 < g[i], s[j] < 2^31 - 1目标是满足尽可能多的孩子&#xff0c;并输出这个最大数值 解答思路 可以先将饼干和孩子的胃口都按升序进行排序&#xff0c;随后根据双指针 贪心&#xff0c;将当前满足孩子胃口的最小饼干分配给该孩…

Android开发高频面试题之——Android篇

Android开发高频面试题之——Android篇 Android开发高频面试题之——Java基础篇 Android开发高频面试题之——Kotlin基础篇 Android开发高频面试题之——Android基础篇 1. Activity启动模式 standard 标准模式,每次都是新建Activity实例。singleTop 栈顶复用。如果要启动的A…

关于预处理的一系列问题

1. 预定义符号 C语⾔设置了⼀些预定义符号&#xff0c;可以直接使⽤&#xff0c;预定义符号也是在预处理期间处理的。 2. #define定义常量 #define name stuff 如果定义的 stuff过⻓&#xff0c;可以分成⼏⾏写&#xff0c;除了最后⼀⾏外&#xff0c;每⾏的后⾯都加⼀个反…

win10下使用docker、k8s部署java应用

在上一篇文章 Windows10上Docker和Kubernetes的安装 中&#xff0c;已经介绍了在 Windows10上安装Docker和Kubernetes &#xff0c;有了这个环境基础之后&#xff0c;就可以用来部署服务了 在项目目录下新建Dockfile文件&#xff0c;内容如下&#xff08;请根据实际情况调整&am…

前端——阿里图标的使用

阿里图标 将小图标定义成字体&#xff0c;通过引入字体的方式来展示这些图标 1.打开阿里图标库 https://www.iconfont.cn/ 2.登录 / 注册一个账号 3.选中你需要使用的图标 并且把它加入购物车 4.全部选择完之后 点击右上角 购物车 然后下载代码 5.解压后你下载的文…

Web+Mysql——MyBatis

MyBatis 目标 能够完成Mybatis代理方式查询数据能够理解Mybatis核心配置文件的配置 1&#xff0c;Mybatis 1.1 Mybatis概述 1.1.1 Mybatis概念 MyBatis 是一款优秀的持久层框架&#xff0c;用于简化 JDBC 开发 MyBatis 本是 Apache 的一个开源项目iBatis, 2010年这个项目由…

面试面经|大模型算法岗常见面试题100道

本文提供了一份全面的大模型算法岗位面试题清单&#xff0c;包括基础理论、模型结构、训练微调策略、应用框架、分布式训练和模型推理等方面的知识点&#xff0c;旨在帮助求职者准备相关技术面试。 一、基础篇 1、目前主流的开源模型体系有哪些&#xff1f; Transformer体系&a…

neo4j(spring) 使用示例

文章目录 前言一、neo4j是什么二、开始编码1. yml 配置2. crud 测试3. node relation 与java中对象的关系4. 编码测试 总结 前言 图数据库先驱者 neo4j&#xff1a;neo4j官网地址 可以选择桌面版安装等多种方式,我这里采用的是docker安装 直接执行docker安装命令: docker run…

zabbix“专家坐诊”第256期问答

原作者&#xff1a;乐维社区 原文链接&#xff1a;https://forum.lwops.cn/questions 问题一 Q&#xff1a;zabbix 6.4.18版本的&#xff0c;使用zabbix_agentd2监控mysql数据库&#xff0c;只能在界面配置mysql的相关信息吗&#xff1f;这个在zabbix表里面是明文存储的&#x…

力扣反转链表系列【25. K 个一组翻转链表】——由易到难,一次刷通!!!

力扣《反转链表》系列文章目录 刷题次序&#xff0c;由易到难&#xff0c;一次刷通&#xff01;&#xff01;&#xff01; 题目题解206. 反转链表反转链表的全部 题解192. 反转链表 II反转链表的指定段 题解224. 两两交换链表中的节点两个一组反转链表 题解325. K 个一组翻转…

在python爬虫中xpath方式提取lxml.etree._ElementUnicodeResult转化为字符串str类型

简单提取网页中的数据时发现的 当通过xpath方式提取出需要的数据的text文本后想要转为字符串&#xff0c;但出现lxml.etree._ElementUnicodeResult的数据类型不能序列化&#xff0c;在网上查找到很多说是编码问题Unicode编码然后解码什么的&#xff1b;有些是(导入的xml库而不…

Java : 图书管理系统

图书管理系统的作用&#xff1a; 高效的图书管理 图书管理系统通过自动化管理&#xff0c;实现了图书的采编、编目、流通管理等操作的自动化处理&#xff0c;大大提高了图书管理的效率和准确性。 工作人员可以通过系统快速查找图书信息&#xff0c;实时掌握图书的借还情况&…

【Java】Java中接口与内部类详解

目录 引言 一、接口&#xff08;Interface&#xff09; 1.1 接口的定义 1.1.1 接口的特点 1.2 接口的实现 1.3 接口的继承 1.4 接口的注意事项 1.5 代码示例 二、内部类&#xff08;Inner Class&#xff09; 2.1 内部类特点 2.2 成员内部类 2.2.1 对象的创建 2.…