// アバターがタイピングしているときだけオブジェクトを見せてつつアバターにアニメーションさせます // アニメの名前 string TypeAnim = "typing"; default { attach(key agent) { // アバターがオブジェクトを装着した if (agent != NULL_KEY) { // パーミッションを取得 llRequestPermissions(agent, PERMISSION_TRIGGER_ANIMATION); } } run_time_permissions(integer parm) { // パーミッションが取得できた if(parm == PERMISSION_TRIGGER_ANIMATION) { // タイマー開始 llSetTimerEvent(0.1); } } timer() { // アバターの状態を取得 integer Status = llGetAgentInfo(llGetOwner()); // アバターがタイピング(チャット入力)中 if (Status & AGENT_TYPING){ // オブジェクトを見えるように llSetLinkAlpha(LINK_SET,1.0,ALL_SIDES); // アニメを開始 llStartAnimation(TypeAnim); } // アバターがタイピングをやめた else{ // オブジェクトを隠す llSetLinkAlpha(LINK_SET,0.0,ALL_SIDES); // アニメを停止 llStopAnimation(TypeAnim); } } }
きになった点は、タイマーで0.1秒ごとにアバターをチェックしていますが、前にチェックしたときの状態を持っていないため、毎回llSetLinkAlphaとllStart/StopAnimationを実行しているところ。
グローバル変数でedgeという変数を用意して、前回の情報をとっておくようにしました。
追記:下にさらに修正したものがあります
string TypeAnim = "typing"; key owner; integer edge = 0; default { attach(key agent) { if ( agent != NULL_KEY ) { owner = llGetOwner(); llRequestPermissions(agent, PERMISSION_TRIGGER_ANIMATION); } else { edge = 0; } } run_time_permissions(integer perm) { if ( perm == PERMISSION_TRIGGER_ANIMATION ) { llSetTimerEvent(0.1); } } timer() { if ( llGetAgentInfo(owner) & AGENT_TYPING ) { if ( !edge ) { edge = 1; llSetLinkAlpha(LINK_SET, 1.0, ALL_SIDES); llStartAnimation(TypeAnim); } } else if ( edge ) { edge = 0; llSetLinkAlpha(LINK_SET, 0.0, ALL_SIDES); llStopAnimation(TypeAnim); } } }
か、解説がめんどうに。。。w 興味のある人はちょっと考えてみてくださいネ。
追記
HidenoriさんとFakeさんに添削されました!
ぜんぜん気づいてなかったところ(´・ω・`)
- タイマーの開始条件が謎
- タイマー止めてないよ
string TypeAnim = "typing"; key owner; integer edge = 0; default { attach(key agent) { if ( agent != NULL_KEY ) { owner = llGetOwner(); llRequestPermissions(agent, PERMISSION_TRIGGER_ANIMATION); llSetTimerEvent(0.1); } else { edge = 0; llSetTimerEvent(0.0); // 追記 timer止めてなかった(っ_・`) } } timer() { if ( (llGetAgentInfo(owner) & AGENT_TYPING) ) { if ( !edge ) { edge = 1; llSetLinkAlpha(LINK_SET, 1.0, ALL_SIDES); llStartAnimation(TypeAnim); } } else if ( edge ) { edge = 0; llSetLinkAlpha(LINK_SET, 0.0, ALL_SIDES); llStopAnimation(TypeAnim); } } }
0 件のコメント:
コメントを投稿