Небольшое несоответствие языка: чтобы заставить объект исполнить танец, в настоящее время известно как "puppetry" в контексте SecondLife. Термин "бот" в настоящее время означает управление аватаром с помощью внешнего скрипта API.
Во всяком случае, в одном случае мне понадобилось около двух часов, чтобы написать, когда я сделал один для плюшевого мишки несколько недель назад, но это было после того, как я многому научился, разбирая некоторые старые, и я так и не закончил делать танец, он просто покачивает ногами или обнимает руками, но сценарий способен на любое количество шагов и частей, которые вы можете втиснуть в память.
Кукольный мир предметов не сильно улучшился за последнее десятилетие. Это сильно ограничено частотой обновления движений и скриптовыми ограничениями. Перемещение часто задерживается под нагрузкой на сервер, и клиент не всегда получает обновления, которые производят паузы и пропуски в различной степени. Сценарии имеют максимальный размер 64 КБ, которого должно быть достаточно, но на самом деле он быстро заканчивается с необходимыми в Lsl извилинами. Перемещение каждого связанного элемента в объект, отдельно используемый для сценария в каждом элементе, до тех пор, пока не будут введены новые функции для применения атрибутов по номеру ссылки, все же многие объекты используют старые сценарии, которые никогда не могут быть обновлены. Отставные куклы делают жалкое зрелище, но большинство пользователей не знают, как найти хороший сценарий кукольного театра.
Популярный способ начать создание кукольного сценария - найти в Интернете более старый открытый кукольный сценарий с открытым исходным кодом и обновить его для работы из одного сценария. Некоторые версии archane представлены как сценарии 'master' и 'slave', которые необходимо объединить, поместив подчиненные действия как функцию в master, заменив llMessageLinked( )
на имя функции. Другие используют идентичный скрипт для каждого прайма. Я сказал популярным, а не самым простым или самым легким, и он никогда не будет лучшим.
Сценарии с нуля, активному потоку необходимо перейти в событие таймера, в котором больше ничего нет. Используйте другое состояние для анимации, если при ожидании необходим таймер, потому что это тяжелое занятие, и вам больше не нужны ifs или buts.
Наиболее важной задачей является создание цикла для построения параметров из списка номеров ссылок, позиций и поворотов в список параметров перед llSetLinkPrimitiveParamsFast( )
. Да, это то, что они назвали, потому что это тяжелая функция, основанная на списках, вы можете просто назвать ее SLPPF в мире, но не в сценарии. Поскольку SLPPF требует, чтобы вызов имел определенные константы для каждого параметра, список параметров для каждого шага должен будет включать PRIM_LINK_TARGET, linknumber, PRIM_POS, position, PRIM_ROT, rotation
для каждой связанной части в шаге анимации.
Вот пример помещения списка одиночных шагов кукловодства в SLPPF.
list parameters;
integer index;
while ( index < total ) { // total number of elements in each list
parameters += [
PRIM_LINK_TARGET, llList2Integer( currentstep, index ),
PRIM_POS, llList2Vector( currentstep, index+1 ),
PRIM_ROT, llList2Rotation( currentstep, index+2 )
];
index += 3;
}
llSetLinkPrimitiveParamsFast( 0, parameters );
Другое дело, как вы создаете текущий список шагов, но наиболее плавное движение по многим связанным частям будет возможно только в том случае, если скрипт не перемещает списки. Таким образом, если запуск таймера в 0,2 секунды не является улучшением по сравнению с 0,3, это потому, что вы сказали lsl убирать слишком много списков. Этот цикл с тремя вызовами списка может обрабатывать около 20 ссылок за 0,1 секунды, если погода хорошая.
Это на самом деле самое худшее, просто будьте осторожны с памятью, если в память слишком много списков шагов. О, и если ваш объект просто исчезнет полностью, он будет зависать около <0,0,0>
, потому что 1
приземлился в PRIM_LINK_TARGET
дыру.