深圳seo网站优化公司360公司官网首页

news/2025/9/26 9:30:20/文章来源:
深圳seo网站优化公司,360公司官网首页,装饰公司网站php源码,徐州做网站的公司Unity3D 小案例 像素贪吃蛇 第二期 蛇的觅食 像素贪吃蛇 食物生成 在场景中创建一个 2D 正方形#xff0c;调整颜色#xff0c;添加 Tag 并修改为 Food。 然后拖拽到 Assets 文件夹中变成预制体。 创建食物管理器 FoodManager.cs#xff0c;添加单例#xff0c;可以设置…Unity3D 小案例 像素贪吃蛇 第二期 蛇的觅食 像素贪吃蛇 食物生成 在场景中创建一个 2D 正方形调整颜色添加 Tag 并修改为 Food。 然后拖拽到 Assets 文件夹中变成预制体。 创建食物管理器 FoodManager.cs添加单例可以设置食物生成的坐标范围提供生成一个食物的方法。 因为 Random.Range 的取值范围是 [min, max)为了取到 max 的值需要给右边界加一。 using System.Collections; using System.Collections.Generic; using UnityEngine;public class FoodManager : MonoBehaviour {public static FoodManager instance;public GameObject food;public int borderLeft -8;public int borderRight 8;public int borderTop 4;public int borderBottom -4;void Awake(){if (instance null){instance this;}else{Destroy(gameObject);}}void Start(){// 初始生成一个食物GenerateFood();}/// summary/// 生成食物/// /summarypublic void GenerateFood(){GameObject obj Instantiate(food, transform);int x Random.Range(borderLeft, borderRight 1);int y Random.Range(borderBottom, borderTop 1);obj.transform.position new Vector3(x, y, 0);} }在场景中创建节点挂上脚本拖拽引用。 运行游戏可以看到场景中生成了一个食物。 吃掉食物 给食物的预制体添加碰撞体勾选 Is Trigger。 同样蛇头也要添加碰撞体还要再添加一个刚体Body Type 设置为 Kinematic不需要受到重力影响。 在 Snake.cs 中添加碰撞函数判断碰撞物体的标签是 Food就销毁食物生成新的蛇身并生成下一个食物。 using System.Collections; using System.Collections.Generic; using UnityEngine;public class Snake : MonoBehaviour {// ...void OnTriggerEnter2D(Collider2D other){if (other.CompareTag(Food)){Destroy(other.gameObject);GenerateBody();FoodManager.instance.GenerateFood();}} }此时运行游戏蛇头可以吃掉食物了。 但是有时候蛇头还未到达食物的位置食物就被吃掉了甚至蛇头只是经过食物的附近食物也消失了。这是因为碰撞体的范围问题默认的 Size 是 (1, 1)可以稍微调小一些例如 (0.5, 0.5)。 调整后的效果 食物位置 目前场景范围适中生成的食物都在空地但是当蛇越来越长的时候会发现食物生成的位置有可能在蛇的身上。 我们应该让食物始终都在空地生成。 那么对于一个坐标是否为空地就需要做一些标记。 网格 目前食物生成的坐标取值范围在 X 轴是 [-8, 8]在 Y 轴是 [-4, 4]。 如果把这些坐标点看成是一个网格可以按照行列来看。 左上角是 (-8, 4)是第 0 行第 0 列索引为 0。 右上角是 (8, 4)是第 0 行第 16 列索引为 16。 左下角是 (-8, -4)是第 8 行第 0 列索引为 136。 右下角是 (8, -4)是第 8 行第 16 列索引为 152。 注意这里的索引是从第 0 行开始从左到右递增。行数增加时索引继续计数。 网格列表 在 FoodManager.cs 中添加一个 Vector3 列表X 和 Y 记录坐标Z 记录是否空地0 表示空地1 表示有物体占用。 这里总行数是上边界减去下边界还要加上一个端点总共 9 行。 总列数是右边界减去左边界还要加上一个端点总共 17 列。 根据行列数依次添加 Vector3 到列表中Z 默认是 0。 using System.Collections; using System.Collections.Generic; using UnityEngine;public class FoodManager : MonoBehaviour {// ...public ListVector3 gridList;public int rowMax 0;public int colMax 0;void Start(){rowMax borderTop - borderBottom 1;colMax borderRight - borderLeft 1;for (int i 0; i rowMax; i){for (int j 0; j colMax; j){gridList.Add(new Vector3(borderLeft j, borderTop - i, 0));}}} }然后提供一个标记网格列表的方法把传入的坐标转成 int判断边界换算行列计算索引根据索引从网格列表中取出一个网格点更新标记。 using System.Collections; using System.Collections.Generic; using UnityEngine;public class FoodManager : MonoBehaviour {// .../// summary/// 标记网格列表/// /summary/// param namepos坐标位置/param/// param nameflag标记/parampublic void MarkGridList(Vector3 pos, bool flag){int x (int)pos.x;int y (int)pos.y;// 坐标超出边界if (x borderLeft || x borderRight) return;if (y borderBottom || y borderTop) return;// 换算行列int row borderTop - y;int col x - borderLeft;// 计算索引int index col row * colMax;// 索引超出边界if (index 0 || index gridList.Count - 1) return;// 取出网格点标记是否空地Vector3 grid gridList[index];grid.z flag ? 1 : 0;// 更新网格点gridList[index] grid;} }标记网格 在游戏开始时蛇头会占用一个网格生成的身体也需要标记网格。 using System.Collections; using System.Collections.Generic; using UnityEngine;public class Snake : MonoBehaviour {void Start(){// 初始生成身体for (int i 0; i initBodyCount; i){GenerateBody();}FoodManager.instance.MarkGridList(transform.position, true);// ...}void GenerateBody(){GameObject obj Instantiate(body);// ...FoodManager.instance.MarkGridList(obj.transform.position, true);} }在蛇的移动过程中也要动态地标记网格。 蛇头和身体移动后都要标记网格已经被占用只有在最后一个身体移动前标记当前网格位置为空地。 using System.Collections; using System.Collections.Generic; using UnityEngine;public class Snake : MonoBehaviour {void Move(){// ...// 移动前先标记旧的位置posMarkFirst transform.position;transform.Translate(direction);// 标记蛇头移动后的网格位置FoodManager.instance.MarkGridList(transform.position, true);// ...for (int i 0; i bodyList.Count; i){// 最后一个身体移动前标记当前网格位置为空地if (i bodyList.Count - 1){FoodManager.instance.MarkGridList(bodyList[i].transform.position, false);}// ...// 每个身体移动后标记当前网格位置FoodManager.instance.MarkGridList(bodyList[i].transform.position, true);}} }食物也会占用网格每次生成食物时也要标记网格。 using System.Collections; using System.Collections.Generic; using UnityEngine;public class FoodManager : MonoBehaviour {public void GenerateFood(){GameObject obj Instantiate(food, transform);int x Random.Range(borderLeft, borderRight 1);int y Random.Range(borderBottom, borderTop 1);obj.transform.position new Vector3(x, y, 0);// 标记食物占用的网格位置MarkGridList(obj.transform.position, true);} }筛选空地 在食物生成时不能单纯用随机数来确定坐标位置而是要从网格列表中筛选未被占用的网格点然后从这些网格点中随机取出一个位置。 定义一个 filterList用来存储筛选后的网格点。 每次生成食物时需要先清理 filterList然后从网格列表中筛选 Z 为 0表示未被占用的网格点添加到筛选列表中。 然后再生成随机数从筛选列表中取出网格点赋值位置给生成的食物。 using System.Collections; using System.Collections.Generic; using UnityEngine;public class FoodManager : MonoBehaviour {// ...public ListVector3 filterList;// ...public void GenerateFood(){// 清理筛选列表filterList.Clear();for (int i 0; i gridList.Count; i){// 筛选未被占用的网格点if (gridList[i].z 0){filterList.Add(gridList[i]);}}// 没有空地了if (filterList.Count 0) return;// 随机取出一个空地int index Random.Range(0, filterList.Count);Vector3 pos filterList[index];GameObject obj Instantiate(food, transform);// int x Random.Range(borderLeft, borderRight 1);// int y Random.Range(borderBottom, borderTop 1);// obj.transform.position new Vector3(x, y, 0);obj.transform.position pos;// 标记食物占用的网格位置MarkGridList(obj.transform.position, true);} }至此当蛇身越来越长时也不会出现食物生成在蛇身上的情况了。 运行效果

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

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

相关文章

网站建设软硬件要求江西省建设招标网站

一 ISN序列号探究 本文主要探究三次握手建立TCP连接的细节备注: 某些问题探究的比较深入,当前用不到,暂时通过链接引入进来吃水不忘挖井人: 小林 coding ① 初始序列号 ISN 是如何随机产生的 ISN: 初始化序列号 Initial Sequence Number 接收方和…

在Vue.js中设置方法时访问$vuetify实例

在Vue.js中访问 $vuetify实例通常意味着你正在使用Vuetify框架,它是一个流行的Vue.js的UI框架。要在Vue组件的方法中访问 $vuetify实例,通常是在组件的实例方法中通过 this关键字来实现。 例如,你可能会在Vue组件中…

纷享销客CRM任务系统:破解快消品终端动销管理难题

品牌商自有销售人员做动销,成本越来越高,雇不起那么多人,转而与经销商合作,但如何让他们的销售更主动、更多地卖自己的产品呢? 一线人员到底有没有按时拜访?陈列合不合格?促销有没有执行到位?看不见、摸不着、…

第一周博客作业-介绍自己

自我介绍: 大家好,我叫苏紫先,是2023级数据科学与大数据技术0102班的一名学生,很高兴进入这个大家庭并在此记录我接下来的学习内容,如今进入大学已经3年了,我们上了很多专业的科目虽然说成绩不错,但是真实掌握的…

完整教程:zookeeper+kafka

完整教程:zookeeper+kafka2025-09-26 09:22 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; …

AI大模型应用简介 - 努力-

AI大模型应用简介AI大模型简介一、AI大模型简介2022年11月30日,OpenAI公司发布了GPT3.5模型,同时对外开放了ChatGPT产品。人工智能突然进入了普通人的生活中,各种AI应用如雨后春笋般出现。不过,由于大模型研究的成…

完整教程:01_5分钟运行你的第一个LLM:Hugging Face入门

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

codeforces 1504 div3

codeforces 1504 div3codeforces 1054 div3 D 就是枚举最后答案的所有可能就好了,aba,bab ... 赛时没想到怎么算花费,结果在这题上码死了, 这种花费真心不擅长算,只知道批处理,子数组思维,没有动态的思路,这个就…

React 基础核心概念(8 个)——从入门到能写业务组件(上)| 葡萄城技术团队

React 基础核心概念(8 个)——从入门到能写业务组件(上) 前言:为什么要先掌握这些基础概念? 对国内开发者来说,React 是开发中后台系统、电商前端、移动端 H5 的“刚需技能”。但很多人刚学就陷入“会写 JSX 却…

2 day - when

第二天嘿嘿 从今天开始应用一些方法 法一、链式时延协议(嘿嘿这个时延还有协议真的很容易让人联想到计网,很喜欢计网老师) 有两条任务链为主链和辅助链。启用时,可以启用辅助链,预约一个信号:摘下眼镜并给小号发…

玄武建设局网站网页设计方案

NoSQL数据库:数据的一致性 读取一致性 强一致性 在任何时间访问集群中任一结点,得到的数据结果一致; 用户一致性 对同一用户,访问集群期间得到的数据一致; 解决用户一致性:使用粘性会话,将会话…

可以将自己做的衣服展示的网站网站的流量建设

文章目录 0 前言1 常用的分类网络介绍1.1 CNN1.2 VGG1.3 GoogleNet 2 图像分类部分代码实现2.1 环境依赖2.2 需要导入的包2.3 参数设置(路径,图像尺寸,数据集分割比例)2.4 从preprocessedFolder读取图片并返回numpy格式(便于在神经网络中训练)2.5 数据预…

网站怎么更新数据重庆网架加工厂

华子目录 概念工作流程工作图流程(按行处理) awk程序执行方式1.通过命令行执行awk程序实例 2.awk命令调用脚本执行实例 3.直接使用awk脚本文件调用实例 awk命令的基本语法格式BEGIN模式与END模式实例awk的输出 记录和域(记录表示数据行&#…

机械网站开发铁路局招聘正式工4000人

文章目录 赛题思路一、简介 -- 关于异常检测异常检测监督学习 二、异常检测算法2. 箱线图分析3. 基于距离/密度4. 基于划分思想 建模资料 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 一、简介 – 关于异常…

协会网站建设计划书工商局网站怎么做股东实名认证

1. 题目 给定一个整数序列&#xff1a;a1, a2, …, an&#xff0c;一个132模式的子序列 ai, aj, ak 被定义为&#xff1a;当 i < j < k 时&#xff0c;ai < ak < aj。 设计一个算法&#xff0c;当给定有 n 个数字的序列时&#xff0c;验证这个序列中是否含有132模…

网站主持人制作网站代言人asp 网站开发 软件

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…

实用指南:轻松玩转Swagger API文档神器

实用指南:轻松玩转Swagger API文档神器pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mo…

记录java调用eclipse cdt 解析c++文件

环境: jdk1.8 eclipse cdt 9.11.1 需求: java 解析c++中的类,属性类型,属性名称,函数,函数参数,返回值。 注意点: 如果你是外网编码,移植依赖和代码到内网的时候 运行可能出现 class not found xxxx , 这…

Chormium 密码管理器表单结构体说明(基于Chromium138)

这个结构体(struct PasswordForm)是 Chromium 浏览器(以及所有基于 Chromium 的浏览器,例如 Chrome、Edge 等)中密码管理器用来存储和管理单个登录凭证(即一组用户名和密码)的核心数据结构。它不仅包含了用户名…

为什么人工智能选择Python?深入解析AI界的胶水语言

在人工智能(AI)的黄金时代,Python几乎"统治"了整个领域。从深度学习到机器学习,从学术研究到工业应用,Python无处不在。 但为什么是Python?为什么不是性能更强的C++、生态成熟的Java,或者其他现代语言…