指南
CyanTrigger 示例
如果您想查看有关如何使用 CyanTriggers 创建不同系统的其他示例,请务必参照文件内提供的示例场景 CyanTriggerExamples / Examples.unity 你也可以下载 CyanKey 示例世界 来实现一个简单的密室逃脱。
镜子开关
开关镜子是许多世界中十分常见的操作。最简单的形式是带有切换操作的 Interact 事件。
这是开关本地镜子的最简易方法。不过,GameObject.ToggleActive 是一个自定义操作。如果您想使用非自定义操作进行此操作,您可以通过获取值、翻转并设置它来手动执行此操作。
在此示例中,有 4 个操作。
- local bool 变量 - 这将用于存储要切换的游戏对象的状态
- GameObject.Get activeSelf - 这将获取游戏对象的当前状态并将其存储在局部变量中
- bool 的UnaryNegation - 这将翻转局部布尔变量的值。
- GameObject.SetActive - 这会将 GameObject 的状态设置为变量。
获取玩家名称
获取玩家的名字在 SDK2 中是不可能的。可以在 CyanTriggers 的 SDK3 中轻松完成。获得所需的播放器后,您可以通过调用 VRCPlayerApi.Get displayName 来获取播放器名称。
在此示例中,OnPlayerJoined 提供加入实例的玩家。使用它,可以获取玩家名称并将其打印到控制台。此示例有三个操作:
- Local string variable - 这将用于存储玩家的名称
- VRCPlayerApi.Get displayName - 这将获取输入播放器对象并获取显示名称并将其存储在局部变量中
- Debug.Log - 然后,这会将局部变量打印到控制台,该控制台存储玩家的名称。
OnKeyDown - OnKeyUp
在 SDK2 中,OnKeyDown 和 OnKeyUp 是直接事件。SDK 3 和 CyanTriggers 并非如此。如果要在按下某个键时执行操作,则需要检查 update 是否在此帧上按下了该键。
在此示例中,要点是事件需要位于更新循环中。应使用三个事件:Update、LateUpdate 或 FixedUpdate。在事件本身中,您需要检查 Input.GetKeyDown。您还可以使用其他输入操作。
禁用检查
在 SDK2 中,如果游戏对象处于非活动状态或VRC_Trigger处于非活动状态,则不会执行 Event。在带有 CyanTriggers 的 Udon 中,情况不再如此。如果您想防止在这些情况下发生操作,则需要手动检查并提前从 Event 返回。为了简化操作,有一个名为 ReturnIfDisabled 的 Action 可以为您执行此操作。这可以添加到任何位置,但要像 SDK2 一样,它应该是事件中的第一个操作。
如果您想了解 ReturnIfDisabled 操作的作用,可以查看下面的扩展版本:
同步切换
本指南也以视频教程的形式提供。
同步切换
使用同步变量,可以轻松地为您的世界创建同步的切换对象。通过与 OnVariableChanged 事件配对的同步变量,可以轻松处理变量在任何客户端上更新的情况。
在此示例中,您可以看到为所有玩家(包括迟到的加入者)同步切换所需的一切。这有三个部分,定义变量、修改变量、处理变量更改。
定义变量
在示例中,只有为此 CyanTrigger 定义了一个变量。这个变量称为 “value”。它是 bool 类型,并且设置为 sync(同步)。其中的一个重要部分是它被设置为对象的默认状态。在场景中,切换的对象已经处于活动状态,因此变量也应开始处于活动状态。否则,修改它的第一次交互将不会为玩家正确更改。
修改变量
在此示例中,我使用 Interact 事件来修改变量状态。这可以是任何事件,但 Interact 很容易演示。修改变量时,您必须是对象的所有者才能更改该值。考虑到这一点,Event 中的第一个操作是 Networking.SetOwner。这将使本地玩家成为对象的所有者,从而允许我们更改变量的值。然后,下一个操作将修改变量的值。在此示例中,我使用 bool 翻转 bool 值。UnaryNegation 并将其存储回同一个变量中。
处理变量更改
OnVariableChanged 是您应该用于处理变量值更改的事件。这将检查变量的值何时因本地操作或同步变量更改而发生更改。执行此 Event 时,变量中具有更新的值,可以将其用于其他操作。OnVariableChanged 事件还提供包含旧值的变量。在此示例中,我采用另一个名为 “Thing” 的对象,并将其活动状态设置为变量的值。
PlayerTracking (玩家跟踪)
CyanTriggers 附带了一些示例预制件,这些预制件展示了如何跟踪玩家的不同部分。
- PlayerBaseTracker - 此预制件将每帧更新其位置,以作为本地玩家的基本位置。这是 VRCPlayerApi.GetPosition 和 VRCPlayerApi.GetRotation 返回的值
- PlayerBoneTracker - 此预制件将每帧更新它的位置,使其成为指定本地玩家骨骼的位置。使用全局变量选择要跟踪的骨骼。
- PlayerTracker - 此预制件将每帧更新其位置,以作为指定本地玩家跟踪器的位置。使用全局变量选择要跟踪的项目。有 3 个选项:头部、左手和右手。
随机化
与 SDK2 VRC_Triggers 相比,CyanTriggers 中的随机化目前并不容易。这是随机化所发生的操作的多个步骤。本指南要求了解特殊操作。
获取随机值
首先,您需要获取一个随机值。在示例图像中,有两个操作。第一种方法是创建一个局部浮点变量来存储随机值。第二种方法是使用 Random.Get value 操作并将其存储在局部变量中。Random.Get 值将返回一个介于 0 和 1 之间的数字。
根据概率检查值
一旦我们有了随机值,我们需要检查每个操作组的每个概率。这可以通过 If 和 ElseIf 操作来完成。第一个操作必须是 If 操作。在该条件中,我们要检查随机值是否小于第一个概率。在此示例中,第一个概率是 0.25 或 25% 的几率。为了检查此概率,浮点数。LessThan 操作。在 ConditionBody 中,添加此随机概率的所有操作。使用 Custom Events 和 SendCustomEvent 可以帮助组织所有内容,因为它将随机化选择与随机化操作分开。 对于所有其他随机操作,请使用 ElseIf 操作。这些将以相同的方式设置,但概率需要是到目前为止所有先前概率的总和加上我们想要的新概率。在此示例中,第二个随机操作组的概率也是 0.25 或 25%。要检查这一点,随机值需要介于 0.25 和 0.5 之间。第一个 if 在值小于 0.25 时处理,因此此检查只需要验证值是否小于 0.5。 对于最后一种概率,可以使用 Else 特殊操作。由于之后不会有其他检查,因此剩余部分可以用作最后的概率。在示例中,前两个操作处理所有小于 0.5 的值,这意味着最后一个操作的概率为 0.5 或 50%。
同步随机化
为了同步随机化,您需要同步结果,而不是整体操作。这可以通过首先将事件设置为 local 来完成。对于您希望所有人执行的每个操作,您需要将操作移动到 Custom Event,并广播该事件。如果要处理数据,另一个选项是使用同步的浮点值,并检查要在 OnVariableChanged 事件中为该浮点数执行什么随机操作。
No Comments