当前位置: 首页 > news >正文

项目介绍


一、3DCar

动画

1. 地图实现:程序化圆柱体生成

项目核心

  • 数学建模:利用三角函数将地图顶点排列成圆柱形。
  • 柏林噪声 (Perlin Noise):为了让赛道产生起伏,代码在生成顶点时加入了 Mathf.PerlinNoise
  • 无限循环:系统始终维护两个世界区块(World Piece)。当玩家接近第二个区块时,第一个区块会被销毁,并在前方生成新的区块,实现无缝连接。
  • 平滑过渡:为了防止两个区块连接处出现裂缝,WorldGenerator 记录了前一个区块末尾的顶点位置(beginPoints),并在生成新区块的起始部分进行线性插值过渡。

2. 操控逻辑:基于目标旋转的车辆控制

车辆的控制逻辑集中在 Car.cs 中,它结合了物理模拟与平滑的角度转向。

输入处理

游戏支持键盘(Horizontal 轴)和鼠标点击(屏幕左右半侧)两种输入方式。

  • 目标旋转 (Target Rotation):玩家输入并不直接旋转车辆,而是设定一个 targetRotation
  • 插值旋转:使用 Quaternion.RotateTowards 让赛车平滑地转向量目标角度,这使得手感更加稳重,不会出现瞬间偏转。

物理表现

  • 轮子模拟:虽然使用了 WheelCollider 进行物理接触,但轮子的视觉旋转和位置更新是通过 LateUpdate 手动同步的。
  • 特效反馈:当车辆在旋转且达到一定角度差时,SkidMark 协程会生成滑痕预制体;如果轮子接触地面,则会触发草地粒子特效。

3. 障碍物与得分点生成

游戏的难度通过动态生成的障碍物(Obstacle)和得分门(Gate)来实现。

随机分布算法

WorldGenerator 生成网格顶点的循环中,会根据 startObstacleChance 的概率调用 CreateItem

  • 位置对齐:生成的物品会使用 Quaternion.LookRotation 指向圆柱体的中心轴线,确保障碍物始终垂直于曲面。
  • 动态难度obstacleChanceAcceleration 变量会随着游戏进行不断缩小随机范围,从而提高障碍物生成的频率,增加后期难度。

碰撞检测

  • 障碍物 (Obstacle.cs):检测 Collision。一旦玩家触碰,立即调用 GameManager.GameOver()
  • 翻车检测 (CarGameOverTrigger.cs):这是一个精妙的设计。在车顶放置一个触发器,如果车顶接触到地面("World piece"),说明车辆翻覆,强制结束游戏。

4. 游戏管理与环境表现

相对运动

为了性能考虑,玩家的车辆在 Z 轴上实际上是静止的。真正的移动是通过 BasicMovement.cs 实现的:世界在向后移动

  • 世界区块、障碍物、滑痕都作为子物体,以 globalSpeed 向后位移。
  • 灯光也会随之旋转,模拟昼夜或环境的变化。

相机跟随 (CameraFollow.cs)

相机使用了平滑的插值算法(Mathf.LerpMathf.LerpAngle),能够跟随赛车的 Y 轴旋转做出灵敏但丝滑的转弯反馈。




二、Flappy Bird

在本项目中,利用Xlua框架使用纯lua语言来写游戏逻辑。
动画brid

1. LuaBehaviour.cs

LuaBehaviour 是一个通用的组件。只需将其挂载到任何 GameObject 上,并拖入一个 Lua 文本文件,该物体就能运行 Lua 代码了。

1. 使用要点:

  1. 变量注入 (Injections):在 Inspector 面板中,我们可以将 C# 的 GameObject 或组件拖入 injections 列表,在 Lua 中直接通过名字调用。
  2. 独立环境:每个脚本拥有独立的 LuaTable(作用域),保证不同物体之间的 Lua 变量不会互相干扰。
  3. 生命周期映射:它将 C# 的标准生命周期(如 Start, Update, OnDestroy)自动映射到 Lua 脚本中对应的 start, update 函数。

2. 操控逻辑:在 Lua 中控制角色

通过 PlayerControl.lua.txt,我们可以看到角色控制变得非常简洁。

  • 物理操作:利用注入的 Rigidbody2D 组件,在 Lua 中直接设置 rb.velocity 来控制跳跃。
  • 点击交互:通过检测 CS.UnityEngine.Input.GetMouseButtonDown(0) 实现简单的鼠标/触摸反馈。
  • 碰撞反馈:Lua 脚本里直接写 onTriggerEnter2D。当碰到金币(StarClam)时加分,碰到障碍(GameOver)时通过 Time.timeScale = 0 暂停游戏。

3. 地图实现:循环移动逻辑

地图的位移并不复杂,由 Movement.lua.txt 负责。

  • 无限循环:脚本每帧修改物体的 transform.position
  • 坐标重置:当物体的 X 坐标达到边界(endNum)时,自动将其重置回起始点(startNum)。这种方式可以低成本地实现背景或地面的无限循环滚动。

4. 障碍生成:随机性控制

Obstacles.lua.txt 充当了关卡管理器的角色:

  • 定时生成:利用 Lua 的计时器变量 timer,每隔固定时间(maxTime)触发一次生成逻辑。
  • 随机选择:通过 math.floor(CS.UnityEngine.Random.Range(1, 9)) 随机抽取障碍物预制体,并使用 CS.UnityEngine.Object.Instantiate 进行实例化。

http://www.jsqmd.com/news/262702/

相关文章:

  • 一个致力于为 C# 程序员提供更佳的编码体验和效率的 Visual Studio 扩展插件
  • Playwright与Cucumber集成:行为驱动开发(BDD)实践
  • 亲测好用9个AI论文平台,助本科生轻松搞定毕业论文!
  • 2025高低温箱哪家强?行业评价高的厂商排行榜来啦,砂尘试验箱/盐水喷雾试验箱及各种老化房,高低温箱生产厂家排行榜单 - 品牌推荐师
  • 2026年头部卡式风机盘管定制找哪家,吊顶式空调机组/直膨式空调机组/卧式暗装风机盘管,卡式风机盘管门店推荐 - 品牌推荐师
  • Playwright测试数据模拟:Mock Service Worker使用指南
  • 2026年中国GEO优化服务商格局新观察:头部企业梳理与选择推荐 - 品牌推荐
  • 2026年GEO服务商怎么选不踩坑?查看这份真实评价排名与购买推荐 - 品牌推荐
  • java.lang.NumberFormatException: For input string: ““
  • Interspeech 2022:跨学科研究的融合与演进
  • 银行网页如何通过vue.js实现大文件文件夹上传及分块?
  • 2026年最新敏感肌保湿修复产品测评:高口碑屏障修护与长效锁水极简成分标杆推荐 - 速递信息
  • 导师严选8个AI论文工具,专科生搞定毕业论文+格式规范!
  • 工程建筑网页如何通过js实现文件夹上传及断点续传?
  • 详细介绍:3ds Max渲染核心:高光追(Embree)与光线追踪(Ray Trace)
  • 金融行业网页如何用vue2实现文件夹上传及秒传功能?
  • 吐血推荐!9款一键生成论文工具测评:本科生毕业论文救星
  • 农业大数据平台如何用百度UE优化WORD表格导入功能?
  • 2026年目前知名的智能货架源头厂家哪家好,重载货架/中型货架/货架定制/抽屉式模具架/背网货架,智能货架源头厂家找哪家 - 品牌推荐师
  • 技术学校品牌企业哪家好?成都万通未来高级技工学校了解一下 - 工业品牌热点
  • 教育行业如何通过UEDITOR插件实现PPT动画转存为网页?
  • 医院HIS系统如何集成百度编辑器实现PDF病历跨平台编辑?
  • 2026四川气体探测器供货商排行榜,探寻气体探测器哪家性价比高 - 工业品牌热点
  • 2026年免费音效素材下载网站最新动态
  • 2026年1月15万左右城市SUV实力排行榜:基于长期口碑与实测数据的TOP5权威榜单揭晓 - 品牌推荐
  • 2026年做得好的户外led大屏广告代理公司有哪些,地铁广告/电视台广告/公交广告,户外led大屏广告代理公司推荐 - 品牌推荐师
  • Playwright多语言回归测试框架对比
  • 智能API回归测试的核心挑战与解决路径
  • 详细介绍:我为什么当博主
  • 保险网页项目怎么用javascript实现文件夹上传及加密?