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. | 有任何脚本的对象,它现在在模拟器中做任何事情。 |