项目介绍


一、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 进行实例化。

posted @ 2026-01-18 12:26  仰光开狼大难孩  阅读(0)  评论(0)    收藏  举报