本文是Unity3D贪吃蛇游戏从制作到部署的相关细节
项目开源代码:https://github.com/zstar1003/3D_Snake
试玩链接:http://xdxsb.top/Snake_Game_3D
效果预览:

试玩链接中的内容会和该效果图略有不同,后面会详细说明。

游戏规则

经典贪吃蛇游戏:蛇身随着吃食物的增加不断变长,通过A/D或方向键←→控制方向,蛇头撞在蛇身上或四周墙壁会导致游戏失败。

蛇身控制和碰撞检测

蛇身控制和碰撞检测的逻辑写在SnakeController.cs文件中。

蛇头运动的思路是将蛇头不断朝forward的方向前进,前进速度等于速度数值x当前时间。同时通过一个list来记录蛇头运动的历史轨迹,蛇身通过该轨迹进行运动。

为了区分延申出来的蛇身是初始蛇身还是新延申的蛇身,对新延申的蛇身打上Block标签,不进行区分则会导致刚开始碰撞即触发蛇头蛇身碰撞,导致游戏结束。

完整代码:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.SceneManagement;public class SnakeController : MonoBehaviour
{// 设置public float moveSpeed = 5f;public float steerSpeed = 180f;public float bodySpeed = 5f;public int Gap = 10;// 预制体public GameObject bodyPrefab;  //身体组件// 身体组件集合private List<GameObject> _bodyParts = new List<GameObject>();private List<Vector3> _positionHistory = new List<Vector3>();//音乐控制器public AudioController audioController; private void Start(){addBodyPart();audioController = GameObject.FindGameObjectWithTag("Audio").GetComponent<AudioController>();}private void Update(){// 向前移动transform.position += transform.forward * moveSpeed * Time.deltaTime;// 方向操控float steerDirection = Input.GetAxis("Horizontal");  // 返回值从 -1 到 1transform.Rotate(Vector3.up * steerDirection * steerSpeed * Time.deltaTime);// 保存位置移动史_positionHistory.Insert(0, transform.position);// 移动身体组件int index = 0;foreach (var body in _bodyParts){Vector3 point = _positionHistory[Mathf.Clamp(index * Gap, 0, _positionHistory.Count - 1)];// 让贪吃蛇的身体组件沿着头部的移动轨迹运动Vector3 moveDirection = point - body.transform.position;body.transform.position += moveDirection * bodySpeed * Time.deltaTime;// 让身体组件朝向头部移动的方向 body.transform.LookAt(point);index++;}}// 蛇身延长private void addBodyPart(){GameObject body = Instantiate(bodyPrefab, new Vector3(0, transform.position.y, 0), Quaternion.identity);_bodyParts.Add(body);}// 后续添加的body打上Block标签private void addBodyPart_Block(){GameObject body = Instantiate(bodyPrefab, new Vector3(0, _bodyParts.Last().transform.position.y, 0), Quaternion.identity);body.tag = "Block";_bodyParts.Add(body);}//触发检测private void OnTriggerEnter(Collider other){if (other.tag == "Food"){   //必须先删除,否则会导致多次触发Destroy(other.gameObject);addBodyPart_Block();GameObject.Find("SpawnPoint").GetComponent<SpawnItem>().SpawnItems();audioController.PlaySfx(audioController.eat);}else if (other.tag == "Block"){SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 1);}}
}

食物旋转

控制食物旋转比较简单,在update中加入Rotate即可。

Food.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Food : MonoBehaviour
{void Start(){}void Update(){//旋转transform.Rotate(Vector3.up);}
}

食物随机生成

食物随机生成我并没有采用随机数的方式,三维场景容易出现问题。因此这里在场景中添加了6个食物生成的点位,当食物被触发之后,在随机的一个点位上生成新的食物。

SpawnItem.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class SpawnItem : MonoBehaviour
{public Transform[] SpawnPoints;public float spawnTime = 2.5f;public GameObject Items;void Start(){}void Update(){}public void SpawnItems(){int spawnIndex = Random.Range(0, SpawnPoints.Length);Instantiate(Items, SpawnPoints[spawnIndex].position, SpawnPoints[spawnIndex].rotation);}
}

场景切换

这里对于游戏开始界面和结束界面分别用不同的场景进行隔离,切换时只需一行代码:

SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 1);

这里的Index为打包时场景的序号顺序。

本地WebGL测试

使用WebGL打包之后,会得到3个文件夹和一个index.html文件,直接打开index.html会报错,需要使用服务器方式去运行。

首先在win10上配置服务器相关组件,参考之前的博文【实用技巧】Win10搭建局域网FTP服务器。

之后在打包的文件夹下新建一个文件web.config,输入以下内容:

<?xml version="1.0" encoding="utf-8"?>
<!--有关如何配置 ASP.NET 应用程序的详细信息,请访问https://go.microsoft.com/fwlink/?LinkId=169433
-->
<configuration>  <system.webServer><httpProtocol><!-- 允许跨域配置 --><customHeaders><add name="Access-Control-Allow-Origin" value="*" /><add name="Access-Control-Allow-Headers" value="X-Requested-With,Content-Type,Authorization" /><add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE,OPTIONS" /><add name="Access-Control-Allow-Credentials" value="true" /></customHeaders></httpProtocol><staticContent><remove fileExtension=".mem" />  <remove fileExtension=".data" />  <remove fileExtension=".unity3d" />  <remove fileExtension=".jsbr" />  <remove fileExtension=".membr" />  <remove fileExtension=".databr" />  <remove fileExtension=".unity3dbr" />  <remove fileExtension=".jsgz" />  <remove fileExtension=".memgz" />  <remove fileExtension=".datagz" />  <remove fileExtension=".unity3dgz" />  <remove fileExtension=".json" />  <remove fileExtension=".unityweb" />  <mimeMap fileExtension=".mem" mimeType="application/octet-stream" />  <mimeMap fileExtension=".data" mimeType="application/octet-stream" />  <mimeMap fileExtension=".unity3d" mimeType="application/octet-stream" />  <mimeMap fileExtension=".jsbr" mimeType="application/octet-stream" />  <mimeMap fileExtension=".membr" mimeType="application/octet-stream" />  <mimeMap fileExtension=".databr" mimeType="application/octet-stream" />  <mimeMap fileExtension=".unity3dbr" mimeType="application/octet-stream" />  <mimeMap fileExtension=".jsgz" mimeType="application/x-javascript; charset=UTF-8" />  <mimeMap fileExtension=".memgz" mimeType="application/octet-stream" />  <mimeMap fileExtension=".datagz" mimeType="application/octet-stream" />  <mimeMap fileExtension=".unity3dgz" mimeType="application/octet-stream" />  <mimeMap fileExtension=".json" mimeType="application/json; charset=UTF-8" />  <mimeMap fileExtension=".unityweb" mimeType="application/octet-stream" />  </staticContent></system.webServer>
</configuration>

之后在iis中,新建一个http服务器,选择一个不被占用的端口,我这里选择8080端口。

开启网站后,在浏览器输入http://localhost:8080/,即可访问测试。

Github部署

Github部署非常容易,新建一个仓库,将打包出的内容直接上传。


然后在Settings/Pages选择main分支,点击Save,过几分钟就会在上方出现访问网址。

遗留问题:打包前后测试不一致

目前该项目在untiy运行测试时正常, 但打包出webgl或exe时,却出现蛇身分离的情况,看了一些打包时的选项,仍未解决该问题,有了解这一问题的读者欢迎在评论区交流。

【Unity】3D贪吃蛇游戏制作/WebGL本地测试及项目部署相关推荐

  1. java3d酷眩贪吃蛇下载,100行JS实现HTML5的3D贪吃蛇游戏

    js1k.com收集了小于1k的javascript小例子,里面有很多很炫很酷的游戏和特效,今年规则又增加了新花样,传统的classic类型基础上又增加了WebGL类型,以及允许增加到2K的++类型, ...

  2. 如何使用javascript制作一个网页端3D贪吃蛇游戏(附源码及链接)

    先来看游戏的最终效果: 3D网页版贪吃蛇游戏 下面来具体讲一下如何实现. 该游戏使用Hightopo的SDK制作,总共100多行代码,没有WebGL基础的同学们也可很快掌握. 场景初始化 首先,我们对 ...

  3. 诺基亚3d贪吃蛇java版_诺基亚3D贪吃蛇游戏下载-游戏大玩家

    <诺基亚3D贪吃蛇>是一款非常魔性有趣的贪吃蛇小游戏,游戏把传统的贪吃蛇界面进行了改进,创造出一个全新的3D炫彩界面,看着爱吃豆豆的贪图蛇行走在立体空间,摇晃着它圆滚滚的身体,超级搞笑有意 ...

  4. Unity-关于一个3D贪吃蛇的走路算法

    近日在做一个类似于ios手游<贪吃三国>的3D贪吃蛇游戏. 一.移动 在之前的项目中,移动运用的是Unity的AStarPathFinding插件.使每一个贪吃蛇元素的移动目标点为前一个元 ...

  5. unity贪吃蛇c 语言代码,unity实现简单贪吃蛇游戏

    本文实例为大家共享了unity实现贪吃蛇游戏的详细代码,供大家参考,详细内容如下 首先创建一个头部,编写脚本利用WASD控制头部的移动. Vector3 up=new Vector3(0,1,0); ...

  6. python制作贪吃蛇游戏下载_自动玩贪吃蛇,满屏的蛇影当然由python制作AI贪吃蛇!...

    image 前提:本文实现AI贪吃蛇自行对战,加上人机对战,文章末尾附上源代码以及各位大佬的链接,还有一些实现步骤,读者可再次基础上自行添加电脑VS电脑和玩家VS玩家(其实把人机对战写完,这2个都没什 ...

  7. Python制作当年第一款手机游戏-贪吃蛇游戏(练习)

    前言: 文章利用Python pygame做一个贪吃蛇的小游戏而且讲清楚每一段代码是用来干嘛的. 据说是贪吃蛇游戏是1976年,Gremlin公司推出的经典街机游戏,那我们今天用Python制作的这个 ...

  8. 手把手教你使用 Python 制作贪吃蛇游戏

    贪吃蛇游戏是有史以来最受欢迎的街机游戏之一.在这个游戏中,玩家的主要目标是在不撞墙或不撞墙的情况下抓住最大数量的水果.在学习 Python 或 Pygame 时,可以将创建蛇游戏视为一项挑战.这是每个 ...

  9. Love2D游戏引擎制作贪吃蛇游戏

    预览游戏 love2d游戏引擎重要函数 详情: love.load:当游戏开始时被调用且仅调用一次 love.draw:回调函数,每帧更新一次游戏画面 love.update:回调函数,每帧更新一次游 ...

  10. 单片机8×8点阵显示简单汉字的程序_干货 | 浅析单片机制作贪吃蛇游戏

    为了让大家更深入地了解底层的原理,在讲解时特意选择了51单片机(而非STM系列),另外16*16点阵由译码器和移位缓存器直接驱动(而非MAX系列芯片),摇杆也利用ADC功能判断方向. 那如何让单片机驱 ...

最新文章

  1. Kafka技术架构那些事儿
  2. 微信小程序获取用户的 OpenId (附前端代码)
  3. python系统自学_如何系统地自学python
  4. 七年级计算机上教学计划,初一教学计划模板锦集5篇
  5. 大数据总结微信自媒体运营
  6. Python 使用requests发送POST请求
  7. mysql 5.6.41编译安装详细步骤
  8. JavaScript学习——判断数据类型总结(转)
  9. Python-Matplotlib可视化(4)——添加注释让统计图通俗易懂
  10. 编程英文单词的标准缩写
  11. 【码住收藏】软件测试报告模板范文来了——优秀测试报告模板流程
  12. 利用python处理excel文件并可视化处理-python如何将excel数据处理可视化
  13. 微信公众平台开发(1)--账号注册流程图文详解
  14. Wifi热点java_java实现笔记本电脑设置成WiFi热点
  15. 百度地图使用,以及一些api
  16. 照片模糊怎么办?教你简单三步瞬间修复照片清晰度!
  17. python黑科技脚本_利用Python实现FGO自动战斗脚本,再也不用爆肝啦~
  18. 阿里OSS图片持久化,裁切,缩放,格式转换等
  19. 活化能使用计算机算还是,如何计算反应活化能
  20. java 画图 例子_JAVA简易画图工具

热门文章

  1. Python练习册0-9
  2. 一次关于JVM的面试经历,成功收获美团,小米安卓offer
  3. 【清华夏令营模拟2019.5.22】连续段(析合树+多项式牛顿迭代)
  4. 《前任3:再见前任》
  5. 谈谈MySQL的WAL、LSN、checkpoint
  6. 各层设备(OSI模型)
  7. 选择合适的软件管理视频制作排期
  8. 攻防世界ReverseMe-120详解
  9. LTE语音业务 - CSFB
  10. 爬虫小偏方系列:robots.txt 快速抓取网站的小窍门