Skip to main content

制作一个用于白名单/黑名单系统

欢迎来到麦哲伦的udon graph实战教程,本期专栏将带大家手把手设计一个本地白名单系统。那么事不宜迟,让我们马上开始!


PART1:程序目标设计

黑白名单系统的目标很简单,分为以下几点:

  1. 名单
  2. 确认本地玩家是否是名单中的人
  3. 如果是-执行操作,如果不是-略过

     

至于具体对名单人执行什么操作,我们可以通过将customEVENT发送到下一个udon,让其他的udon来执行具体操作,而黑白名单系统只需要做好自己的事情——确认玩家是否存在于黑白名单中

 

PART2:设计参数

EVENT:事件选择

首先我们肯定是加入地图就决定玩家是不是白名单了所以我们要脚本从加入地图开始执行。而且仅需要执行一次

所以事件的触发我们选择——Events:Start  从玩家加入开始执行

image.png

Variables:参数选择

在参数上我们需要

1:udonBehavious

用于把customEvent发送出去

2:string[]

用于存放白名单/黑名单

3:string

用于存放customEvent名称

具体命名如下:

image.png

PART3:设计程序

第一步:获取本地玩家名称

首先我们需要获取本地玩家名称,这将会用到两个模块。

1.Get Localplayer :获取本地玩家信息

image.png

该组件会输出包含玩家所有信息的VRCPlayerAPI属性

2.Get displayName:获取本地玩家名称

image.png

该组件会从PlayerApi当中输出玩家的名字,以string字符串的方式

到这一步,我们完成了获取本地玩家名称的任务,储存方式为string

image.png

第二步:判断玩家是否处于名单内

我们需要用到两个组件来完成判断:IndexOF与Equals

image.png

IndexOF提供了一个接口,允许在事件接入时检查Value是否与Array内的元素相同,如果相同则返回相同元素所在的层级,如果不相同则返回-1

 

Equals则会确认int值是否等于obj,这里将值设为常数-1

在左侧的Array一栏输入参数-string[]-数组,下方Value输入上文获取的LocalPlay Displayname。IndexOF会比对玩家名称与string[]中存放的玩家名称名单是否有相同的。并输出到int值。已知如果不存在则会输出-1,那么仅需要检测值是否不等于-1,即可得知玩家是否属于名单内。

所以Udon Graph里面应该这么写——

image.png

第三步:发送结果

至此我们已经完成了从获取玩家名称到判断是否属于白名单的整个过程了,剩下的只需要加入我们喜闻乐见的发送事件(结果)到其他Udon脚本即可

image.png

恭喜你,到这里你已经完成了一个基于UDON Graph的本地白/黑名单系统的构筑。

下面是UDON Graph全貌:

image.png

Q:如何添加白名单/黑名单?

只需要打开PlayerList的stringArray,然后为他写入default 值即可


进阶篇:黑白名单系统联网

本篇将会将前述的黑白名单系统的黑白名单的获取方式,从手动写入改成从互联网上拉取。


PART1:程序目标设计

  1. 通过网络下载黑名单文件(通常为TXT或JSON,这期只讨论TXT类型)
  2. 本地获取文件后转化为需要的string数组
  3. 将数组发送给上一期的”白名单系统“

 

在开始新脚本的设计之前,我们需要对老脚本进行一些更改

1:将事件触发方式(Events)从Start改为CustomEvent

 CustomEvent可以允许脚本被其他脚本触发,我们必须保证黑名单完成了装载再执行脚本。

e0e9e326c61b6bf699717a10be728d22.png

在完成这部分的更改之后,我们如愿进入核心部分,节点构筑:


Part2:设计参数

Event:事件选择

本次我们需要使用到两个Event事件

1:start:从游戏开始执行

2:OnstringLoadSuccess:当文件下载成功时,执行后续

image.png

Variables:参数选择

本次我们需要两个参数

1:udonBehaviour:用于指定需要Event激活和数组的UDON脚本

2:VRCUrl:用于存放下载黑名单文件所必须的URL文件。

具体命名如下:

image.png

Part:3:设计程序

第一步:设计数据包

已知我们所需要的是一个数组,但是TXT文件中只包含了一个string字符串,我们不能直接使用TXT来传递数组。但是我们可以通过规定分隔符,下载到脚本后通过Split来将String转换为String[]数组。

在这里我选择使用[#]作为分隔符。

假设我需要设计一个包含1-9的黑名单,则在TXT里面应该是

image.png

第二步:从网络上拉取文件

UDON为我们提供了一个组件——LoadUrl,让我们可以访问互联网发出一个GET指令到指定 URL,获取数据包。

image.png

第三步:提取数据

OnstringLoadSuccess除了提供了下载成功后的事件执行以外,还提供了一个数据接口,让我们通过这个数据接口来获取刚刚下载的信息。

image.png

不过这个数据还不可以直接使用,我们需要使用Get Result来将其转化为string,才能进行后续操作

image.png

将二者连接之后,我们成功的将文件以string的形式导入进了UDON里面。

image.png

第四步:将string以转换为string[]

为了将string转换为数组,我们需要使用Split来进行转化,Split会按照一定的规则来将输入的string切割,在选择Regex分类的Split会将转化后的切片以String[]的方式储存,刚刚好符合我们的要求。

image.png

第五步:将数组发送到下一个脚本,并且激活下一级脚本。

我们需要使用SetProgramVariable来传递我们处理好的数据,这个模块会直接覆写指定的脚本的指定参数,来达到传递数值的效果。

再然后,我们使用SendCustomEvent向下一个脚本发出事件。

image.png

至此完成了数据下载-数据处理-数据传输-链接执行脚本的全过程。

下面是UDON Graph全貌

image.png

恭喜您完成了进阶学习~

感谢您的观看,我是麦哲伦,咱们下期再见~

鸣谢:

VRCD中文创作者协会

代理猫猫