这其实很简单。
您犯的一个错误是,您向触摸该对象的人请求允许制作动画。这意味着,无论这个对象是否被某人佩戴,它都会请求触摸者的许可,而不是佩戴者。因此,您的变体可以用作附在某人身上的舞蹈机器。但是你只希望穿戴者有动画,所以你需要使用llGetOwner()
来代替,因为穿戴者始终是对象的所有者。
要使触摸事件仅“听到”“触摸者”,只需将其中的任何内容放入if(llDetectedKey(0) == TOUCHER)
语句中即可。并且不要忘记括号。
所以,工作代码是
//specify the key of the agent that you want to be the 'TOUCHER'
key TOUCHER = "a6e50f98-cacf-4442-814b-cdf0a5554648";
integer playing;
default
{
state_entry()
{
playing = FALSE;
}
touch_start(integer start_param)
{
if(llDetectedKey(0) == TOUCHER)
{
if(playing == FALSE)
{
llRequestPermissions(llGetOwner(),PERMISSION_TRIGGER_ANIMATION);
}
else if(playing == TRUE)
{
llStopAnimation(llGetInventoryName(INVENTORY_ANIMATION,0));
playing = FALSE;
}
}
}
run_time_permissions(integer perm)
{
if (perm & PERMISSION_TRIGGER_ANIMATION)
{
playing = TRUE;
llStartAnimation(llGetInventoryName(INVENTORY_ANIMATION,0));
}
}
}
和一般建议。没必要写
if(playing == FALSE)
{
llRequestPermissions(llGetOwner(),PERMISSION_TRIGGER_ANIMATION);
}
else if(playing == TRUE)
{
llStopAnimation(llGetInventoryName(INVENTORY_ANIMATION,0));
playing = FALSE;
}
因为“else”已经意味着 if 中的任何条件都不为真。所以,在这种情况下,else 已经意味着“if(playing == TRUE)”,所以不需要再次指定。此外,如果您正在使用所谓的“布尔”值(LSL 没有真正的布尔值,只有整数。但那些是整数,您只给出 TRUE (1) 或 FALSE (0) 的值),它很多这么说更容易更短:
if(playing){}
是相同的if(playing == TRUE)
if(!playing){}
意思是“如果不玩”或相同if(playing == FALSE)
如果我走得更远,有一种方法可以摆脱playing
变量并在任何地方手动设置它。脚本可以通过 来检测佩戴者是否正在播放某个动画(带有某个键)llGetAnimationList( llGetOwner() );
。它会返回一个当前正在佩戴者身上播放的所有动画(作为键,而不是名称!)的列表。
然后你可以简单地检查你的动画是否在该列表中if(llListFindList(anims, [llGetInventoryKey(animation)]) == -1)
最终的代码是这样的。我不确定它是否完全有效,是否是最好的方法,但对我有用。8)
//specify the key of the agent that you want to be the 'TOUCHER'
key TOUCHER = "a6e50f98-cacf-4442-814b-cdf0a5554648";
//stores the key of an inventory animation to be played
string animation;
default
{
state_entry()
{
animation = llGetInventoryName(INVENTORY_ANIMATION,0);
}
touch_start(integer start_param)
{
//check if the allowed avatar touched the object
if(llDetectedKey(0) == TOUCHER)
{
llRequestPermissions(llGetOwner(),PERMISSION_TRIGGER_ANIMATION);
}
}
run_time_permissions(integer perm)
{
if (perm & PERMISSION_TRIGGER_ANIMATION)
{
//get all animations being played on the owner of the object as keys
list anims = llGetAnimationList( llGetOwner() );
//if the animation is NOT being played, start it. Else, stop it
if(llListFindList(anims, [llGetInventoryKey(animation)]) == -1)
{
llStartAnimation(animation);
}
else
{
llStopAnimation(animation);
}
}
}
}