强烈建议先使用演示预制体和起始场景。请阅读使用演示部件构建的说明。
自定义
好的,您已经完成了演示部件的简单混搭,现在可以添加自己的自定义增强道具、障碍物等。继续阅读以了解如何制作与现有系统交互的新预制体。
制作自定义检查点
以下是我们提供的检查点预制体的层级结构:
触发器要求

此预制体上的"触发器(Trigger)"对象使用了一种模式,几乎所有检测玩家的对象(检查点、增强道具、障碍物、重生器等)都会重复使用。我们将详细介绍第一个预制体,其余的可以跳过。
您的检查点需要一个处于 CourseTrigger 层级的碰撞器(Collider),开启 isTrigger,并带有一个包含 OnPlayerDataEnter 程序的 UdonBehaviour。

此 UdonBehaviour 需要设置以下变量:
- fxPrefab 应引用一个带有特效的预制体,并且该预制体需要有 DestroyAfterXSeconds Udon 程序或其他能在一段时间后自毁的方式。
- program 应引用此预制体下另一个对象上的 UdonBehaviour,该对象带有 Checkpoint 程序。
- eventName 应设置为上述 UdonBehaviour 上存在的事件。
- 检查点应勾选 deactivateOnTrigger,这样每次跑赛道只能被激活一次,直到玩家完成赛道。
- sendPlayerData 仅在检查点用作起始门时需要。
如果想了解更多关于此程序的信息,可以在此找到完整文档:OnPlayerDataEnter
检查点程序要求
以上所有设置仅用于检测玩家、创建 FX 对象,然后触发"真正"程序上的事件。在本例中,这是"UdonProgram"对象上一个名为 Checkpoint 的程序。碰撞器上的程序将尝试在此 UdonBehaviour 上运行名为"Trigger"的程序。
您需要做的就是拥有一个带有 UdonBehaviour 的对象,其上运行 Checkpoint 程序。该程序的所有变量将在放置时自动设置,或在世界中有人触发时实时设置。
起始/终点程序要求
如果要制作用作起始门或终点门的检查点,需要稍微不同地设置程序。触发碰撞器相同,使用的 Checkpoint 程序也相同,但需要做以下更改:
对于起始门:
- 将 eventName 设置为 "StartRace"
- 确保 sendPlayerData 开启
对于终点门:
- 将 eventName 设置为 "FinishRace"
自定义它!
只要按上述说明设置好触发碰撞器和检查点程序,就拥有了一个可以在世界中使用的可用检查点预制体。请注意,当有人触发检查点时,触发碰撞器所在的 GameObject 将被设置为非活动状态。因此,如果要隐藏整个检查点,请将碰撞器放在最顶层的对象上。如果只想隐藏部分(如我们在演示预制体中所做的),请将这些部分设为触发碰撞器对象的子对象。
当有人完成赛道或通过菜单重生时,赛道将重置(Reset)。调用此方法时,赛道程序将搜索每个检查点中的触发碰撞器。它会将所有带有触发碰撞器的 GameObject 设置为非活动状态,除了第一个(您的起始门),它将保持活动状态。如果预制体上有额外的碰撞器,请记住这一点——如果碰撞器开启了 isTrigger,其 GameObject 将设置为非活动状态。
添加到检查点预制体列表
工具窗口列出了"检查点预制体(Checkpoint Prefabs)",方便将其添加到场景中。您可以将新的自定义预制体拖放到此列表中进行替换,或先更改列表的"大小(Size)"来添加新的空槽位,然后将新预制体放入。
制作自定义增强道具
请先阅读上面的"制作自定义检查点"以了解触发碰撞器系统的工作原理,因为它与增强道具相同。设置好触发碰撞器后,就可以开始处理 PowerUp 程序了。
增强道具程序要求

- 首先,确保设置了一个触发碰撞器,用于调用此 UdonBehaviour 上的"Trigger"。
- playerModsManager 可以留空,通过工具窗口创建增强道具或按"刷新(Refresh)"时将自动注入。
- speedChange 或 jumpChange 之一应设置为非 0 的值。正值将添加到您在工具窗口的增强道具(Power Ups)部分设置的默认移动速度或跳跃冲量中。负值将减去。可以组合使用——让玩家跳得高但移动慢的增强道具完全有效。
- effectDuration 应大于 0(不能为负数)。这是增强道具的持续时间。玩家将在 HUD 上看到更改信息,该信息会按照您设置的速度淡出。
添加到增强道具预制体列表
工具窗口列出了"增强道具预制体(PowerUp Prefabs)",方便将其添加到场景中。您可以将新的自定义预制体拖放到此列表中进行替换,或先更改列表的"大小(Size)"来添加新的空槽位,然后将新预制体放入。
制作自定义障碍物
障碍物使用上面检查点中记录的触发碰撞器设置,所以请先确保已阅读过该部分。
我们创建了两种类型的障碍物供您使用——**重生(Respawn)障碍物和生成式(Spawned)**障碍物。
重生障碍物
这是演示赛道中最常见的障碍物。它使用触发碰撞器将玩家重生到最后一个检查点。您需要设置一个触发碰撞器,在另一个带有 RespawnOnCourse 程序的对象上运行"Trigger"事件。

当您刷新工具窗口时,RespawnOnCourse 程序将自动设置 course 变量。
生成式障碍物
这种障碍物由两部分组成,是我们提供的定制程度最高的单一用途障碍物,作为扩展基本系统以添加功能的示例。
HazardSpawner 程序

该程序将每隔 delay 秒生成其 prefab 预制体。它有一个 playerModsManager 引用,将在刷新工具窗口时注入。 当它生成障碍物时,会查找新对象上的 UdonBehaviour,并将其 playerModsManager 变量设置为其持有的引用。这样生成的障碍物才能降低玩家的速度。
SpawnedHazard 程序

此预制体在"Trigger"子对象上有一个 TriggerCollider,用于在 SpawnedHazard 程序上运行"HitPlayer"事件。
- lifeDuration 控制此预制体生成后的存在时间,确保在没有玩家时不会永远留在场景中。
- playerModsManager 由 HazardSpawner 程序设置
- speedChange 的工作方式与典型的增强道具相同。'x' 值是对玩家默认速度的更改量,'y' 值是效果的持续时间。此预制体的默认设置 (-3,3) 将在玩家接触时降低 3 点速度,持续 3 秒。
由于这些预制体不是通过工具窗口创建和管理的,因此在放置到场景后解包它们非常重要。否则自动注入可能无法生效。
其他自定义
以下是一些您可以尝试的其他内容:
分数字段
如果想更改分数字段的外观或显示的分数数量,可以复制"ScoreField"预制体,将新版本放入工具窗口"分数管理(Score Manager)"部分的"分数对象预制体(Score Object Prefab)"槽位,然后设置"显示的分数数量(Number of Scores to Show)"以重新生成显示分数的 UI。
HUD
您可以更改 HUD 项目的外观和布局——只需查看"HUD"对象的层级结构即可。
小地图
如果想更改小地图的摄像机角度、平滑量等,可以在"MinimapCameraSystem/VCam-Follow"下找到使用的 CinemachineVirtualCamera。其 Follow 和 LookAt 变量在运行时设置,所以如果想在编辑器中测试,可以放入一个胶囊体,将其设置为这两个变量的目标,然后在赛道中拖动它,查看在小地图中的效果。
高级内容
您可以点击在项目面板中创建的新赛道资源查看其原始数据,访问各种可以自行承担风险更改的内容,如默认 Udon 程序。还可以修改"变量到场景对象查找(Variable to Scene Object Lookup)"部分:

这是工具窗口运行 Refresh() 时将正确对象注入 UdonBehaviour 时的查找表。左侧是变量名,右侧是场景中可以找到正确组件的对象名称。目前,系统支持查找和注入以下组件类型:
- GameObject
- UdonBehaviour
- CinemachineVirtualCamera
因此,您可以创建一个带有名为"course"的公共变量的新 Udon 程序,它会自动注入 CourseManager UdonBehaviour。您可以在此添加自己的项目,甚至添加其他类型——只需修改 ObstacleCourseEditorWindow 类上的 InjectVariableReferences 方法,在 if 链中添加额外类型。如果编写了一个好的通用组件处理程序,请向 git 仓库提交 Pull Request!