meta data for this page
📚 Client/Main
在当前版本下,Client
脚本更适合实现客户端独有的功能、GUI界面等。
有关世界内容的玩法(如:Player、Character、Vehicle等)建议优先使用World
脚本实现。
如果有某些功能只有ClientAPI支持,可以用SendDataToServer
相关方法与服务端进行二次通信,以实现“通过服务端让某个玩家执行一个ClientAPI”。
📒 Event
📘 OnScriptLoad()
当客户端脚本被完整加载后调用,部分API需要放置在此事件执行才有效,因为至此脚本才加载完毕。
注意:此事件并非是客户端首个运行事件,通常会等待Player
完整加载后才会执行,因此部分有关OnPlayerXXX
的事件可能会更加提前。
BindKey(...); //Invalid, Script not loaded function OnScriptLoad() { BindKey(...); //Correct }
📘 OnScriptUnload()
当脚本即将被释放时调用。
📘 OnFrameUpdate( deltaTime )
当脚本加载完成后每帧调用。
由于此事件属于客户端脚本范畴,所以可以理解为每帧渲染事件,无须担心延迟问题。
deltaTime:float //增量时间
📘 OnFixedUpdate( fixedDeltaTime )
此事件在V0.79版本起停止使用。
当脚本加载完成后固定增量时间调用(与Unity原理相同)。
此事件会以FixedUpdate
的方式每隔固定时间调用,通常情况下可以忽略使用此事件。
fixedDeltaTime:float //增量时间
📘 OnLocalCommand( cmd, arg )
当本地客户端发送一条指令之前调用(玩家本地输入指令发送)。
此事件将决定是否投递指令到服务端,如果返回true
(或忽略)则默认投递,否则返回false
则拦截此指令,不会发送到服务端执行。
此事件可供实现一些内置的“本地游戏指令”,例如可实现输入"quitgame"
退出游戏等功能。
注意:对于少数引擎内置的指令(如quit\q\version\disconnect...
)不会被接收和调用,这是不可拦截的。
📘 OnServerStreamData( number, data )
当接收到来自服务端发送的自定义数据时调用,这是客户端与服务端传输自定义信息的方式之一。
自定义信息数据由float(int)\string
两个参数组成。
对于一些特殊情况,可以利用JSON(data参数)进行更详细的内容传输。
📘 OnKeyDown( keyTag )
当脚本通过BindKey()
绑定的按键被按下时调用。
function OnKeyDown( keyTag ) { //keyTag表示按键标签,而不是按键代码 }
📘 OnKeyUp( keyTag )
当脚本通过BindKey()
绑定的按键被抬起时调用。
function OnKeyUp( keyTag ) { //keyTag表示按键标签,而不是按键代码 }
📘 OnNativeKeyDown( keyTag )
当脚本通过BindNativeKey()
绑定的按键被按下时调用。
function OnNativeKeyDown( keyTag ) { //keyTag表示按键标签,而不是按键代码 }
📘 OnNativeKeyUp( keyTag )
当脚本通过BindNativeKey()
绑定的按键被抬起时调用。
function OnNativeKeyUp( keyTag ) { //keyTag表示按键标签,而不是按键代码 }
📘 OnTimeChange( oldTime, newTime )
当世界时间发生改变时调用。
function OnTimeChange( oldTime, newTime ) { DLog("OldTime: " + oldTime.Hour + "-" + oldTime.Minute); DLog("NewTime: " + newTime.Hour + "-" + newTime.Minute); }
📒 Function
📘 Exec()
执行一段脚本代码(Client\World脚本不互通)。
代码内容可能出现报错,考虑使用try\catch进行防范。
function Exec( code: string )
📘 OpenUrl()
请求访问一个网络或本地路径,执行后将由玩家决定是否打开Url。
如果希望访问一个本地路径(或执行),请将url路径前增加file://
路径前缀。
function OpenUrl( url: string )
📘 BindGameMenuButton()
绑定当前场景自定义ESC菜单按钮。
此方法适用于对模组主菜单没有特殊\高级自定义需求(否则应该考虑使用FairyGUI自制菜单),可以通过此方法快速的建立一个游戏原生主菜单。
注意:此方法通常只需要在主菜单场景执行一次,绑定代码只在当前场景生效,切换场景后将会自动重置默认绑定。
此方法支持绑定内置(宏)按钮,这将直接引用引擎内置按钮(功能及翻译),详情可参考下方表格。
如果绑定的是一个内置按钮,则只需要填写参数0即可。
内置按钮(宏) | 说明 |
---|---|
@default | 绑定默认引擎菜单(游戏选项、多人游戏、地图编辑器、开发者名单、引擎首页、退出游戏……) |
@space | 绑定显示空行(分割显示) |
@options | 游戏选项 |
@multiplayer | 多人游戏浏览器 |
@mapeditor | 地图编辑器 |
@developers | 开发者名单 |
@native | 沙盘引擎首页(模组选择页) |
@quit | 退出游戏 |
注意:当玩家处于非主菜单(初始Main场景)界面时,引擎会自动补充【继续游戏】、【返回主菜单】两个额外的菜单按钮。
function BindGameMenuButton( titleOrKey: string, info: string = null, callback: Action = null )
function OnScriptLoad() { //Custom Item BindGameMenuButton("启动主机", "建立本地联机服务器", () => { CreateHost("mapname", "scriptname"); }); BindGameMenuButton("[color=#ffff00]加入本地服务器[/color]", "加入本地服务器(127.0.0.1)", () => { ConnectHost("127.0.0.1"); }); //Internal Item BindGameMenuButton("@space"); BindGameMenuButton("@mapeditor"); }
📘 UnbindAllGameMenuButton()
取消绑定所有主菜单界面按钮项目(包括引擎默认按钮)。
注意:此方法会清空所有菜单按钮,如果希望重置为默认引擎按钮,应该手动执行一次BindGameMenuButton("@default");
。
function UnbindAllGameMenuButton()
📘 SetGameMenuBGEffect()
设置游戏菜单世界背景效果开关(通常为Blur
效果),默认开启,模组周期全局生效。
function SetGameMenuBGEffect( active: bool = true )
📘 SetGameMenuStyle()
设置游戏菜单风格样式,默认值为0
。
function SetGameMenuStyle( style: int )
Style | 样式 |
---|---|
-1(已过时) | 隐藏内置游戏菜单,通常配合FairyGUI 高度自定义使用(仅限Main主菜单,游戏世界仍然使用内置菜单风格) |
0(默认) | 内置菜单风格,但使用\GameMenu.png || \Cover.png 作为不透明底图 |
1 | 内置风格菜单,但不显示背景图片,直接显示世界相机视角 |
📘 GetGameMenuStyle()
获取游戏菜单风格样式。
function GetGameMenuStyle(): int
📘 CreateNativeView()
打开一个引擎内置UI面板(如设置、服务器列表、MOD管理器等)。
function OpenNativeView( int type, Action onDisable = null )
ID | 面板描述 |
---|---|
0 | 开发者界面(关于界面) |
1 | 游戏设置 |
2 | 多人游戏浏览器 |
4 |
尽管有些ID没有被表格记录,但有可能仍然是有内容的,但未被记录的ID通常不具备通用性意义,在打开时将会别引擎阻断。
📘 ExistNativeView()
检查某个引擎内置UI界面是否存在(被打开)。
function ExistNativeView( type: int ): bool
📘 DestroyNativeView()
关闭一个引擎内置UI面板。
function DestroyNativeView(type: int = -1, hasEffect: bool = true) //如果不填写参数(-1),则默认关闭所有内置UI面板 //如果hasEffect == false则立即关闭面板
📘 LoadNativeScene()
载入一个引擎内置场景(如地图编辑器等)。
function LoadNativeScene( type: int )
📘 CreateNativeMenu()
为本地玩家建立一个NativeMenu
菜单(等同于WorldScript/player.CreateNativeMenu()
的客户端版本)。
更多内容请查看NativeMenu菜单。
function CreateNativeMenu( viewData: any )
📘 DestroyNativeMenu()
为本地玩家关闭NativeMenu
菜单。
function DestroyNativeMenu()
📘 SetNativeMenuText()
为本地玩家设置菜单中某项的文本。
function SetNativeMenuText( index: int, text: string ) //index: (-1 > 标题, -2 > 子标题, 0+ > 索引Item) function SetNativeMenuText( tag: string, text: string ) //同理,区别是通过tag参数来选择改变的Item
📘 GetCurrentNativeMenuTag()
获取当前正在显示的NativeMenu
菜单Tag(获取自viewData.Tag
),默认为空文本。
此方法可用于区分多个菜单实例,以当前正在显示的为准。
function GetCurrentNativeMenuTag(): string
📘 CreateRadialMenu()
为本地玩家建立一个RadialMenu
轮盘菜单(等同于WorldScript/player.CreateRadialMenu()
的客户端版本)。
更多内容请查看RadialMenu菜单。
function CreateRadialMenu( viewData: any )
📘 DestroyRadialMenu()
为本地玩家关闭RadialMenu
轮盘菜单。
function DestroyRadialMenu()
📘 GetCurrentRadialMenuTag()
获取当前正在显示的RadialMenu
轮盘菜单Tag(获取自viewData.Tag
),默认为空文本。
此方法可用于区分多个菜单实例,以当前正在显示的为准。
function GetCurrentRadialMenuTag(): string
📘 SendDataToServer()
发送一条自定义数据消息到服务端,此功能合理使用可扩展许多效果。
服务端收到数据后,将由OnPlayerStreamData()
事件接收。
注意:这里不应该放置特别大的数据内容,否则可能造成网络阻塞。
function SendDataToServer( number: float(int), data: string = "" )
📘 SetChatEnabled()
设置游戏聊天框启用开关,当聊天框被禁止后,玩家将无法显示或开启聊天框。
此功能主要用于主菜单界面,此时通常不希望玩家使用“聊天”功能,在Main
场景中是默认被禁止的。
function SetChatEnabled( enable: bool )
📘 GetChatEnabled()
获取游戏聊天框开关。
function GetChatEnabled(): bool
📘 SetChatPanelPivot()
设置游戏聊天框锚点位置(强制),默认值为-1
(遵循游戏默认设置),通过此方法设定位置后,即使玩家在游戏选项设置了锚点位置,也会优先使用当前方法所设置的位置。
此功能适用于部分U丰富的模组,可能不希望聊天框占用模组UI位置(例如血条、状态条、信息面板等),可以使用此方法强制设定聊天框位置。
function SetChatPanelPivot( pivot: int = -1 )
SetChatPanelPivot(-1); //Use engine config (default) SetChatPanelPivot(0); //Change pivot to Left_Top SetChatPanelPivot(1); //Change pivot to Left_Center SetChatPanelPivot(2); //Change pivot to Left_Bottom
📘 ScreenFade()
执行一次全屏转场(Alpha: 0 -> 1 -> 0
)。
function ScreenFade( time: float, middleTime = 0, color: Color = Color(0, 0, 0), isTop: bool = true, onMiddle = null, ignoreHit: bool = true ) /* time:渐变时间(渐入>不透明>渐出),例如设置为2,则表示0~1秒变不透明,1~2秒变透明 middleTime:不透明延迟时间,默认为0,否则将等待X秒后再进行透明渐变 color:颜色,默认为黑色 isTop:是否顶层,默认为true onMiddle:可选委托事件,当颜色完成不透明时调用 ignoreHit:转场是否屏蔽点击,默认为true */
📘 ScreenFadeIn()
执行一次全屏渐入转场(Alpha: 0 -> 1
)。
function ScreenFadeIn( time: float, color: Color = Color(0, 0, 0), isTop: bool = true, onComplete = null, ignoreHit: bool = true ) /* time:整体时间(渐入>不透明) color:颜色,默认为黑色 isTop:是否顶层,默认为true onComplete:可选委托事件,当颜色完成不透明时调用 ignoreHit:转场是否屏蔽点击,默认为true */
📘 ScreenFadeOut()
执行一次全屏渐出转场(Alpha: 1 -> 0
)。
function ScreenFadeOut( time: float, color: Color = Color(0, 0, 0), isTop: bool = true, onComplete = null, ignoreHit: bool = true ) /* time:整体时间(不透明>渐出) color:颜色,默认为黑色 isTop:是否顶层,默认为true onComplete:可选委托事件,当颜色完成透明时调用 ignoreHit:转场是否屏蔽点击,默认为true */
📘 Transition()
执行一次全屏转场特效(Alpha: 0 -> 1 -> 0
),不同的type
有不同的效果。
function Transition( type: int, addTime: float = 0, color: Color = Color(255, 255, 255), action: Action = null, isOut: bool = false )
- type:转场特效类型
- addTime:转场中途覆盖后,等待的延迟时间(默认为
0
,即为立即渐出) - color:转场特效颜色
- action:当转场中途完全覆盖时执行代码
- isOut:是否立即淡出
Type | 说明 |
---|---|
0 | 平滑淡入、淡出 |
1 | 左右对撞、撞开 |
2 | 上下对撞、撞开 |
3 | 向右推动覆盖、继续向右移出 |
4 | 上下分别向左右推动覆盖(类似街机游戏) |
5 | 圆圈缩小覆盖、放大淡出 |
6 | 方块旋转覆盖、类似相机镜头 |
7 | 多个方块覆盖、淡出 |
8 | 多个菱形覆盖、淡出 |
9 | 画笔涂擦覆盖、淡出 |
10 | 噪声覆盖、淡出 |
11 | 液体覆盖、淡出 |
📘 Message()
发送一条本地客户端消息(在消息框中)。
function Message( text: string )
📘 Announce()
发送一条本地公告\大文字消息,具体类型样式参考《世界资源实例汇总》。
function Announce( text: string, type: int = 0, time: float = 6 )
📘 Subtitle()
发送一条本地底部字幕消息。
function Subtitle( text: string )
📘 BindKey()
绑定一个脚本按键(当前场景有效),可用于监听某个键被按下\抬起。
按键参数可填写UnityEngine.KeyCode(Enum)索引或名称作为按键参数。
function BindKey( keyTag: string, key1: string, key2: string = "None", key3: string = "None" ) /* keyTag:按键标签(用于识别) key1:按键1标准名称(如'H') key2:默认'None',否则表示组合键 key3:默认'None',否则表示组合键 */
📘 UnbindKey()
取消绑定一个脚本按键,对其按键监听不再生效。
function UnbindKey( keyTag: string )
📘 UnbindAllKey()
取消绑定所有脚本按键,对其按键监听不再生效。
function UnbindAllKey()
📘 BindNativeKey()
绑定一个模组公开自定义按键(支持设置界面自定义按键),可用于监听某个键被按下\抬起。
按键参数可填写UnityEngine.KeyCode(Enum)索引或名称作为按键参数。
此方法设置的按键应该为【默认按键】,后续如果玩家自定义修改按键(例如B
),即使代码定义的仍然是【例如H
】,也会自动识别为玩家修改的【B
】键。
function BindNativeKey( keyTag: string, key1: string, key2: string = "None", key3: string = "None" ) /* keyTag:按键标签(用于识别) key1:按键1标准名称(例如'H') key2:默认'None',否则表示组合键 key3:默认'None',否则表示组合键 */
注意:此功能适合绑定一个【可供玩家自定义】的游戏按键,绑定后将会在【设置界面】自动出现对应的【按键绑定选项】,直到模组关闭前持续有效。
按键绑定选项只会在通过BindNativeKey()
注册过的场景打开设置菜单时出现,通常情况下,开发者只需在Main
场景绑定暴露一次即可,自定义选项会持续到模组关闭。
//Main Scene function OnScriptLoad() { //绑定注册,【设置菜单】会出现对应的绑定选项 BindNativeKey("EnterVehicle", "E"); //绑定一个E键按钮(默认按键) //打开设置菜单,会出现对应的绑定按钮 CreateNativeView(1); } //Any Scene function OnNativeKeyDown( key ) { if(key == "EnterVehicle") { DLog("按下进入载具按钮!"); } }
📘 UnbindNativeKey()
取消绑定一个模组公开自定义按键,对其按键监听不再生效及公开。
注意:如果玩家已打开【游戏设置】界面,取消绑定不会实时同步UI。
function UnbindNativeKey( keyTag: string )
📘 UnbindAllNativeKey()
取消绑定所有模组公开自定义按键,对其按键监听不再生效及公开。
注意:如果玩家已打开【游戏设置】界面,取消绑定不会实时同步UI。
function UnbindAllNativeKey()
📘 SetGameOption()
绑定一个公开游戏设置选项,选项将会显示在【游戏选项——模组设置】界面(Mod.XXXXX
)。
默认添加后没有对应翻译,因此会显示为翻译文本路径,可修改\附加翻译文件以正确显示文本。
模组选项保存路径:Archives\package.json
注意:此方法通常只负责公开属性占位,除初次使用参数填写默认值外,后续即使设置了属性参数,也不会修改替换此选项(而是由玩家通过【模组设置】自行修改),除非使用新的KeyPath
或value
类型发生改变(自动覆盖为新类型的默认值)。
通过此方法公开的设置选项将持续存在(即使切换场景),直到当前模组被关闭。
function SetGameOption( keyPath: string, value: any = null, param: any = null, overwrite: bool = false )
补充:Mod.InternalNull
是一个特殊空隙路径,填写此路径会默认被理解为是一个空行占位符号。
以下是简单案例,通常只需在Main
脚本绑定一次即可,后续直到模组被关闭前不会删除绑定。
//KeyPath "Mod.XXXXX" == "XXXXX" //Easy write method //Example SetGameOption("PlayerName", "UserName"); //InputField: default "UserName" SetGameOption("InternalNull"); //Null string SetGameOption("FlyMode", true); //Bool Select: default true SetGameOption("DamageMultiple", 50); //Progress 0~100: default 50.0 (50%) SetGameOption("PlayerSkin", "0|XXX", "Pig|Dog|Cat"); //Dropdown: default "Pig" (0) SetGameOption("PlayerSkin2", "2|XXX", "Pig|Dog|Cat"); //Dropdown: default "Cat" (2)
表达式 | 说明 |
---|---|
0 35.0 | 数值(可拖拽进度条),建议范围0.0~100.0 |
true false | 布尔值(选择框) |
Test | 文本(输入框) |
0|0 + Param: Item 1|Item2 | 文本+Param 参数(选择框) |
📘 GetGameOption()
获取一个模组游戏设置选项的值,可填写默认值参数(如果没有找到储存记录的话,返回defaultValue
)。
注意:此方法将返回取得数值的最终结果(number | bool | string
),其中选择框类型将直接返回索引(number
)。
function GetGameOption( keyTag: string, defaultValue: any = null ): any
📘 ReadFile()
从模组空间目录(Mod/Space
)读取一个文件(文本内容),如果文件不存在则反馈空白文本。
function ReadFile( fileName: string ): string
ReadFile( "Test.txt" ); //read: Mod/Space/Test.txt
📘 GetModArchive()
尝试读取指定模组的持久化存储数据,如不存在则返回空文本。
注意:如果不填写参数,默认获取当前模组的数据。
function GetModArchive( package: string = null ): string
📘 GetPropSourceData()
获取指定游戏道具最新默认原始数据,如果未被SetPropSourceData
重写过,则返回引擎原始数据。
function GetPropSourceData( prop: int, keyPath: string ): any
📘 GetTime()
获取游戏世界时间实例(WorldTime
)。
let worldTime = GetTime(); DLog("Hour: " + worldTime.Hour + ", Minute: " + worldTime.Minute);
📘 GetTimeRate()
获取游戏世界时间速率(游戏时间每分钟的时间间隔)。
function GetTimeRate(): float