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,一经查实,立即删除!

相关文章

使用数据泵(Data Pump)迁移Oracle数据库数据

目的 将一个oracle数据库实例数据复制给另一个实例 注意事项 sqlplus&#xff08;即在本机linux环境下执行sql&#xff09;、expdp、impdp等命令一般需要切换到oracle用户才能执行 如果你当前是linux的root用户&#xff0c;请切换用户 su - oracle //一般在oracle账号下才能…

node节点使用:

节点&#xff1a; 1.返回父节点 parentNode let par li1.parentNodepar.style.border 1px solid red 2.获取所有子节点的集合 childNodes let nodes par.childNodes 3.第一个子节点 firstChild let frist par.firstChild 4.最后一个 lastChild let last par.lastC…

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

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

service 命令:管理系统服务

一、命令简介 ​service​ 命令是 Linux 系统中用于管理服务的工具&#xff0c;它通过调用位于 /etc/init.d/ ​目录下的服务脚本&#xff0c;来启动、停止、重启、查询状态等操作系统服务&#xff08;守护进程&#xff09;。service ​命令是一个便捷的 shell 脚本&#xff0…

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;自行研究复现。欢迎大家交流优化实现方法~ 此次…

深度学习(3):Tensor和Optimizer

文章目录 是什么Tensor1. Tensor 的基本概念2. 自动求导&#xff08;Autograd&#xff09;机制3. requires_grad 属性4. .data 和 .item()5. 梯度清零 Optimizer 是什么 Tensor&#xff08;张量&#xff09;&#xff1a;在 PyTorch 中&#xff0c;Tensor 是一种多维数组&#…

《线性代数》学渣笔记

文章目录 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 列。如何…

python基础题练习

1.可否定义一个sum函数呢&#xff1f;返回指定区间的值的和&#xff1f;例如&#xff0c;区间[1,4]的和为123410返回指定区间值的平方的和呢&#xff1f;立方呢&#xff1f; 代码&#xff1a; # 计算从start到end&#xff08;包括end&#xff09;的所有整数的和。 def sum_ra…

AutoX.js向后端传输二进制数据

android的JavaScript自动化软件用过Hamibot和AutoX.js 不过在向后端传输二进制数据时都有些限制&#xff0c;不如浏览器前端那么自由。Hamibot的http按文档应该时能支持传字节数组&#xff0c;但是实际上应该还没有支持。AutoX.js的http也是这样&#xff0c;但是AutoX.js还支持…

P7557 [USACO21OPEN] Acowdemia S题解

[USACO21OPEN] Acowdemia S 题目描述 由于对计算机科学的热爱&#xff0c;以及有朝一日成为 「Bessie 博士」的诱惑&#xff0c;奶牛 Bessie 开始攻读计算机科学博士学位。经过一段时间的学术研究&#xff0c;她已经发表了 N N N 篇论文&#xff08; 1 ≤ N ≤ 1 0 5 1 \leq…

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;每⾏的后⾯都加⼀个反…

基于深度学习的可再生能源的效率优化

基于深度学习的可再生能源效率优化是一种应用先进人工智能技术来提升太阳能、风能、水能等可再生能源的生产和利用效率的策略。可再生能源的生产效率通常受限于不稳定的自然条件&#xff08;如日照、风速等&#xff09;&#xff0c;深度学习能够通过分析历史数据和实时环境信息…

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

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

linux-网络管理-网络配置

Linux 网络管理与网络配置 在Linux系统中&#xff0c;网络管理是系统管理员的重要职责之一。网络配置包括如何配置网络接口、管理IP地址、网关、DNS等核心网络设置。现代Linux系统提供了多种工具用于网络管理&#xff0c;既包括传统的命令行工具&#xff0c;也包括现代的网络管…