<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-CN">
	<id>http://i.bnu.edu.cn/wiki/index.php?action=history&amp;feed=atom&amp;title=%E8%99%9A%E6%8B%9F%E4%B8%96%E7%95%8C%2FNPC</id>
	<title>虚拟世界/NPC - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="http://i.bnu.edu.cn/wiki/index.php?action=history&amp;feed=atom&amp;title=%E8%99%9A%E6%8B%9F%E4%B8%96%E7%95%8C%2FNPC"/>
	<link rel="alternate" type="text/html" href="http://i.bnu.edu.cn/wiki/index.php?title=%E8%99%9A%E6%8B%9F%E4%B8%96%E7%95%8C/NPC&amp;action=history"/>
	<updated>2026-06-01T02:51:02Z</updated>
	<subtitle>本wiki的该页面的版本历史</subtitle>
	<generator>MediaWiki 1.31.0</generator>
	<entry>
		<id>http://i.bnu.edu.cn/wiki/index.php?title=%E8%99%9A%E6%8B%9F%E4%B8%96%E7%95%8C/NPC&amp;diff=1827&amp;oldid=prev</id>
		<title>2024年8月23日 (五) 09:06 Wyg</title>
		<link rel="alternate" type="text/html" href="http://i.bnu.edu.cn/wiki/index.php?title=%E8%99%9A%E6%8B%9F%E4%B8%96%E7%95%8C/NPC&amp;diff=1827&amp;oldid=prev"/>
		<updated>2024-08-23T09:06:46Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;zh-CN&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;←上一版本&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;2024年8月23日 (五) 09:06的版本&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot; &gt;第1行：&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;第1行：&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{VWSnav}}&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{VWSnav}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt; &lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;开源社区提供了一组 OSSL NPC 函数，用于创建和操作机器人（NPC、BOT）。&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;这种方法的一个优点是，机器人不需要外部客户端，并且机器人的外观可以保存在岛屿备份中。一个缺点是可用的功能集非常有限，因为需要编写脚本方法来控制 NPC 的不同方面。此外，这样的机器人不能移动到它们被创建的岛屿之外。&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==服务器配置==&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==服务器配置==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;*Opensim.ini&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;*Opensim.ini&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Wyg</name></author>
		
	</entry>
	<entry>
		<id>http://i.bnu.edu.cn/wiki/index.php?title=%E8%99%9A%E6%8B%9F%E4%B8%96%E7%95%8C/NPC&amp;diff=1817&amp;oldid=prev</id>
		<title>Wyg：创建页面，内容为“{{VWSnav}}   ==服务器配置== *Opensim.ini &lt;pre&gt; [NPC]     ;# {Enabled} {} {Enable Non Player Character (NPC) facilities} {true false} false     Enabled = true…”</title>
		<link rel="alternate" type="text/html" href="http://i.bnu.edu.cn/wiki/index.php?title=%E8%99%9A%E6%8B%9F%E4%B8%96%E7%95%8C/NPC&amp;diff=1817&amp;oldid=prev"/>
		<updated>2024-08-23T08:36:48Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“{{VWSnav}}   ==服务器配置== *Opensim.ini &amp;lt;pre&amp;gt; [NPC]     ;# {Enabled} {} {Enable Non Player Character (NPC) facilities} {true false} false     Enabled = true…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{VWSnav}}&lt;br /&gt;
 &lt;br /&gt;
==服务器配置==&lt;br /&gt;
*Opensim.ini&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[NPC]&lt;br /&gt;
    ;# {Enabled} {} {Enable Non Player Character (NPC) facilities} {true false} false&lt;br /&gt;
    Enabled = true&lt;br /&gt;
	&lt;br /&gt;
	;; several options to control NPCs creation&lt;br /&gt;
	&lt;br /&gt;
    ;# {AllowNotOwned} {} {allow NPCs to be created not Owned} {true false} true&lt;br /&gt;
	;; allow NPCs to be created not Owned {true false} default: true&lt;br /&gt;
    AllowNotOwned = true&lt;br /&gt;
	&lt;br /&gt;
    ;# {AllowSenseAsAvatar} {} {allow NPCs to set to be sensed as Avatars} {true false} true&lt;br /&gt;
	;; allow NPCs to set to be sensed as Avatars {true false} default: true&lt;br /&gt;
    AllowSenseAsAvatar = true&lt;br /&gt;
	&lt;br /&gt;
    ;# {AllowCloneOtherAvatars} {} {allow NPCs to created cloning any avatar in region} {true false} true&lt;br /&gt;
	;; allow NPCs to created cloning any avatar in region {true false} default: true&lt;br /&gt;
    AllowCloneOtherAvatars = true&lt;br /&gt;
	&lt;br /&gt;
    ;# {NoNPCGroup} {} {if true NPCs will have no group title, if false display &amp;quot;- NPC -&amp;quot;} {true false} true&lt;br /&gt;
	;; if true NPCs will have no group title, if false display &amp;quot;- NPC -&amp;quot; for easy identification {true false} default: true&lt;br /&gt;
    NoNPCGroup = true &lt;br /&gt;
&lt;br /&gt;
……&lt;br /&gt;
&lt;br /&gt;
[OSSL]&lt;br /&gt;
    ;# {Include-osslEnable} {} {Include file for enabling and permissions for OSSL functions} {}&lt;br /&gt;
    ;; Optionally include file to enable OSSL functions and set permissions on who can use which.&lt;br /&gt;
    ;; If this INI file is not included, the OSSL functions are disabled.&lt;br /&gt;
    Include-osslEnable = &amp;quot;config-include/osslEnable.ini&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*config-include/osslEnable.ini&lt;br /&gt;
在该文件中包含对各种os*函数的授权&lt;br /&gt;
&lt;br /&gt;
==相关API==&lt;br /&gt;
===osIsNpc===&lt;br /&gt;
函数：integer osIsNpc(key npc)。&amp;lt;br&amp;gt;&lt;br /&gt;
功能：判断一个指定的key是不是一个NPC。&amp;lt;br&amp;gt;&lt;br /&gt;
返回值：NPC的状态&lt;br /&gt;
*如果提供的key是一个NPC，则返回值为TRUE (1)，否则为FALSE (0)；&lt;br /&gt;
*如果提供的key是一个NPC，但不存在于场景中，返回FALSE (0)；&lt;br /&gt;
&lt;br /&gt;
===osNpcCreate===&lt;br /&gt;
函数：&lt;br /&gt;
*key osNpcCreate(string firstname, string lastname, vector position, string cloneFrom)&lt;br /&gt;
*key osNpcCreate(string firstname, string lastname, vector position, string cloneFrom, integer options)&lt;br /&gt;
功能：创建一个名为firstname lastname, 位置为position, 外观为cloneFrom的NPC。&amp;lt;br&amp;gt;&lt;br /&gt;
示例：&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// touch to create a NPC clone of the toucher in front of this emitter&lt;br /&gt;
// NPC will move to the toucher, then will greet them.&lt;br /&gt;
// Touch again to remove the NPC&lt;br /&gt;
 &lt;br /&gt;
key npc;&lt;br /&gt;
vector toucherPos;&lt;br /&gt;
 &lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    touch_start(integer number)&lt;br /&gt;
    {&lt;br /&gt;
        vector npcPos = llGetPos() + &amp;lt;1,0,0&amp;gt;;&lt;br /&gt;
        osAgentSaveAppearance(llDetectedKey(0), &amp;quot;appearance&amp;quot;);&lt;br /&gt;
        // coud use avatar UUID directly in osNpcCreate, but then NPC appearance is not persisted&lt;br /&gt;
        npc = osNpcCreate(&amp;quot;ImYour&amp;quot;, &amp;quot;Clone&amp;quot;, npcPos, &amp;quot;appearance&amp;quot;);&lt;br /&gt;
        toucherPos = llDetectedPos(0);&lt;br /&gt;
        state hasNPC;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
state hasNPC&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        osNpcMoveTo(npc, toucherPos + &amp;lt;1,1,0&amp;gt;); &lt;br /&gt;
        osNpcSay(npc, &amp;quot;Hi there! My name is &amp;quot; + llKey2Name(npc));&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    touch_start(integer number)&lt;br /&gt;
    {&lt;br /&gt;
        osNpcSay(npc, &amp;quot;Goodbye!&amp;quot;);&lt;br /&gt;
        osNpcRemove(npc);&lt;br /&gt;
        npc = NULL_KEY;&lt;br /&gt;
        state default;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''[备注]'''&lt;br /&gt;
#您可以从保存的外观记录卡名称或UUID或从登录到相同区域中克隆外观。&lt;br /&gt;
#您可以使用以下函数创建和加载外观记录卡：osOwnerSaveAppearance，osAgentSaveAppearance，osNpcLoadAppearance，osNpcSaveAppearance。&lt;br /&gt;
#在当前的OpenSimulator开发代码中（从2012年1月12日的提交c4972e77），已经添加了osNpcCreate（）的重载版本。&lt;br /&gt;
#关于重载函数key osNpcCreate(string firstname, string lastname, vector position, string cloneFrom, integer options)&lt;br /&gt;
#*options字段可以是OS_NPC_CREATOR_OWNED或OS_NPC_NOT_OWNED。&lt;br /&gt;
#*OS_NPC_CREATOR_OWNED将创建一个“被拥有”的NPC，只会响应与创建NPC相同的所有者脚本发出的osNpc *命令。&lt;br /&gt;
#*OS_NPC_NOT_OWNED将创建一个“无主”的NPC，它将响应任何具有OSSL权限的脚本来调用osNpc *命令。&lt;br /&gt;
#*例如：key npc = osNpcCreate(&amp;quot;ImYour&amp;quot;, &amp;quot;Clone&amp;quot;, npcPos, &amp;quot;appearance&amp;quot;, OS_NPC_CREATOR_OWNED);&lt;br /&gt;
#现有的没有options字段的osNpcCreate()函数将继续存在。&lt;br /&gt;
&lt;br /&gt;
===osGetNpcList===&lt;br /&gt;
函数：list osGetNPCList( ).&amp;lt;br&amp;gt;&lt;br /&gt;
功能：显示该区域中每个NPC的UUID、位置和名称的列表。&amp;lt;br&amp;gt;&lt;br /&gt;
示例：&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        list npcs = osGetNPCList();&lt;br /&gt;
        if (npcs == [])&lt;br /&gt;
            llSay(0, &amp;quot;You must be the owner. There is nobody else here who could have touched me.&amp;quot;);&lt;br /&gt;
        else&lt;br /&gt;
            llSay(0, &amp;quot;NPC's in this region (without avatars):&amp;quot; + llList2CSV(npcs));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===osNpcGetOwner===&lt;br /&gt;
函数：key osNpcGetOwner(key npc).&amp;lt;br&amp;gt;&lt;br /&gt;
功能：获取NPC的所有者的UUID。&lt;br /&gt;
&lt;br /&gt;
===osNpcGetPos===&lt;br /&gt;
函数：vector osNpcGetPos(key npc).&amp;lt;br&amp;gt;&lt;br /&gt;
功能：返回NPC的当前位置。&lt;br /&gt;
&lt;br /&gt;
===osNpcGetRot===&lt;br /&gt;
函数：rotation osNpcGetRot(key npc).&amp;lt;br&amp;gt;&lt;br /&gt;
功能：获取化身的旋转。欧拉旋转（水平旋转）中只有Z平面的旋转才有意义。&lt;br /&gt;
&lt;br /&gt;
===osNpcLoadAppearance===&lt;br /&gt;
函数：osNpcLoadAppearance(key npc, string notecard).&amp;lt;br&amp;gt;&lt;br /&gt;
功能：从记事卡加载外观。此记事卡必须包含使用其中一个保存外观功能创建的外观数据。&lt;br /&gt;
&lt;br /&gt;
===osNpcMoveTo===&lt;br /&gt;
函数：void osNpcMoveTo(key npc, vector position).&amp;lt;br&amp;gt;&lt;br /&gt;
功能：移动NPC到指定位置。&lt;br /&gt;
&lt;br /&gt;
===osNpcMoveToTarget===&lt;br /&gt;
函数：osNpcMoveToTarget(key npc, vector target, integer options).&amp;lt;br&amp;gt;&lt;br /&gt;
功能：随着时间的推移，到达指定的地点。如何到达目的地取决于options的值。&lt;br /&gt;
*OS_NPC_FLY ：将飞到指定的位置。NPC将不会着陆，除非OS_NPC_LAND_AT_TARGET选项也被给出。&lt;br /&gt;
*OS_NPC_NO_FLY ： 不要飞到目标。NPC将尝试走向该地点。如果它在空中，那么NPC将一直处于无望的状态，直到另一个移动目标被提供或移动被停止。&lt;br /&gt;
*OS_NPC_LAND_AT_TARGET ： 如果给出，NPC正在飞行，那么它会在到达目标时着陆。如果给出OS_NPC_NO_FLY，那么这个选项不起作用。&amp;lt;br&amp;gt;&lt;br /&gt;
**OS_NPC_FLY和OS_NPC_NO_FLY是不能合并的选项 - NPC最终会做一个或另一个。如果你想让NPC飞行并落在目标上，那么OS_NPC_LAND_AT_TARGET必须与OS_NPC_FLY结合。&lt;br /&gt;
*OS_NPC_RUNNING ： 将NPC运行到给定的位置。&lt;br /&gt;
&lt;br /&gt;
===osNpcPlayAnimation===&lt;br /&gt;
函数：osNpcPlayAnimation(key npc, string animation).&amp;lt;br&amp;gt;&lt;br /&gt;
功能：在NPC的身份标识上播放动画。&lt;br /&gt;
&lt;br /&gt;
===osNpcRemove===&lt;br /&gt;
函数：void osNpcRemove(key npc).&amp;lt;br&amp;gt;&lt;br /&gt;
功能：移除指定key的NPC。&amp;lt;br&amp;gt;&lt;br /&gt;
示例：&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// sim-wide NPC killer&lt;br /&gt;
// kill all of NPCs in this SIM&lt;br /&gt;
// Attempts to kill agents too, but it will silently fail&lt;br /&gt;
// http://opensimulator.org/wiki/OsNpcRemove&lt;br /&gt;
 &lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    touch_start(integer number)&lt;br /&gt;
    {&lt;br /&gt;
        list avatars = llList2ListStrided(osGetAvatarList(), 0, -1, 3);&lt;br /&gt;
        integer i;&lt;br /&gt;
        llSay(0,&amp;quot;NPC Removal: No avatars will be harmed or removed in this process!&amp;quot;);&lt;br /&gt;
        for (i=0; i&amp;lt;llGetListLength(avatars); i++)&lt;br /&gt;
        {&lt;br /&gt;
            string target = llList2String(avatars, i);&lt;br /&gt;
            osNpcRemove(target);&lt;br /&gt;
            llSay(0,&amp;quot;NPC Removal: Target &amp;quot;+target);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''[备注]'''&lt;br /&gt;
如果化身是任何其他类型的代理（即用户的常规化身，而不是NPC）的UUID，则该功能将默认失败，不会擦除已存在的化身。&lt;br /&gt;
&lt;br /&gt;
===osNpcSaveAppearance===&lt;br /&gt;
函数：key osNpcSaveAppearance(key npc, string notecard).&amp;lt;br&amp;gt;&lt;br /&gt;
功能：将NPC的当前外表保存在资产库中的记事卡中。这包括身体部位数据，衣物和附件。如果同名的记事卡已经存在，则被替换。当这个函数被调用时，化身必须出现在该区域。化身的烘焙纹理（重现外观所必需的）被永久保存。&lt;br /&gt;
&lt;br /&gt;
===osNpcSay===&lt;br /&gt;
函数：&lt;br /&gt;
*void osNpcSay(key npc, int channel, string message).&lt;br /&gt;
*void osNpcSay(key npc, string message).&lt;br /&gt;
功能：NPC在已给的通道表示信息（第二个通道为0）.&lt;br /&gt;
&lt;br /&gt;
===osNpcSetProfileAbout===&lt;br /&gt;
函数：osNpcSetProfileAbout(LSL_Key npc, string about).&amp;lt;br&amp;gt;&lt;br /&gt;
功能：在创建的NPC的配置文件中设置。&amp;lt;br&amp;gt;&lt;br /&gt;
示例：&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// osNpcSetProfileImageScript Example&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
key npc = NULL_KEY;&lt;br /&gt;
string about = &amp;quot;I'm your Clone&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    touch_start(integer number)&lt;br /&gt;
    {&lt;br /&gt;
        if (npc == NULL_KEY)&lt;br /&gt;
        {&lt;br /&gt;
            osOwnerSaveAppearance(&amp;quot;MyClone&amp;quot;);&lt;br /&gt;
            llSetTimerEvent(2.0);&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            osNpcRemove(npc);&lt;br /&gt;
            npc = NULL_KEY;&lt;br /&gt;
            llRemoveInventory(&amp;quot;MyClone&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
        npc = osNpcCreate(&amp;quot;John&amp;quot;, &amp;quot;Smith&amp;quot;, llGetPos() + &amp;lt;0.0, 0.0, 2.0&amp;gt;, &amp;quot;MyClone&amp;quot;);&lt;br /&gt;
        osNpcSetProfileAbout(npc, about);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===osNpcSetProfileImage===&lt;br /&gt;
函数：osNpcSetProfileImage(LSL_Key npc, string image).&amp;lt;br&amp;gt;&lt;br /&gt;
功能：在创建的NPC的个人资料中设置图像。可以通过名称或UUID使用包含在资产库中的纹理。&amp;lt;br&amp;gt;&lt;br /&gt;
示例：&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// osNpcSetProfileImage Example&lt;br /&gt;
//&lt;br /&gt;
 &lt;br /&gt;
key npc = NULL_KEY;&lt;br /&gt;
string image = &amp;quot;My Photo&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    touch_start(integer number)&lt;br /&gt;
    {&lt;br /&gt;
        if (npc == NULL_KEY)&lt;br /&gt;
        {&lt;br /&gt;
            osOwnerSaveAppearance(&amp;quot;MyClone&amp;quot;);&lt;br /&gt;
            llSetTimerEvent(2.0);&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            osNpcRemove(npc);&lt;br /&gt;
            npc = NULL_KEY;&lt;br /&gt;
            llRemoveInventory(&amp;quot;MyClone&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
        npc = osNpcCreate(&amp;quot;John&amp;quot;, &amp;quot;Smith&amp;quot;, llGetPos() + &amp;lt;0.0, 0.0, 2.0&amp;gt;, &amp;quot;MyClone&amp;quot;);&lt;br /&gt;
        osNpcSetProfileImage(npc, image);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===osNpcSetRot===&lt;br /&gt;
函数：osNpcSetRot(key npc, rotation rot).&amp;lt;br&amp;gt;&lt;br /&gt;
功能：设置化身的旋转。只有在欧拉旋转中设置Z平面中的旋转将会产生任何有意义的效果（将化身指向一个方向或另一个方向）。设置X或Y欧拉值将导致化身以不确定的方式旋转。&lt;br /&gt;
&lt;br /&gt;
===osNpcShout===&lt;br /&gt;
函数：void osNpcShout(key npc, int channel, string message).&amp;lt;br&amp;gt;&lt;br /&gt;
功能：NPC在给定的通道上呼喊信息。&lt;br /&gt;
&lt;br /&gt;
===osNpcSit===&lt;br /&gt;
函数：osNpcSit（key npc，key target，integer options）.&amp;lt;br&amp;gt;&lt;br /&gt;
功能：让一个NPC坐在一个物体上。&amp;lt;br&amp;gt;&lt;br /&gt;
options ： OS_NPC_SIT_NOW。&lt;br /&gt;
*让npc在可能的情况下，立即坐在prim上。这是唯一可用的选项，而且当前总是在选项字段中指定的任何内容上。&lt;br /&gt;
*如果prim有一个sit目标，那么无论在NPC和prim之间的距离，都要坐着。&lt;br /&gt;
*如果prim没有坐目标的话，如果prim在NPC的10米以内，那么坐就会成功。&lt;br /&gt;
&lt;br /&gt;
===osNpcStand===&lt;br /&gt;
函数：osNpcStand(key npc).&amp;lt;br&amp;gt;&lt;br /&gt;
功能：让一个坐着的NPC站起来。&lt;br /&gt;
&lt;br /&gt;
===osNpcStopAnimation===&lt;br /&gt;
函数：osNpcStopAnimation(key npc, string animation).&amp;lt;br&amp;gt;&lt;br /&gt;
功能：停止正在用指定NPC的密钥标识播放的动画。&lt;br /&gt;
&lt;br /&gt;
===osNpcStopMoveToTarget===&lt;br /&gt;
&lt;br /&gt;
函数：osNpcStopMoveToTarget(key npc).&amp;lt;br&amp;gt;&lt;br /&gt;
功能：停止当前移动到目标的行为。&lt;br /&gt;
&lt;br /&gt;
===osNpcTouch===&lt;br /&gt;
===osNpcWhisper===&lt;br /&gt;
函数：void osNpcWhisper(key npc, int channel, string message).&amp;lt;br&amp;gt;&lt;br /&gt;
功能：NPC在给定的通道中低语指定消息。&lt;br /&gt;
&lt;br /&gt;
===OsOwnerSaveAppearance===&lt;br /&gt;
函数：key osOwnerSaveAppearance(string notecard).&amp;lt;br&amp;gt;&lt;br /&gt;
功能：将所有者的当前外观保存到资产库中的记事卡中。这包括身体部位数据，衣物和附件。如果同名的记事卡已经存在，则被替换。当这个函数被调用时，所有者必须在区域中。所有者的烘焙纹理（需要在NPC上重现外观）被永久保存。&lt;br /&gt;
示例：&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// &lt;br /&gt;
// osOwnerSaveAppearance exxample.&lt;br /&gt;
// This example creates the notecard with the user's appearance in the inventory of a prim.&lt;br /&gt;
// You will find the notecard in the contents of the prim after the script has run.&lt;br /&gt;
//&lt;br /&gt;
 &lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        string ownername = llKey2Name(llGetOwner());    // Retrieve the owner's key, and find out his/her name.&lt;br /&gt;
        string date = (string)llGetDate();              // Store the date in a string.&lt;br /&gt;
        string notecard_name = ownername+&amp;quot; &amp;quot;+date;      // Combine the name and the date for use as a notecard name.&lt;br /&gt;
        osOwnerSaveAppearance(notecard_name);           // Make the notecard.&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==综合实例==&lt;br /&gt;
===综合实例1===&lt;br /&gt;
在此实例中，囊括了大多数关于NPC的API，通过对话框的形式成功实现了一个NPC的建立、移动、说话、站立、坐下、显示位置等功能。&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; &lt;br /&gt;
!功能&lt;br /&gt;
!菜单等级&lt;br /&gt;
!功能描述&lt;br /&gt;
|-&lt;br /&gt;
||触碰&lt;br /&gt;
||无&lt;br /&gt;
||用户化身触碰物体开始相关操作&lt;br /&gt;
|-&lt;br /&gt;
||create&lt;br /&gt;
||一级菜单&lt;br /&gt;
||创建一个npc，可以输入npc的姓名，也可系统命名&lt;br /&gt;
|-&lt;br /&gt;
||remove&lt;br /&gt;
||一级菜单&lt;br /&gt;
||移除该区域所有npc，并删除相应生成的外观记事卡&lt;br /&gt;
|-&lt;br /&gt;
||other&lt;br /&gt;
||一级菜单&lt;br /&gt;
||点击可输入指定npc的key值，随后可对该npc进行相关操作&lt;br /&gt;
|-&lt;br /&gt;
||exit&lt;br /&gt;
||一级菜单&lt;br /&gt;
||点击以退出对话框&lt;br /&gt;
|-&lt;br /&gt;
||return&lt;br /&gt;
||二级菜单&lt;br /&gt;
||点击返回一级菜单&lt;br /&gt;
|-&lt;br /&gt;
||exit&lt;br /&gt;
||二级菜单&lt;br /&gt;
||点击以退出对话框&lt;br /&gt;
|-&lt;br /&gt;
||get...&lt;br /&gt;
||二级菜单&lt;br /&gt;
||返回给定npc的位置、旋转角度、拥有者&lt;br /&gt;
|-&lt;br /&gt;
||move&lt;br /&gt;
||二级菜单&lt;br /&gt;
||输入坐标位置，将npc移动到给定位置&lt;br /&gt;
|-&lt;br /&gt;
||stopMove&lt;br /&gt;
||二级菜单&lt;br /&gt;
||若npc在移动工程中，可停止移动&lt;br /&gt;
|-&lt;br /&gt;
||remove&lt;br /&gt;
||二级菜单&lt;br /&gt;
||移除指定npc，并返回一级菜单&lt;br /&gt;
|-&lt;br /&gt;
||sit&lt;br /&gt;
||二级菜单&lt;br /&gt;
||输入坐下物体的key值，npc将坐在该物体上&lt;br /&gt;
|-&lt;br /&gt;
||stand&lt;br /&gt;
||二级菜单&lt;br /&gt;
||若npc坐在某物体上，将会站立&lt;br /&gt;
|-&lt;br /&gt;
||say&lt;br /&gt;
||二级菜单&lt;br /&gt;
||npc将和你打招呼&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[文件:功能示意图.png]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
//一个关于NPC的综合案例，通过对话框的形式实现相关功能&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
integer gchannel;	//记录指定监听通道&lt;br /&gt;
integer glistener;	//记录相应监听ID&lt;br /&gt;
key toucherID;		//记录触碰者ID&lt;br /&gt;
key npc;		//记录用户输入的NPC的key值&lt;br /&gt;
string msg;&lt;br /&gt;
list options;		//记录相关操作的列表&lt;br /&gt;
list choices;		//记录对指定NPC进行相关操作的列表&lt;br /&gt;
integer num = 1;	//记录已生成的NPC的数量&lt;br /&gt;
&lt;br /&gt;
//删除除了脚本以外所有生成的文件&lt;br /&gt;
delete_all_other_contents()&lt;br /&gt;
{&lt;br /&gt;
    string thisScript = llGetScriptName();&lt;br /&gt;
    string inventoryItemName;&lt;br /&gt;
 &lt;br /&gt;
    integer index = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
    while (index)&lt;br /&gt;
    {&lt;br /&gt;
        --index;        // (faster than index--;)&lt;br /&gt;
 &lt;br /&gt;
        inventoryItemName = llGetInventoryName(INVENTORY_ALL, index);&lt;br /&gt;
 &lt;br /&gt;
        if (inventoryItemName != thisScript)   &lt;br /&gt;
            llRemoveInventory(inventoryItemName);     &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//移除函数：移除岛屿上所有NPC&lt;br /&gt;
remove()&lt;br /&gt;
{&lt;br /&gt;
	list avatars = llList2ListStrided(osGetAvatarList(),0,-1,3);&lt;br /&gt;
	//llList2ListStrided:从列表的第一个条到最后，返回第三项&lt;br /&gt;
	integer i;&lt;br /&gt;
	llSay(0,&amp;quot;NPC Removal: No avatars will be harmed or removed in this process!&amp;quot;);&lt;br /&gt;
    for (i=0; i&amp;lt;llGetListLength(avatars); i++)&lt;br /&gt;
	{&lt;br /&gt;
		string target = llList2String(avatars, i);&lt;br /&gt;
		osNpcRemove(target);&lt;br /&gt;
		llSay(0,&amp;quot;NPC Removal: Target &amp;quot;+target);&lt;br /&gt;
	}&lt;br /&gt;
	delete_all_other_contents();&lt;br /&gt;
	num = 1;	//重置NPC计数&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{&lt;br /&gt;
		llSay(0, &amp;quot;Click here to start!&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	touch_start(integer total_number)&lt;br /&gt;
	{&lt;br /&gt;
		toucherID = llDetectedKey(0);	//获取触碰者ID&lt;br /&gt;
		gchannel = (integer)(llFrand(5000)+5000);	//随机生成对话通道，避免对话通道冲突&lt;br /&gt;
		state init;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
state init&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{&lt;br /&gt;
		msg = &amp;quot;create: create a npc. \nremove: remove all npc in the region. \n&amp;quot; +&lt;br /&gt;
			&amp;quot;other: operation to given npc.&amp;quot;;&lt;br /&gt;
		glistener = llListen(gchannel,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
		options = [&amp;quot;create&amp;quot;,&amp;quot;remove&amp;quot;,&amp;quot;other&amp;quot;,&amp;quot;exit&amp;quot;];&lt;br /&gt;
		llDialog(toucherID,msg,options,gchannel);	&lt;br /&gt;
	}&lt;br /&gt;
	//监听函数，获取用户的操作或提交的相关信息，下同&lt;br /&gt;
	&lt;br /&gt;
	listen(integer channel, string name, key id, string message)&lt;br /&gt;
	{&lt;br /&gt;
		if(message == &amp;quot;create&amp;quot;){&lt;br /&gt;
			llListenRemove(glistener);&lt;br /&gt;
			state create;&lt;br /&gt;
		}else if(message == &amp;quot;remove&amp;quot;){&lt;br /&gt;
			remove();&lt;br /&gt;
			llDialog(toucherID,msg,options,gchannel);&lt;br /&gt;
		}else if(message == &amp;quot;other&amp;quot;){&lt;br /&gt;
			llListenRemove(glistener);&lt;br /&gt;
			state other;&lt;br /&gt;
		}else{&lt;br /&gt;
			llListenRemove(glistener);&lt;br /&gt;
			state default;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//创建事件：创建一个NPC&lt;br /&gt;
state create&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{&lt;br /&gt;
		glistener = llListen(gchannel,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
		llTextBox(toucherID,&amp;quot;Enter the name of the npc:&amp;quot;,gchannel);&lt;br /&gt;
	}&lt;br /&gt;
	listen(integer channel, string name, key id, string message)&lt;br /&gt;
	{&lt;br /&gt;
		if(channel == gchannel){&lt;br /&gt;
			llListenRemove(glistener);&lt;br /&gt;
			vector npcPos = llGetPos() + &amp;lt;1,0,0&amp;gt;;&lt;br /&gt;
			string npcName = (string)message;&lt;br /&gt;
			string npcIdname = (string)(&amp;quot;clone&amp;quot;+num);&lt;br /&gt;
			osAgentSaveAppearance(toucherID,npcIdname);	//保存触碰者当前外观为记事卡中&lt;br /&gt;
			key NPC = osNpcCreate(npcIdname,npcName,npcPos,npcIdname);&lt;br /&gt;
			osNpcSay(NPC, &amp;quot;Hi there! My name is &amp;quot; + llKey2Name(NPC));&lt;br /&gt;
			num++;&lt;br /&gt;
			state init;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
state other&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{&lt;br /&gt;
		glistener = llListen(gchannel,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
		llTextBox(toucherID,&amp;quot;The following operation are for a given NPC.\n&amp;quot;+&lt;br /&gt;
			&amp;quot;Now,Enter a key for an npc:&amp;quot;,gchannel);&lt;br /&gt;
	}&lt;br /&gt;
	listen(integer channel, string name, key id, string message)&lt;br /&gt;
	{&lt;br /&gt;
		llListenRemove(glistener);&lt;br /&gt;
		npc = (string)message;&lt;br /&gt;
		&lt;br /&gt;
		//确定输入key值是否为在岛上存在的NPC&lt;br /&gt;
		if(!osIsNpc(npc))&lt;br /&gt;
		{&lt;br /&gt;
			msg = &amp;quot;The npc which key is &amp;quot; + npc + &amp;quot; is not existing in the region.&amp;quot;;&lt;br /&gt;
			llSay(0,msg);&lt;br /&gt;
			state init;&lt;br /&gt;
		}&lt;br /&gt;
		state option;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
state option&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{		&lt;br /&gt;
		msg = &amp;quot;Please select the operation you want to perform for the NPC.&amp;quot;;&lt;br /&gt;
		choices = [&amp;quot;sit&amp;quot;,&amp;quot;stand&amp;quot;,&amp;quot;say&amp;quot;,&amp;quot;move&amp;quot;,&amp;quot;stopMove&amp;quot;,&amp;quot;remove&amp;quot;,&amp;quot;getPos&amp;quot;,&amp;quot;getRot&amp;quot;,&amp;quot;getOwner&amp;quot;,&amp;quot;return&amp;quot;,&amp;quot;exit&amp;quot;];&lt;br /&gt;
		glistener = llListen(gchannel,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
		llDialog(toucherID,msg,choices,gchannel);&lt;br /&gt;
	}&lt;br /&gt;
	listen(integer channel, string name, key id, string choice)&lt;br /&gt;
	{&lt;br /&gt;
		if(choice == &amp;quot;sit&amp;quot;){&lt;br /&gt;
			llListenRemove(glistener);&lt;br /&gt;
			state SIT;&lt;br /&gt;
		}else if(choice == &amp;quot;stand&amp;quot;){&lt;br /&gt;
			osNpcStand(npc);&lt;br /&gt;
			osNpcSay(npc,&amp;quot;I'm standing.&amp;quot;);&lt;br /&gt;
			llDialog(toucherID,msg,choices,gchannel);&lt;br /&gt;
		}else if(choice == &amp;quot;say&amp;quot;){&lt;br /&gt;
			osNpcSay(npc,&amp;quot;Hello!&amp;quot;);&lt;br /&gt;
			llDialog(toucherID,msg,choices,gchannel);&lt;br /&gt;
		}else if(choice == &amp;quot;move&amp;quot;){&lt;br /&gt;
			llListenRemove(glistener);&lt;br /&gt;
			state move;&lt;br /&gt;
		}else if(choice == &amp;quot;stopMove&amp;quot;){&lt;br /&gt;
			osNpcStopMoveToTarget(npc);&lt;br /&gt;
			llSay(gchannel,&amp;quot;The npc has stop moving!&amp;quot;);&lt;br /&gt;
			llDialog(toucherID,msg,choices,gchannel);&lt;br /&gt;
		}else if(choice == &amp;quot;remove&amp;quot;){&lt;br /&gt;
			llListenRemove(glistener);&lt;br /&gt;
			osNpcSay(npc, &amp;quot;Goodbye!&amp;quot;);&lt;br /&gt;
			osNpcRemove(npc);&lt;br /&gt;
			state init;&lt;br /&gt;
		}else if(choice == &amp;quot;getPos&amp;quot;){&lt;br /&gt;
			vector pos = osNpcGetPos(npc);&lt;br /&gt;
			osNpcSay(npc,&amp;quot;The position of the npc is &amp;quot; + (string)pos);&lt;br /&gt;
			llDialog(toucherID,msg,choices,gchannel);&lt;br /&gt;
		}else if(choice == &amp;quot;getRot&amp;quot;){&lt;br /&gt;
			rotation rot = osNpcGetRot(npc);&lt;br /&gt;
			osNpcSay(npc,&amp;quot;The rotation of the npc is &amp;quot; + (string)rot);&lt;br /&gt;
			llDialog(toucherID,msg,choices,gchannel);&lt;br /&gt;
		}else if(choice == &amp;quot;getOwner&amp;quot;){&lt;br /&gt;
			key owner = osNpcGetOwner(npc);&lt;br /&gt;
			osNpcSay(npc,&amp;quot;The npc belongs to the user whose ID is &amp;quot; + (string)owner);&lt;br /&gt;
			llDialog(toucherID,msg,choices,gchannel);&lt;br /&gt;
		}else if(choice == &amp;quot;return&amp;quot;){&lt;br /&gt;
			llListenRemove(glistener);&lt;br /&gt;
			state init;&lt;br /&gt;
		}else{&lt;br /&gt;
			llListenRemove(glistener);&lt;br /&gt;
			state default;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//移动事件：将指定NPC移动到指定地点&lt;br /&gt;
state move&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{&lt;br /&gt;
		msg = &amp;quot;Please input the new vector,in sample format,&amp;lt;x,y,z&amp;gt;&amp;quot;;&lt;br /&gt;
		glistener = llListen(gchannel,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
		llTextBox(toucherID,msg,gchannel);&lt;br /&gt;
	}&lt;br /&gt;
	listen(integer channel, string name, key id, string message)&lt;br /&gt;
	{&lt;br /&gt;
		if(channel == gchannel){&lt;br /&gt;
			llListenRemove(glistener);&lt;br /&gt;
			vector position = (vector)message;&lt;br /&gt;
			osNpcMoveTo(npc, position);&lt;br /&gt;
			osNpcSay(npc,&amp;quot;The npc has been moved to a given position.&amp;quot;);&lt;br /&gt;
			state option;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//坐下事件：命令指定NPC坐在某物体上，最好在该物体上有相应的设置坐下的脚本&lt;br /&gt;
state SIT&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{&lt;br /&gt;
		msg = &amp;quot;Please input the key what the npc sit on.&amp;quot;;&lt;br /&gt;
		glistener = llListen(gchannel,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
		llTextBox(toucherID,msg,gchannel);&lt;br /&gt;
	}&lt;br /&gt;
	listen(integer channel, string name, key id, string message)&lt;br /&gt;
	{&lt;br /&gt;
		if(channel == gchannel){&lt;br /&gt;
			llListenRemove(glistener);&lt;br /&gt;
			key sitNpc = (string)message;&lt;br /&gt;
			osNpcSit(npc, sitNpc, OS_NPC_SIT_NOW);&lt;br /&gt;
			osNpcSay(npc,&amp;quot;I'm sitting.&amp;quot;);&lt;br /&gt;
			state option;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===综合实例2===&lt;br /&gt;
在此实例中，囊括了大多数关于NPC的API，通过在指定通道上通讯的形式成功实现了一个乃至多个NPC的建立、移动、说话、站立、坐下等功能。&amp;lt;br&amp;gt;&lt;br /&gt;
操作说明：&lt;br /&gt;
*输入“/10 help”获取命令菜单（10为给定通讯通道，可以在脚本中进行修改）&lt;br /&gt;
*输入“/10 show”显示具体每个命令的通讯格式&lt;br /&gt;
*在执行针对于指定NPC的相关操作之前，利用npckey命令输入指定NPC的key值，即为其UUID&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; &lt;br /&gt;
!命令&lt;br /&gt;
!通讯格式&lt;br /&gt;
!功能描述&lt;br /&gt;
|-&lt;br /&gt;
||create&lt;br /&gt;
||create &amp;lt;notecard-name&amp;gt;&lt;br /&gt;
||Create NPC from a stored notecard&lt;br /&gt;
|-&lt;br /&gt;
||create&lt;br /&gt;
||create &amp;lt;notecard-name&amp;gt; &amp;lt;firstName&amp;gt; &amp;lt;lastName&amp;gt;&lt;br /&gt;
||Create NPC from a stored notecard&lt;br /&gt;
|-&lt;br /&gt;
||createm&lt;br /&gt;
||createm &amp;lt;num&amp;gt;&lt;br /&gt;
||Create a specified number of NPCS&lt;br /&gt;
|-&lt;br /&gt;
||remove&lt;br /&gt;
||remove&lt;br /&gt;
||Remove the current NPC&lt;br /&gt;
|-&lt;br /&gt;
||delete&lt;br /&gt;
||delete&lt;br /&gt;
||Delete all generated files except the script&lt;br /&gt;
|-&lt;br /&gt;
||npckey&lt;br /&gt;
||npckey &amp;lt;npc-uuid&amp;gt;&lt;br /&gt;
||Enter a key value for an NPC&lt;br /&gt;
|-&lt;br /&gt;
||say&lt;br /&gt;
||say&lt;br /&gt;
||NPCS greet you&lt;br /&gt;
|-&lt;br /&gt;
||clone&lt;br /&gt;
||clone &amp;lt;notecard-name&amp;gt;&lt;br /&gt;
||Clone own appearance to a notecard&lt;br /&gt;
|-&lt;br /&gt;
||load &lt;br /&gt;
||load &amp;lt;notecard-name&amp;gt;&lt;br /&gt;
||Load appearance on notecard to current npc&lt;br /&gt;
|-&lt;br /&gt;
||save&lt;br /&gt;
||save &amp;lt;notecard-name&amp;gt;&lt;br /&gt;
||Save appearance of current NPC to notecard&lt;br /&gt;
|-&lt;br /&gt;
||rot&lt;br /&gt;
||rot&lt;br /&gt;
||NPCS rotate in one direction&lt;br /&gt;
|-&lt;br /&gt;
||rotabs&lt;br /&gt;
||rotabs &amp;lt;angles&amp;gt;&lt;br /&gt;
||NPC rotation specifies angles&lt;br /&gt;
|-&lt;br /&gt;
||move&lt;br /&gt;
||move &amp;lt;x&amp;gt; &amp;lt;y&amp;gt; &amp;lt;z&amp;gt;&lt;br /&gt;
||move to absolute position&lt;br /&gt;
|-&lt;br /&gt;
||movetarget&lt;br /&gt;
||movetarget&lt;br /&gt;
||Move NPCS to users nearby&lt;br /&gt;
|-&lt;br /&gt;
||stop&lt;br /&gt;
||stop&lt;br /&gt;
||If the NPC is moving, it will stop moving&lt;br /&gt;
|-&lt;br /&gt;
||sit&lt;br /&gt;
||sit &amp;lt;target-uuid&amp;gt;&lt;br /&gt;
||Make a NPC sit on the specified object&lt;br /&gt;
|-&lt;br /&gt;
||stand&lt;br /&gt;
||stand&lt;br /&gt;
||If the NPC is sitting, it will stand&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
key npc;&lt;br /&gt;
integer listenChannel = 10;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
	state_entry()&lt;br /&gt;
	{&lt;br /&gt;
		llListen(listenChannel,&amp;quot;&amp;quot;,NULL_KEY,&amp;quot;&amp;quot;);        //监听listenChannel对话通道&lt;br /&gt;
		llSetText(&amp;quot;Listening on &amp;quot; + listenChannel, &amp;lt;0, 255, 0&amp;gt;, 1);    //设置提示语显示在物体上方&lt;br /&gt;
		llOwnerSay(&amp;quot;Say '/&amp;quot; + (string)listenChannel + &amp;quot; help' for commands&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	listen(integer channel, string name, key id, string msg)&lt;br /&gt;
	{&lt;br /&gt;
		if (msg != &amp;quot;&amp;quot;)&lt;br /&gt;
		{&lt;br /&gt;
			list commands = llParseString2List(msg, [ &amp;quot; &amp;quot; ], []);    //接收用户在通道listenChannel输入的对话，并以空格分隔成多个字段&lt;br /&gt;
			string msg0 = llList2String(commands, 0);    //msg0记录用户输入的第一个字段&lt;br /&gt;
			string msg1 = llList2String(commands, 1);&lt;br /&gt;
			string msg2 = llList2String(commands, 2);&lt;br /&gt;
			string msg3 = llList2String(commands, 3);&lt;br /&gt;
&lt;br /&gt;
			if (msg0 == &amp;quot;create&amp;quot; &amp;amp;&amp;amp; msg1 != &amp;quot;&amp;quot;)//创建一个npc&lt;br /&gt;
			{&lt;br /&gt;
				osOwnerSaveAppearance(&amp;quot;appearance&amp;quot;);    //保存所有者的外观为记事卡appearance&lt;br /&gt;
&lt;br /&gt;
				string notecardName = &amp;quot;appearance&amp;quot;;&lt;br /&gt;
				string firstName = &amp;quot;clone&amp;quot;;&lt;br /&gt;
				string lastName = &amp;quot;tom&amp;quot;;&lt;br /&gt;
				//判断用户输入的外观卡是否有效，若无效，则用默认记事卡&lt;br /&gt;
				string thisScript = llGetScriptName();&lt;br /&gt;
				string inventoryItemName;&lt;br /&gt;
				integer index = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
				while (index)&lt;br /&gt;
				{&lt;br /&gt;
					--index;        // (faster than index--;)&lt;br /&gt;
					inventoryItemName = llGetInventoryName(INVENTORY_ALL, index);&lt;br /&gt;
					if (inventoryItemName == msg1)&lt;br /&gt;
						notecardName = msg1;&lt;br /&gt;
				}&lt;br /&gt;
				//在用户通信格式正确且输入了npc的姓名的情况下，设置npc的姓名&lt;br /&gt;
				if(msg2 != &amp;quot;&amp;quot; &amp;amp;&amp;amp; msg3 != &amp;quot;&amp;quot;)&lt;br /&gt;
				{&lt;br /&gt;
					firstName = msg2;&lt;br /&gt;
					lastName = msg3;&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				npc = osNpcCreate(firstName, lastName, llGetPos() + &amp;lt;5, 5, 0&amp;gt;, notecardName);    //生成给定条件的npc&lt;br /&gt;
				llOwnerSay(&amp;quot;Good morning! &amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
			else if (msg0 ==&amp;quot;createm&amp;quot; &amp;amp;&amp;amp; msg1 != &amp;quot;&amp;quot;)    //创建多个npc&lt;br /&gt;
			{&lt;br /&gt;
				osOwnerSaveAppearance(&amp;quot;appearance&amp;quot;);&lt;br /&gt;
				vector pos = llGetPos();&lt;br /&gt;
				integer i;&lt;br /&gt;
				for (i = 0; i &amp;lt; (integer)msg1; i++)&lt;br /&gt;
				{&lt;br /&gt;
					osNpcCreate(&amp;quot;clone&amp;quot;, (string)i, pos + &amp;lt;8, 0, 0&amp;gt;, &amp;quot;appearance&amp;quot;);&lt;br /&gt;
					llSleep(1);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			else if (msg0 == &amp;quot;remove&amp;quot; &amp;amp;&amp;amp; osIsNpc(npc))    //删除指定npc&lt;br /&gt;
			{&lt;br /&gt;
				osNpcSay(npc, &amp;quot;You will pay for this with your liiiiiivvveeessss!!!.....&amp;quot;);&lt;br /&gt;
				osNpcRemove(npc);&lt;br /&gt;
			}&lt;br /&gt;
			else if(msg0 == &amp;quot;delete&amp;quot;)	//删除除了脚本以外所有生成的外观记事卡&lt;br /&gt;
			{&lt;br /&gt;
				string thisScript = llGetScriptName();&lt;br /&gt;
				string inventoryItemName;&lt;br /&gt;
&lt;br /&gt;
				integer index = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
				while (index)&lt;br /&gt;
				{&lt;br /&gt;
					--index;        // (faster than index--;)&lt;br /&gt;
&lt;br /&gt;
					inventoryItemName = llGetInventoryName(INVENTORY_ALL, index);&lt;br /&gt;
&lt;br /&gt;
					if (inventoryItemName != thisScript)&lt;br /&gt;
						llRemoveInventory(inventoryItemName);&lt;br /&gt;
				}&lt;br /&gt;
				llOwnerSay(&amp;quot;All generated files except the script have been deleted.&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
			else if (msg0 == &amp;quot;say&amp;quot; &amp;amp;&amp;amp; osIsNpc(npc))    //npc说话，打招呼&lt;br /&gt;
			{&lt;br /&gt;
				osNpcSay(npc, &amp;quot; I am your worst Nightmare, &amp;quot; + (string)npc);&lt;br /&gt;
			}&lt;br /&gt;
			else if (msg0 == &amp;quot;move&amp;quot; &amp;amp;&amp;amp; msg1 != &amp;quot;&amp;quot; &amp;amp;&amp;amp; msg2 != &amp;quot;&amp;quot; &amp;amp;&amp;amp; osIsNpc(npc))    //移动一个npc，输入的为npc移动的目标地址&lt;br /&gt;
			{&lt;br /&gt;
				vector pos = &amp;lt;(integer)msg1, (integer)msg2, 0&amp;gt;;&lt;br /&gt;
				//z值可输入，也可不输入，最终高度取决于地形&lt;br /&gt;
				if (msg3 != &amp;quot;&amp;quot;)&lt;br /&gt;
				{&lt;br /&gt;
					pos.z = (integer)msg3;&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				osNpcMoveTo(npc, pos);&lt;br /&gt;
			}&lt;br /&gt;
			else if (msg0 == &amp;quot;movetarget&amp;quot; &amp;amp;&amp;amp; osIsNpc(npc))    //移动npc到人物（用户）附近&lt;br /&gt;
			{&lt;br /&gt;
				osNpcMoveToTarget(npc, llGetPos() + &amp;lt;9,9,5&amp;gt;, OS_NPC_FLY|OS_NPC_LAND_AT_TARGET);&lt;br /&gt;
			}&lt;br /&gt;
			else if (msg0 == &amp;quot;rot&amp;quot; &amp;amp;&amp;amp; osIsNpc(npc))    //使npc旋转一个方向&lt;br /&gt;
			{&lt;br /&gt;
				vector xyz_angles = &amp;lt;0,0,90&amp;gt;; // 定义一个度数改变值&lt;br /&gt;
				vector angles_in_radians = xyz_angles * DEG_TO_RAD; //改变弧度&lt;br /&gt;
				rotation rot_xyzq = llEuler2Rot(angles_in_radians); //改变旋转度数&lt;br /&gt;
				rotation rot = osNpcGetRot(npc);&lt;br /&gt;
				osNpcSetRot(npc, rot * rot_xyzq);&lt;br /&gt;
			}&lt;br /&gt;
			else if (msg0 == &amp;quot;rotabs&amp;quot; &amp;amp;&amp;amp; msg1 != &amp;quot;&amp;quot;)    //使npc旋转给定角度&lt;br /&gt;
			{&lt;br /&gt;
				vector xyz_angles = &amp;lt;0, 0, (integer)msg1&amp;gt;;&lt;br /&gt;
				vector angles_in_radians = xyz_angles * DEG_TO_RAD;&lt;br /&gt;
				rotation rot_xyzq = llEuler2Rot(angles_in_radians);&lt;br /&gt;
				osNpcSetRot(npc, rot_xyzq);&lt;br /&gt;
			}&lt;br /&gt;
			else if (msg0 == &amp;quot;save&amp;quot; &amp;amp;&amp;amp; msg1 != &amp;quot;&amp;quot; &amp;amp;&amp;amp; osIsNpc(npc))    //保存npc的外观到给定名称的记事卡中&lt;br /&gt;
			{&lt;br /&gt;
				osNpcSaveAppearance(npc, msg1);&lt;br /&gt;
				llOwnerSay(&amp;quot;Saved appearance &amp;quot; + msg1 + &amp;quot; to &amp;quot; + npc);&lt;br /&gt;
			}&lt;br /&gt;
			else if (msg0 == &amp;quot;load&amp;quot; &amp;amp;&amp;amp; msg1 != &amp;quot;&amp;quot; &amp;amp;&amp;amp; osIsNpc(npc))    //npc加载指定外观记事卡&lt;br /&gt;
			{&lt;br /&gt;
				osNpcLoadAppearance(npc, msg1);&lt;br /&gt;
				llOwnerSay(&amp;quot;Loaded appearance &amp;quot; + msg1 + &amp;quot; to &amp;quot; + npc);&lt;br /&gt;
			}&lt;br /&gt;
			else if (msg0 == &amp;quot;clone&amp;quot;  &amp;amp;&amp;amp; msg1 != &amp;quot;&amp;quot;)    //保存拥有者外观到给定名称的记事卡中&lt;br /&gt;
			{&lt;br /&gt;
				osOwnerSaveAppearance(msg1);&lt;br /&gt;
				llOwnerSay(&amp;quot;Cloned your appearance to &amp;quot; + msg1);&lt;br /&gt;
			}&lt;br /&gt;
			else if (msg0 == &amp;quot;stop&amp;quot; &amp;amp;&amp;amp; osIsNpc(npc))    //使npc停止移动，如果npc在运动中的话&lt;br /&gt;
			{&lt;br /&gt;
				osNpcStopMoveToTarget(npc);&lt;br /&gt;
			}&lt;br /&gt;
			else if (msg0 == &amp;quot;sit&amp;quot; &amp;amp;&amp;amp; msg1 != &amp;quot;&amp;quot; &amp;amp;&amp;amp; osIsNpc(npc))    //使npc坐到指定物体上&lt;br /&gt;
			{&lt;br /&gt;
				osNpcSit(npc, msg1, OS_NPC_SIT_NOW);&lt;br /&gt;
			}&lt;br /&gt;
			else if (msg0 == &amp;quot;stand&amp;quot; &amp;amp;&amp;amp; osIsNpc(npc))        //使npc站立起来&lt;br /&gt;
			{&lt;br /&gt;
				osNpcStand(npc);&lt;br /&gt;
			}&lt;br /&gt;
			else if(msg0 == &amp;quot;npckey&amp;quot; &amp;amp;&amp;amp; msg1 != &amp;quot;&amp;quot;)    //输入npc的key值，为其他操作提供npc的key值&lt;br /&gt;
			{&lt;br /&gt;
				npc = msg1;&lt;br /&gt;
				if(osIsNpc(npc))&lt;br /&gt;
					llOwnerSay(&amp;quot;The value of key is valid.&amp;quot;);&lt;br /&gt;
				else&lt;br /&gt;
					llOwnerSay(&amp;quot;The value of key is not valid.Please re-enter!&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
			else if (msg0 == &amp;quot;help&amp;quot;)    //显示所有命令&lt;br /&gt;
			{&lt;br /&gt;
				llOwnerSay(&amp;quot;Commands are:&amp;quot;);&lt;br /&gt;
				llOwnerSay(&amp;quot;create \t createm \t remove \t delete \t npckey \n&amp;quot; +&lt;br /&gt;
					&amp;quot;\t say \t clone \t load \t save \t rot \t rotabs \n&amp;quot; +&lt;br /&gt;
					&amp;quot;\t move \t movetarget \t stop \t sit \t stand \n&amp;quot; );&lt;br /&gt;
				llOwnerSay(&amp;quot;You can enter '/&amp;quot; + listenChannel +&amp;quot; instruction' to learn more about the communication rules&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
			else if(msg0 == &amp;quot;instruction&amp;quot;)    //显示所有命令的具体说明&lt;br /&gt;
			{&lt;br /&gt;
				llOwnerSay(&amp;quot;In addition to creating and removing operations, you need to enter or check whether the NPC's key values are valid before the rest of the operations are performed.&amp;quot;);&lt;br /&gt;
				llOwnerSay(&amp;quot;create &amp;lt;notecard-name&amp;gt; - Create NPC from a stored notecard.&amp;quot;);&lt;br /&gt;
				llOwnerSay(&amp;quot;create &amp;lt;notecard-name&amp;gt; &amp;lt;firstName&amp;gt; &amp;lt;lastName&amp;gt; - Create NPC from a stored notecard.&amp;quot;);&lt;br /&gt;
				llOwnerSay(&amp;quot;createm &amp;lt;num&amp;gt; - Create a specified number of NPCS.&amp;quot;);&lt;br /&gt;
				llOwnerSay(&amp;quot;remove - Remove the current NPC.&amp;quot;);&lt;br /&gt;
				llOwnerSay(&amp;quot;delete - Delete all generated files except the script.&amp;quot;);&lt;br /&gt;
				llOwnerSay(&amp;quot;npckey &amp;lt;npc-uuid&amp;gt; - Enter a key value for an NPC.&amp;quot;);&lt;br /&gt;
				llOwnerSay(&amp;quot;say - NPCS greet you.&amp;quot;);&lt;br /&gt;
				llOwnerSay(&amp;quot;clone &amp;lt;notecard-name&amp;gt; - Clone own appearance to a notecard.&amp;quot;);&lt;br /&gt;
				llOwnerSay(&amp;quot;load &amp;lt;notecard-name&amp;gt;  - Load appearance on notecard to current npc.&amp;quot;);&lt;br /&gt;
				llOwnerSay(&amp;quot;save &amp;lt;notecard-name&amp;gt;  - Save appearance of current NPC to notecard.&amp;quot;);&lt;br /&gt;
				llOwnerSay(&amp;quot;rot - NPCS rotate in one direction.&amp;quot;);&lt;br /&gt;
				llOwnerSay(&amp;quot;rotabs &amp;lt;angles&amp;gt; - NPC rotation specifies angles.&amp;quot;);&lt;br /&gt;
				llOwnerSay(&amp;quot;move &amp;lt;x&amp;gt; &amp;lt;y&amp;gt; &amp;lt;z&amp;gt; - move to absolute position.&amp;quot;);&lt;br /&gt;
				llOwnerSay(&amp;quot;movetarget - Move NPCS to users nearby.&amp;quot;);&lt;br /&gt;
				llOwnerSay(&amp;quot;stop - If the NPC is moving, it will stop moving.&amp;quot;);&lt;br /&gt;
				llOwnerSay(&amp;quot;sit &amp;lt;target-uuid&amp;gt; - Make a NPC sit on the specified object&amp;quot;);&lt;br /&gt;
				llOwnerSay(&amp;quot;stand - If the NPC is sitting, it will stand.&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				llOwnerSay(&amp;quot;I don't understand [&amp;quot; + msg + &amp;quot;]&amp;quot;);&lt;br /&gt;
				llOwnerSay(&amp;quot;You can enter '/&amp;quot; + listenChannel +&amp;quot; help' to learn more about the communication rules&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 专题探索与应用==&lt;br /&gt;
===NPC生命周期的控制===&lt;br /&gt;
osNpcRemove可以移除化身，但有时候发现模型无缘无故消失了。如何在岛屿启动和关闭时生成和移除化身&lt;br /&gt;
*移除化身工具&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
integer gchannel; // dialog channel&lt;br /&gt;
integer glistener; // holds the listener handle;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSay(0, &amp;quot;单击我开始&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    touch_start(integer x)&lt;br /&gt;
    {&lt;br /&gt;
        if (llDetectedKey(0) == llGetOwner())  {&lt;br /&gt;
            gchannel = llCeil(llFrand(5000) + 5000);&lt;br /&gt;
            glistener = llListen(gchannel,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            llTextBox(llDetectedKey(0), &amp;quot;输入一个NPC的KEY&amp;quot;, gchannel);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
     listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        if(channel==gchannel){&lt;br /&gt;
            llListenRemove(glistener);&lt;br /&gt;
            key npc=(key)message;&lt;br /&gt;
            osNpcSay(npc, &amp;quot;Goodbye!&amp;quot;);&lt;br /&gt;
            osNpcRemove(npc);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===NPC形象如何个性化===&lt;br /&gt;
目前来看，可以通过制作一个化身，然后讲将化身保存下来，然后供其他使用。&lt;br /&gt;
 可以研究下danger上的化身&lt;br /&gt;
&lt;br /&gt;
===如何控制NPC===&lt;br /&gt;
包括移动、控制动作等&lt;br /&gt;
&lt;br /&gt;
===如何与NPC对话===&lt;br /&gt;
如何让NPC接收到化身或物体与他的通信&lt;/div&gt;</summary>
		<author><name>Wyg</name></author>
		
	</entry>
</feed>