汎用ポーズチェンジスクリプト
概要
- 椅子に入れたポーズをタッチ→ダイアログからチェンジするスクリプトです
- 途中でポーズを追加したり削除したりしても、スクリプトを編集しなおす必要はありません
- タッチしにくいポーズボールには不向きです
- ポーズは理論上、無限に入れることができます
ソースコード
- posechange.lsl
// changepose.lsl :: 2008-08-06 // Sit Position uuSetSitPosition(){ vector sit_pos = <0.0, 0.0, 0.1>; vector sit_rot = <0.0, 0.0, 0.0>; llSitTarget(sit_pos, llEuler2Rot(sit_rot * DEG_TO_RAD)); } // Pose integer pose_num; integer now_pose_num = 1; string now_pose_name; list pose_name; list button = ["<<", "UnSit", ">>", "4", "5", "6", "1", "2", "3"]; uuSetPoseNum(){ pose_num = llGetInventoryNumber(INVENTORY_ANIMATION); llSay(0, (string)pose_num + "個のポーズをセットしました"); } uuLoadPose(string str){ if (str == "<<"){ now_pose_num -= 6; if (now_pose_num < 1){ now_pose_num += pose_num; } }else if (str == ">>"){ now_pose_num += 6; if (now_pose_num > pose_num){ now_pose_num -= pose_num; } } pose_name = []; integer i; integer g; for (i=now_pose_num; i<now_pose_num+6; i++){ g = i; if (g > pose_num){ g -= pose_num; } pose_name += llGetInventoryName(INVENTORY_ANIMATION, g - 1); } } uuStartPose(){ now_pose_name = llList2String(pose_name, 0); llStartAnimation(now_pose_name); llStopAnimation("sit"); } uuChangePose(string num){ string new_pose_name = llList2String(pose_name, (integer)(num) - 1); llStartAnimation(new_pose_name); llStopAnimation(now_pose_name); now_pose_name = new_pose_name; } // Interface integer d_ch = -99999; integer handle; float listen_remove = 60.0; uuListen(integer flug){ if (flug){ handle = llListen(d_ch, "", llAvatarOnSitTarget(), ""); llSetTimerEvent(listen_remove); }else{ llSetTimerEvent(0.0); llListenRemove(handle); } } uuDialog(){ string pose_list; integer i; for (i=0; i<6; i++){ pose_list += (string)(i + 1) + " : " + llList2String(pose_name, i) + " \n"; } uuListen(TRUE); llDialog(llAvatarOnSitTarget(), pose_list, button, d_ch); } // Flow default{ state_entry(){ uuSetSitPosition(); uuSetPoseNum(); uuLoadPose(""); } changed(integer change){ if (change & CHANGED_INVENTORY){ uuSetPoseNum(); }else if (change & CHANGED_LINK && llAvatarOnSitTarget() != NULL_KEY){ llRequestPermissions(llAvatarOnSitTarget(), PERMISSION_TRIGGER_ANIMATION); } } run_time_permissions(integer perm){ if (perm & PERMISSION_TRIGGER_ANIMATION){ uuStartPose(); } } touch_start(integer total_number){ if (llDetectedKey(0) == llAvatarOnSitTarget()){ uuDialog(); }else{ llInstantMessage(llDetectedKey(0), "Sit down please before touching."); } } listen(integer channel, string name, key id, string message){ uuListen(FALSE); if (message == ">>" || message == "<<"){ uuLoadPose(message); uuDialog(); }else if (message == "UnSit"){ llUnSit(llAvatarOnSitTarget()); }else{ uuChangePose(message); } } timer(){ uuListen(FALSE); } }
スクリプトの説明・設定方法
Sit Positionの設定
// Sit Position uuSetSitPosition(){ vector sit_pos = <0.0, 0.0, 0.1>; vector sit_rot = <0.0, 0.0, 0.0>; llSitTarget(sit_pos, llEuler2Rot(sit_rot * DEG_TO_RAD)); }
位置
次の数値を編集します。単位は「メートル」です。
vector sit_pos = <0.0, 0.0, 0.1>;
全ての数値を「0.0(または0)」にすると、llAvatarOnSitTarget()関数で座ったアバターのUUIDを取得できないというLSLの仕様がありますので、注意してください。
角度
次の数値を編集します。単位は「度」です。
vector sit_rot = <0.0, 0.0, 0.0>;
各ユーザ関数について
uuSetSitPosition()
座る位置と角度を設定します。
uuSetSitPosition(){ vector sit_pos = <0.0, 0.0, 0.1>; vector sit_rot = <0.0, 0.0, 0.0>; llSitTarget(sit_pos, llEuler2Rot(sit_rot * DEG_TO_RAD)); }
uuSetPoseNum()
コンテンツ内にいくつのポーズが存在するかを取得し、変数「pose_num」に格納します。
uuSetPoseNum(){ pose_num = llGetInventoryNumber(INVENTORY_ANIMATION); llSay(0, (string)pose_num + "個のポーズをセットしました"); }
uuLoadPose(string str)
コンテンツ内にあるポーズの中から、ダイアログに表示するために6つのポーズ名を取得し、変数「pose_name」に格納します。
uuLoadPose(string str){ if (str == "<<"){ now_pose_num -= 6; if (now_pose_num < 1){ now_pose_num += pose_num; } }else if (str == ">>"){ now_pose_num += 6; if (now_pose_num > pose_num){ now_pose_num -= pose_num; } } pose_name = []; integer i; integer g; for (i=now_pose_num; i<now_pose_num+6; i++){ g = i; if (g > pose_num){ g -= pose_num; } pose_name += llGetInventoryName(INVENTORY_ANIMATION, g - 1); } }
llGetInventoryNumber(integer type)
この関数は、コンテンツ内に10個のアイテムがあると「10」という数値を返します。すなわち、1から始まる整数値ということです。
この関数は、コンテンツ内に10個のアイテムがあると「10」という数値を返します。すなわち、1から始まる整数値ということです。
llGetInventoryName(integer type, integer number)
この関数の「number」に指定する数値は0から始まる整数値です。例えば、「10番目」のアイテム名を調べたければ「9」を指定しなければいけません。
uuLoadPose内で「1を引いて調整している」箇所が分かりますか?
uuStartPose()
座った直後にポーズを再生します。
uuStartPose(){ now_pose_name = llList2String(pose_name, 0); llStartAnimation(now_pose_name); llStopAnimation("sit"); }
uuChangePose(string num)
ダイアログからのコマンドをstring numで受け取り、それに対応したポーズを再生します。
uuChangePose(string num){ string new_pose_name = llList2String(pose_name, (integer)(num) - 1); llStartAnimation(new_pose_name); llStopAnimation(now_pose_name); now_pose_name = new_pose_name; }
uuListen(integer flug)
リスンのON / OFFを切り替えます。
uuListen(integer flug){ if (flug){ handle = llListen(d_ch, "", llAvatarOnSitTarget(), ""); llSetTimerEvent(listen_remove); }else{ llSetTimerEvent(0.0); llListenRemove(handle); } }
uuDialog()
ダイアログを表示します。
uuDialog(){ string pose_list; integer i; for (i=0; i<6; i++){ pose_list += (string)(i + 1) + " : " + llList2String(pose_name, i) + " \n"; } uuListen(TRUE); llDialog(llAvatarOnSitTarget(), pose_list, button, d_ch); }