LlSensorRepeat
| 首页 | 函数 | 事件 | 类型 | 操作符 | 常数 | Flow Control | Script Library | Categorized Library | Tutorials |
| 函数名 |
|---|
| Function: llSensorRepeat( string name, key id, integer type, float range, float arc, float rate ); |
| 参数:• string name – 对象或角色名称!
• key id – group, avatar or object UUID • integer type – mask (AGENT_BY_LEGACY_NAME, AGENT_BY_USERNAME, ACTIVE, PASSIVE, and/or SCRIPTED) • float range – 射程以米为单位[0.0,96.0] • float arc – 基本物体局部x轴与可探测物体之间的最大角度,距离[0.0,PI] • float rate – 一个sensor/no_sensor排队的频率。 |
| 返回值:对名称和id执行一次扫描,扫描类型在前向向量的距离米和弧弧度内,并在每个速率秒内重复。直到速率秒过后,它才执行第一次扫描。
如果id是无效的键或NULL_KEY,则将其视为空。 根据所使用的代理*标志决定名称的格式要求 |
| 注意事项 |
|---|
| 当搜索一个角色,但不是通过名字,它无关紧要的代理标志使用。
传感器事件的重复受到 time dilation(滞后)的不利影响。 放置在附件根部prim的传感器将使用化身面对的方向作为它们的向前矢量。在mouselook中,这意味着它会在化身所看的任何地方,而在mouselook之外,这意味着化身指向的任何方向。这并不包括化身的头指向哪里,或者化身正在做什么动画,只是如果你向前走,化身将移动的方向。无论物体附着在哪里,情况都是如此。 放置在附着物根prim以外的prim中的传感器,其正向方向将相对于根prim的正向方向偏移,例如,放置在prim中的传感器,如果其+X方向是根的反向,则传感器将向后看。 只有最近的传感器事件被排队。之前的传感器事件被替换。 重复传感器不能在状态更改时持续存在。 llSensorRepeat偶尔可以检测出它的指定范围外,每隔几个周期,当使用接近sim边界。定时器中的llSensor则不是。 每个脚本只能激活一个或零个llSensorRepeats。如果在没有调用llSensorRemove的情况下第二次调用llSensorRepeat,第一个llSensorRepeat将失效,第二个llSensorRepeat将替换它 |
| 示例 |
|---|
示例1
//作者:Steamy Latte。
//每30秒扫描10米以内的游客。
//当对象所有者在范围内时,向其报告新的访问者。
string AllAgents;
default
{
state_entry()
{
// arc=PI 是一个球体,你可以在物体面对的方向上看得更细一些,有/2,/4等等。
//为了避免滞后,不要重复太多。
llSensorRepeat("", "", AGENT_BY_LEGACY_NAME, 10.0, PI, 30.0);
}
sensor(integer num_detected)
{
string thisAgent;
integer agentNum;
for (agentNum=0; agentNum<num_detected; agentNum++)
{
thisAgent = llDetectedName(agentNum);
if (llDetectedKey(agentNum) == llGetOwner())
{
if (AllAgents != "")
{
llOwnerSay("We've had the following visitors:" + AllAgents);
AllAgents = "";
}
}
else if (llSubStringIndex(AllAgents+"\n", "\n"+thisAgent+"\n") < 0)
{
AllAgents = AllAgents + "\n" + thisAgent;
}
}
}
}
//作者Evans Love。
//(通过Void Singer限制最近的200个名称,以防止栈/堆冲突+清理)
//持续扫描10米以内的访问者,并向对象所有者报告新的访问者。
//-------------------------------------------------------------------------------------
integer RESPONSE_CHANNEL = -100;
float SCAN_RANGE = 10.0;
float SCAN_INTERVAL = 20.0;
list VISITOR_LIST;
default
{
state_entry()
{
llSensorRepeat("", NULL_KEY, AGENT_BY_LEGACY_NAME, SCAN_RANGE, PI, SCAN_INTERVAL);
}
sensor(integer number_detected)
{
integer agent_number;
//遍历所有检测到的代理
for (; agent_number < number_detected; agent_number++)
{
string this_agent_name = llDetectedName(agent_number);
key this_agent_key = llDetectedKey(agent_number);
//如果在列表中没有找到代理
if (llListFindList(VISITOR_LIST, [this_agent_name]) == -1)
{
//加上她/他,使名单保持最后200人
VISITOR_LIST = [this_agent_name] + llList2List(VISITOR_LIST, 0, 198);
llDialog(this_agent_key, "Welcome!", ["Ok"], RESPONSE_CHANNEL);
llOwnerSay(this_agent_name);
}
// else agent已经在列表中了
}
}
}
|
| 相关函数 |
|---|
| llSensor - 运行传感器一次
llSensorRemove - 停止llSensorRepeat计时器 llOverMyLand - 所有者的土地会发生什么 |
| 相关事件 |
|---|
| sensor - 当传感器探测到某物时触发
no_sensor - 当传感器探测不到任何东西时触发 |
附录:(表格)
| type Flag Mask | Description (llDetectedType) | Description (llSensor and llSensorRepeat() mask) | |
|---|---|---|---|
| AGENT_BY_LEGACY_NAME | 0x1 | Agents | 这用于按遗留名称查找代理。 |
| AGENT | 0x1 | Agents | 它还用于根据遗留名称查找代理,并且在功能上与AGENT_BY_LEGACY_NAME相同 |
| AGENT_BY_USERNAME | 0x10 | Reserved | 它用于按用户名查找代理。 |
| ACTIVE | 0x2 | Physical tasks. (Physical objects & agents) | 正在移动的物理对象或包含活动脚本的对象。因此,它现在正在使用SL服务器资源。 |
| PASSIVE | 0x4 | Non-physical objects. | 非脚本或脚本是不活动的和非物理的,如果是物理的,是不移动的。因此,它现在不使用SL服务器资源。 |
| SCRIPTED | 0x8 | Objects containing any active script. | 有任何脚本的对象,它现在在模拟器中做任何事情。 |