//適当にコメント付きソースを貼っつけとく
//まぁやってることは単純明快です
//コピペすりゃ動くようにしてあるけどインデントとかは各自なんとかしてください
//タイピングアニメーションスクリプト mod v1.0 20140219 by UEPONYA
//******基本的な使い方****************
//スクリプトとアニメを一緒にいれればおk
//スクリプトが先ならアニメが入った時点でリロードがかかりますし
//アニメが先ならスクリプトの初期化時にロードされます
//複数アニメ対応とかは面倒なので無し
//---------以下解説とソース------------------
//*****装着物スクリプトの基本*******
//装着物は基本的に 装着をon_rez 取り外しをattachイベントで検出します
//タイマーはよっぽどの用途でも無い限りは0.2秒レートがええです
//AO系でタイマーを起動する場合 パーミッション取得出来た時のみにしたほうがうけがよろしいです
//*****負荷コントロール周り*********
//あとLSLの基本としてスクリプト外への出力は最低限のレートに留めるべきとされています
//データ取得に関しては関数一個で完結するものはいくらやってもok
//内部での変数書き換えはリスト以外なら気にせずじゃんじゃんやっちまっていい
key owner_key;
string anim_name;
integer Cur_status;
integer Lst_status;
default
{
state_entry()
{
owner_key = llGetOwner();
anim_name = llGetInventoryName(INVENTORY_ANIMATION,0);//アニメーション取得は一回でおk
llRequestPermissions(llGetOwner(),PERMISSION_TRIGGER_ANIMATION);
}
run_time_permissions(integer perm){
//ホントはちゃんと取得されたパーミッションフラグを確認せんとあかんのだけど
//こんくらいのスクリプトなら無くても割と問題なく動くのでやらない
llSetTimerEvent(0.2);//ハイレートすぎると重いのでこの程度にしておく
}
timer()
{
Cur_status = llGetAgentInfo(owner_key) & AGENT_TYPING;
// 同じ情報の参照が二箇所以上ある場合はグローバル変数にぶっこむ方がトータルでは軽い
if(Cur_status!=Lst_status){//切り替わった時だけアニメ再生を制御するほうが軽い
if (Cur_status){//このへんのif elseの書き方は全体の書かれ方とかを見て決める
//タイピング開始時の処理
llStartAnimation(anim_name);
}else{
//タイピング終了時の処理
llStopAnimation(anim_name);
}
Lst_status=Cur_status;
}
}
changed(integer change){
if(change&CHANGED_INVENTORY)llResetScript();//プリムの中身変わったらスクリプトリセットしてしまう
//これだけでよっぽどのバグが無い限り回復するのでメンテナンスフリーになる
}
attach(key id)
{
if(id==NULL_KEY){//デタッチ時はアニメーションのパーミッションを取得してる前提で止めちゃう
llSetTimerEvent(0.0);//別にタイマー止める必要は全くないんだがテンプレみたいなもんなので
llStopAnimation(anim_name);
}
}
on_rez(integer t){
llResetScript();//装着時はアタッチよりonrezが先にくるのでここでリセットしてしまう
}
}
0 件のコメント:
コメントを投稿