脚本通信
在M8Test中,脚本之间通过事件实现通信,采用订阅-发布模式:
接收事件的脚本需先订阅相应事件
发送事件的脚本通过发布操作触发事件
事件分为两种类型:
全局事件:可被所有脚本订阅
本地事件:仅允许与当前脚本共享同一脚本引擎的其他脚本订阅
事件订阅端
package com.example.script.side1
import com.m8test.script.GlobalVariables.*
fun side1Run() {
// 获取事件订阅器,用于订阅事件
val subscriber = _events.getSubscriber()
// 通过订阅器订阅本地事件,本地事件指的是由和当前脚本具有同一个脚本引擎的脚本发送的事件
subscriber.subscribeLocally({
// 设置本地订阅的频道
setChannel("subscription-channel")
// 设置本地订阅的id
setId("subscription-id")
}) {
// 当收到同一个引擎中的其他脚本发送的事件时,会执行下面的逻辑
_console.log("收到事件", it.getData(), it.getTime(), it.getChannel())
}
// 通过订阅器订阅全局事件,全局事件指的是所有其他脚本发送的事件
subscriber.subscribeGlobally({
// 设置全局订阅的频道
setChannel("subscription-channel")
// 设置全局订阅的id
setId("subscription-id")
}) {
// 当收到其他脚本发送的事件时,会执行下面的逻辑
_console.log("收到事件", it.getData(), it.getTime(), it.getChannel())
}
// 获取脚本主线程
val mainThread = _script.getThreads().getMain()
// 获取定时器
val timer = mainThread.getTimer()
// 添加一个延时任务,为了防止脚本过早结束
timer.setTimeout({
// 保持脚本3秒钟不结束
}, 3000)
}
// 下面的语句中的 '//-m8test-remove' 在实际编译时会被删除,也就是将会改成 'side1Run();', 但是不能省略,否则 side1Run 方法不会被执行
//-m8test-remove side1Run();
// 获取事件订阅器,用于订阅事件
def subscriber = $events.getSubscriber()
// 通过订阅器订阅本地事件,本地事件指的是由和当前脚本具有同一个脚本引擎的脚本发送的事件
subscriber.subscribeLocally({
// 设置本地订阅的频道
it.setChannel("subscription-channel")
// 设置本地订阅的id
it.setId("subscription-id")
}) {
// 当收到同一个引擎中的其他脚本发送的事件时,会执行下面的逻辑
$console.log("收到事件", it.getData(), it.getTime(), it.getChannel())
}
// 通过订阅器订阅全局事件,全局事件指的是所有其他脚本发送的事件
subscriber.subscribeGlobally({
// 设置全局订阅的频道
it.setChannel("subscription-channel")
// 设置全局订阅的id
it.setId("subscription-id")
}) {
// 当收到其他脚本发送的事件时,会执行下面的逻辑
$console.log("收到事件", it.getData(), it.getTime(), it.getChannel())
}
// 获取脚本主线程
def mainThread = $script.getThreads().getMain()
// 获取定时器
def timer = mainThread.getTimer()
// 添加一个延时任务,为了防止脚本过早结束
timer.setTimeout({
// 保持脚本3秒钟不结束
}, 3000)
import com.m8test.script.core.api.event.Event;
import com.m8test.script.core.api.event.GlobalSubscription;
import com.m8test.script.core.api.event.LocalSubscription;
import com.m8test.script.core.api.event.Subscriber;
import com.m8test.script.core.api.thread.NewScriptThread;
import com.m8test.script.core.api.thread.Timer;
import kotlin.jvm.functions.Function1;
import static com.m8test.script.GlobalVariables.*;
class test {
public static void run() {
// 获取事件订阅器,用于订阅事件
Subscriber subscriber = $events.getSubscriber();
// 通过订阅器订阅本地事件,本地事件指的是由和当前脚本具有同一个脚本引擎的脚本发送的事件
subscriber.subscribeLocally(new Function1() {
@Override
public Object invoke(Object localSubscription) {
LocalSubscription it = (LocalSubscription) localSubscription;
// 设置本地订阅的频道
it.setChannel("subscription-channel");
// 设置本地订阅的id
it.setId("subscription-id");
return null;
}
}, new Function1() {
@Override
public Object invoke(Object event) {
Event it = (Event) event;
// 当收到同一个引擎中的其他脚本发送的事件时,会执行下面的逻辑
$console.log("收到事件", it.getData(), it.getTime(), it.getChannel());
return null;
}
});
// 通过订阅器订阅全局事件,全局事件指的是所有其他脚本发送的事件
subscriber.subscribeGlobally(new Function1() {
@Override
public Object invoke(Object globalSubscription) {
GlobalSubscription it = (GlobalSubscription) globalSubscription;
// 设置全局订阅的频道
it.setChannel("subscription-channel");
// 设置全局订阅的id
it.setId("subscription-id");
return null;
}
}, new Function1() {
@Override
public Object invoke(Object event) {
Event it = (Event) event;
// 当收到其他脚本发送的事件时,会执行下面的逻辑
$console.log("收到事件", it.getData(), it.getTime(), it.getChannel());
return null;
}
});
// 获取脚本主线程
NewScriptThread mainThread = $script.getThreads().getMain();
// 获取定时器
Timer timer = mainThread.getTimer();
// 添加一个延时任务,为了防止脚本过早结束
timer.setTimeout(new Function1() {
@Override
public Object invoke(Object objects) {
// 保持脚本3秒钟不结束
return null;
}
}, 3000);
}
}
// 下面的语句中的 '//-m8test-remove' 在实际编译时会被删除,也就是将会改成 'test.run();', 但是不能省略,否则 run 方法不会被执行
//-m8test-remove test.run();
// 获取事件订阅器,用于订阅事件
let subscriber = $events.getSubscriber();
// 通过订阅器订阅本地事件,本地事件指的是由和当前脚本具有同一个脚本引擎的脚本发送的事件
subscriber.subscribeLocally(function (it) {
// 设置本地订阅的频道
it.setChannel("subscription-channel")
// 设置本地订阅的id
it.setId("subscription-id")
}, function (it) {
// 当收到同一个引擎中的其他脚本发送的事件时,会执行下面的逻辑
$console.log("收到事件", it.getData(), it.getTime(), it.getChannel())
})
// 通过订阅器订阅全局事件,全局事件指的是所有其他脚本发送的事件
subscriber.subscribeGlobally(function (it) {
// 设置全局订阅的频道
it.setChannel("subscription-channel")
// 设置全局订阅的id
it.setId("subscription-id")
}, function (it) {
// 当收到其他脚本发送的事件时,会执行下面的逻辑
$console.log("收到事件", it.getData(), it.getTime(), it.getChannel())
})
// 获取脚本主线程
let mainThread = $script.getThreads().getMain()
// 获取定时器
let timer = mainThread.getTimer()
// 添加一个延时任务,为了防止脚本过早结束
timer.setTimeout(function (it) {
// 保持脚本3秒钟不结束
}, 3000)
-- 获取事件订阅器,用于订阅事件
local subscriber = _events:getSubscriber()
-- 通过订阅器订阅本地事件,本地事件指的是由和当前脚本具有同一个脚本引擎的脚本发送的事件
subscriber:subscribeLocally(function(it)
-- 设置本地订阅的频道
it:setChannel("subscription-channel")
-- 设置本地订阅的id
it:setId("subscription-id")
end, function(it)
-- 当收到同一个引擎中的其他脚本发送的事件时,会执行下面的逻辑
_console:log("收到事件", it:getData(), it:getTime(), it:getChannel())
end)
-- 通过订阅器订阅全局事件,全局事件指的是所有其他脚本发送的事件
subscriber:subscribeGlobally(function(it)
-- 设置全局订阅的频道
it:setChannel("subscription-channel")
-- 设置全局订阅的id
it:setId("subscription-id")
end, function(it)
-- 当收到其他脚本发送的事件时,会执行下面的逻辑
_console:log("收到事件", it:getData(), it:getTime(), it:getChannel())
end)
-- 获取脚本主线程
local mainThread = _script:getThreads():getMain()
-- 获取定时器
local timer = mainThread:getTimer()
-- 添加一个延时任务,为了防止脚本过早结束
timer:setTimeout(function()
-- 保持脚本3秒钟不结束
end, 3000)
<?php
/** @var m8test_java\com\m8test\script\core\api\console\Console $console */
/** @var m8test_java\com\m8test\script\core\api\event\Events $events */
// 获取事件订阅器,用于订阅事件
$subscriber = $events->getSubscriber();
// 通过订阅器订阅本地事件,本地事件指的是由和当前脚本具有同一个脚本引擎的脚本发送的事件
$subscriber->subscribeLocally(function ($it) {
// 设置本地订阅的频道
$it->setChannel("subscription-channel");
// 设置本地订阅的id
$it->setId("subscription-id");
}, function ($it) use ($console) {
// 当收到同一个引擎中的其他脚本发送的事件时,会执行下面的逻辑
$console->log(javaString("收到事件"), $it->getData(), $it->getTime(), $it->getChannel());
});
// 通过订阅器订阅全局事件,全局事件指的是所有其他脚本发送的事件
$subscriber->subscribeGlobally(function ($it) {
// 设置全局订阅的频道
$it->setChannel("subscription-channel");
// 设置全局订阅的id
$it->setId("subscription-id");
}, function ($it) use ($console) {
// 当收到其他脚本发送的事件时,会执行下面的逻辑
$console->log(javaString("收到事件"), $it->getData(), $it->getTime(), $it->getChannel());
});
/** @var m8test_java\com\m8test\script\core\api\engine\Script $script */
// 获取脚本主线程
$mainThread = $script->getThreads()->getMain();
// 获取定时器
$timer = $mainThread->getTimer();
// 添加一个延时任务,为了防止脚本过早结束
$timer->setTimeout(function ($it) {
// 保持脚本3秒钟不结束
}, 3000);
from m8test_java.com.m8test.script.GlobalVariables import _console
from m8test_java.com.m8test.script.GlobalVariables import _events
from m8test_java.com.m8test.script.GlobalVariables import _script
# 获取事件订阅器,用于订阅事件
subscriber = _events.getSubscriber()
# 通过订阅器订阅本地事件,本地事件指的是由和当前脚本具有同一个脚本引擎的脚本发送的事件
subscriber.subscribeLocally(lambda it:
# 设置本地订阅的频道
(it.setChannel("subscription-channel"),
# 设置本地订阅的id
it.setId("subscription-id")),
lambda it:
# 当收到同一个引擎中的其他脚本发送的事件时,会执行下面的逻辑
_console.log("收到事件", it.getData(), it.getTime(), it.getChannel())
)
# 通过订阅器订阅全局事件,全局事件指的是所有其他脚本发送的事件
subscriber.subscribeGlobally(lambda it:
# 设置全局订阅的频道
(it.setChannel("subscription-channel"),
# 设置全局订阅的id
it.setId("subscription-id")
), lambda it:
# 当收到其他脚本发送的事件时,会执行下面的逻辑
_console.log("收到事件", it.getData(), it.getTime(), it.getChannel())
)
# 获取脚本主线程
mainThread = _script.getThreads().getMain()
# 获取定时器
timer = mainThread.getTimer()
# 添加一个延时任务,为了防止脚本过早结束
timer.setTimeout(lambda it: it
# 保持脚本3秒钟不结束
, 3000)
# encoding: utf-8
# 获取事件订阅器,用于订阅事件
subscriber = $events.getSubscriber()
java_import "com.m8test.script.core.api.event.LocalSubscription"
java_import "com.m8test.script.core.api.event.Event"
# 通过订阅器订阅本地事件,本地事件指的是由和当前脚本具有同一个脚本引擎的脚本发送的事件
subscriber.subscribeLocally(lambda {
# @type it [LocalSubscription]
|it|
# 设置本地订阅的频道
it.setChannel("subscription-channel")
# 设置本地订阅的id
it.setId("subscription-id")
}) {
# @type it [Event]
|it|
# 当收到同一个引擎中的其他脚本发送的事件时,会执行下面的逻辑
$console.log("收到事件", it.getData(), it.getTime(), it.getChannel())
}
java_import "com.m8test.script.core.api.event.GlobalSubscription"
# 通过订阅器订阅全局事件,全局事件指的是所有其他脚本发送的事件
subscriber.subscribeGlobally(lambda {
# @type it [GlobalSubscription]
|it|
# 设置全局订阅的频道
it.setChannel("subscription-channel")
# 设置全局订阅的id
it.setId("subscription-id")
}) {
# @type it [Event]
|it|
# 当收到其他脚本发送的事件时,会执行下面的逻辑
$console.log("收到事件", it.getData(), it.getTime(), it.getChannel())
}
# 获取脚本主线程
mainThread = $script.getThreads().getMain()
# 获取定时器
timer = mainThread.getTimer()
# 添加一个延时任务,为了防止脚本过早结束
timer.setTimeout(lambda { |it|
# 保持脚本3秒钟不结束
}, 3000)
事件发布端
import com.m8test.script.GlobalVariables._events
fun side2Run() {
// 获取事件发布器,用于发布事件
val publisher = _events.getPublisher()
// 发送本地事件,只有同一个脚本引擎启动的脚本并且本地订阅的频道和id都相同时才能收到
publisher.publishLocally({
// 设置本地订阅的频道
setChannel("subscription-channel")
// 设置本地订阅的id
setId("subscription-id")
}) {
// 需要发送的数据,这里发送简单的字符串,如果需要复杂结构,推荐使用json格式的字符串
setData("本地事件")
}
// 发送全局事件,只有全局订阅的频道和id都相同时才能收到
publisher.publishGlobally({
// 设置全局订阅的频道
setChannel("subscription-channel")
// 设置全局订阅的id
setId("subscription-id")
}) {
// 需要发送的数据,这里发送简单的字符串,如果需要复杂结构,推荐使用json格式的字符串
setData("全局事件")
}
}
// 下面的语句中的 '//-m8test-remove' 在实际编译时会被删除,也就是将会改成 'side2Run();', 但是不能省略,否则 side2Run 方法不会被执行
//-m8test-remove side2Run();
// 获取事件发布器,用于发布事件
def publisher = $events.getPublisher()
// 发送本地事件,只有同一个脚本引擎启动的脚本并且本地订阅的频道和id都相同时才能收到
publisher.publishLocally({
// 设置本地订阅的频道
it.setChannel("subscription-channel")
// 设置本地订阅的id
it.setId("subscription-id")
}) {
// 需要发送的数据,这里发送简单的字符串,如果需要复杂结构,推荐使用json格式的字符串
it.setData("本地事件")
}
// 发送全局事件,只有全局订阅的频道和id都相同时才能收到
publisher.publishGlobally({
// 设置全局订阅的频道
it.setChannel("subscription-channel")
// 设置全局订阅的id
it.setId("subscription-id")
}) {
// 需要发送的数据,这里发送简单的字符串,如果需要复杂结构,推荐使用json格式的字符串
it.setData("全局事件")
}
import com.m8test.script.core.api.event.Event;
import com.m8test.script.core.api.event.GlobalSubscription;
import com.m8test.script.core.api.event.LocalSubscription;
import com.m8test.script.core.api.event.Publisher;
import kotlin.jvm.functions.Function1;
import static com.m8test.script.GlobalVariables.$events;
class test1 {
public static void run() {
// 获取事件发布器,用于发布事件
Publisher publisher = $events.getPublisher();
// 发送本地事件,只有同一个脚本引擎启动的脚本并且本地订阅的频道和id都相同时才能收到
publisher.publishLocally(new Function1() {
@Override
public Object invoke(Object localSubscription) {
LocalSubscription it = (LocalSubscription) localSubscription;
// 设置本地订阅的频道
it.setChannel("subscription-channel");
// 设置本地订阅的id
it.setId("subscription-id");
return null;
}
}, new Function1() {
@Override
public Object invoke(Object event) {
Event it = (Event) event;
// 需要发送的数据,这里发送简单的字符串,如果需要复杂结构,推荐使用json格式的字符串
it.setData("本地事件");
return null;
}
});
// 发送全局事件,只有全局订阅的频道和id都相同时才能收到
publisher.publishGlobally(new Function1() {
@Override
public Object invoke(Object globalSubscription) {
GlobalSubscription it = (GlobalSubscription) globalSubscription;
// 设置全局订阅的频道
it.setChannel("subscription-channel");
// 设置全局订阅的id
it.setId("subscription-id");
return null;
}
}, new Function1() {
@Override
public Object invoke(Object event) {
Event it = (Event) event;
// 需要发送的数据,这里发送简单的字符串,如果需要复杂结构,推荐使用json格式的字符串
it.setData("全局事件");
return null;
}
});
}
}
// 下面的语句中的 '//-m8test-remove' 在实际编译时会被删除,也就是将会改成 'test1.run();', 但是不能省略,否则 run 方法不会被执行
//-m8test-remove test1.run();
// 获取事件发布器,用于发布事件
let publisher = $events.getPublisher()
// 发送本地事件,只有同一个脚本引擎启动的脚本并且本地订阅的频道和id都相同时才能收到
publisher.publishLocally(function (it) {
// 设置本地订阅的频道
it.setChannel("subscription-channel")
// 设置本地订阅的id
it.setId("subscription-id")
}, function (it) {
// 需要发送的数据,这里发送简单的字符串,如果需要复杂结构,推荐使用json格式的字符串
it.setData("本地事件")
})
// 发送全局事件,只有全局订阅的频道和id都相同时才能收到
publisher.publishGlobally(function (it) {
// 设置全局订阅的频道
it.setChannel("subscription-channel")
// 设置全局订阅的id
it.setId("subscription-id")
}, function (it) {
// 需要发送的数据,这里发送简单的字符串,如果需要复杂结构,推荐使用json格式的字符串
it.setData("全局事件")
})
-- 获取事件发布器,用于发布事件
local publisher = _events:getPublisher()
-- 发送本地事件,只有同一个脚本引擎启动的脚本并且本地订阅的频道和id都相同时才能收到
publisher:publishLocally(function(it)
-- 设置本地订阅的频道
it:setChannel("subscription-channel")
-- 设置本地订阅的id
it:setId("subscription-id")
end, function(it)
-- 需要发送的数据,这里发送简单的字符串,如果需要复杂结构,推荐使用json格式的字符串
it:setData("本地事件")
end)
-- 发送全局事件,只有全局订阅的频道和id都相同时才能收到
publisher:publishGlobally(function(it)
-- 设置全局订阅的频道
it:setChannel("subscription-channel")
-- 设置全局订阅的id
it:setId("subscription-id")
end, function(it)
-- 需要发送的数据,这里发送简单的字符串,如果需要复杂结构,推荐使用json格式的字符串
it:setData("全局事件")
end)
<?php
/** @var m8test_java\com\m8test\script\core\api\event\Events $events */
// 获取事件发布器,用于发布事件
$publisher = $events->getPublisher();
// 发送本地事件,只有同一个脚本引擎启动的脚本并且本地订阅的频道和id都相同时才能收到
$publisher->publishLocally(function ($it) {
// 设置本地订阅的频道
$it->setChannel("subscription-channel");
// 设置本地订阅的id
$it->setId("subscription-id");
}, function ($it) {
// 需要发送的数据,这里发送简单的字符串,如果需要复杂结构,推荐使用json格式的字符串
$it->setData(javaString("本地事件"));
});
// 发送全局事件,只有全局订阅的频道和id都相同时才能收到
$publisher->publishGlobally(function ($it) {
// 设置全局订阅的频道
$it->setChannel("subscription-channel");
// 设置全局订阅的id
$it->setId("subscription-id");
}, function ($it) {
// 需要发送的数据,这里发送简单的字符串,如果需要复杂结构,推荐使用json格式的字符串
$it->setData(javaString("全局事件"));
});
from m8test_java.com.m8test.script.GlobalVariables import _events
# 获取事件发布器,用于发布事件
publisher = _events.getPublisher()
# 发送本地事件,只有同一个脚本引擎启动的脚本并且本地订阅的频道和id都相同时才能收到
publisher.publishLocally(lambda it:
# 设置本地订阅的频道
(it.setChannel("subscription-channel"),
# 设置本地订阅的id
it.setId("subscription-id")
), lambda it:
# 需要发送的数据,这里发送简单的字符串,如果需要复杂结构,推荐使用json格式的字符串
it.setData("本地事件")
)
# 发送全局事件,只有全局订阅的频道和id都相同时才能收到
publisher.publishGlobally(lambda it:
# 设置全局订阅的频道
(it.setChannel("subscription-channel"),
# 设置全局订阅的id
it.setId("subscription-id")
), lambda it:
# 需要发送的数据,这里发送简单的字符串,如果需要复杂结构,推荐使用json格式的字符串
it.setData("全局事件")
)
# encoding: utf-8
# 获取事件发布器,用于发布事件
publisher = $events.getPublisher()
java_import "com.m8test.script.core.api.event.LocalSubscription"
java_import "com.m8test.script.core.api.event.Event"
# 发送本地事件,只有同一个脚本引擎启动的脚本并且本地订阅的频道和id都相同时才能收到
publisher.publishLocally(lambda {
# @type it [LocalSubscription]
|it|
# 设置本地订阅的频道
it.setChannel("subscription-channel")
# 设置本地订阅的id
it.setId("subscription-id")
}) {
# @type it [Event]
|it|
# 需要发送的数据,这里发送简单的字符串,如果需要复杂结构,推荐使用json格式的字符串
it.setData("本地事件")
}
java_import "com.m8test.script.core.api.event.GlobalSubscription"
# 发送全局事件,只有全局订阅的频道和id都相同时才能收到
publisher.publishGlobally(lambda {
# @type it [GlobalSubscription]
|it|
# 设置全局订阅的频道
it.setChannel("subscription-channel")
# 设置全局订阅的id
it.setId("subscription-id")
}) {
# @type it [Event]
|it|
# 需要发送的数据,这里发送简单的字符串,如果需要复杂结构,推荐使用json格式的字符串
it.setData("全局事件")
}
Last modified: 01 October 2025