2015年07月01日
テクスチェンジのHUDについて
スクリプトの基本的な構造は理解した!というレベルではありますが、ヘアオブジェクトのテクスチェンジHUDを作りたいと思っております。
現段階では
HUDのボタン(例えば茶髪切り替え用)を押したとき、ヘアオブジェクトの子プリムすべて(親プリムには常にショップロゴが貼ってある状態)を1つの茶髪用のテクスに替えることができました。
次のステップとして、
同じくボタンを押したとき、子プリムの中のでも"このプリムにはAのテクス"、"この部分のプリムにはBのテクス"というように
複数のテクスをそれぞれ対応するプリムへと結びつけたいですがなかなか上手くいきません。
HUD側でチャンネルの設定と、llsayで数パターンのテクスをUUIDで送信してます。
ヘアオブジェクト側でチャンネルを合わせてllListenで受信してオーナーかの確認をするところまではできているのですが、
そのあとがどうもおかしいようで「Syntax error」となってしまいます。
自分の中で考えているのはテクスAを貼りたいプリム名をprim1,テクスBを貼りたいプリム名をprim2にして
演算子の判定を使ってそれぞれのプリムのテクスを変更できるのでは?と思ったのですが....(以下詳細)
integer channel=◯◯◯◯◯◯◯;
default
{
state_entry()
{
llListen(channel,"",NULL_KEY,"");
}
listen(integer channel, string name, key id, string msg)
{
if (llGetOwner() == llGetOwnerKey(id))
{
if(llGetLinkName(i) == "prim1") && (msg == "テクスAのUUID"){llSetTexture(llGetSubString(msg,0,-1),ALL_SIDES);}
else if(llGetLinkName(i)=="prim2") && (msg == "テクスBのUUID"){llSetTexture(llGetSubString(msg,0,-1),ALL_SIDES);}
}
}
}
ちなみにこの形でいくと、替えたいヘアカラーのボタンを増やしていくときにelse if文を書き足すことになってしまい数十種類のカラーセットの場合など限界があると思うのですが、もっといい方法があるのでしょうか?
その際テクスはインベントリに入れるのではなくUUID型で使用したいのと、ヘアオブジェクト側は親プリムのみにスクリプトを入れるようにしたいです。
どなたか教えていただけるとありがたいです。
よろしくお願いします><
現段階では
HUDのボタン(例えば茶髪切り替え用)を押したとき、ヘアオブジェクトの子プリムすべて(親プリムには常にショップロゴが貼ってある状態)を1つの茶髪用のテクスに替えることができました。
次のステップとして、
同じくボタンを押したとき、子プリムの中のでも"このプリムにはAのテクス"、"この部分のプリムにはBのテクス"というように
複数のテクスをそれぞれ対応するプリムへと結びつけたいですがなかなか上手くいきません。
HUD側でチャンネルの設定と、llsayで数パターンのテクスをUUIDで送信してます。
ヘアオブジェクト側でチャンネルを合わせてllListenで受信してオーナーかの確認をするところまではできているのですが、
そのあとがどうもおかしいようで「Syntax error」となってしまいます。
自分の中で考えているのはテクスAを貼りたいプリム名をprim1,テクスBを貼りたいプリム名をprim2にして
演算子の判定を使ってそれぞれのプリムのテクスを変更できるのでは?と思ったのですが....(以下詳細)
integer channel=◯◯◯◯◯◯◯;
default
{
state_entry()
{
llListen(channel,"",NULL_KEY,"");
}
listen(integer channel, string name, key id, string msg)
{
if (llGetOwner() == llGetOwnerKey(id))
{
if(llGetLinkName(i) == "prim1") && (msg == "テクスAのUUID"){llSetTexture(llGetSubString(msg,0,-1),ALL_SIDES);}
else if(llGetLinkName(i)=="prim2") && (msg == "テクスBのUUID"){llSetTexture(llGetSubString(msg,0,-1),ALL_SIDES);}
}
}
}
ちなみにこの形でいくと、替えたいヘアカラーのボタンを増やしていくときにelse if文を書き足すことになってしまい数十種類のカラーセットの場合など限界があると思うのですが、もっといい方法があるのでしょうか?
その際テクスはインベントリに入れるのではなくUUID型で使用したいのと、ヘアオブジェクト側は親プリムのみにスクリプトを入れるようにしたいです。
どなたか教えていただけるとありがたいです。
よろしくお願いします><
モール用のプリムカウンターを探しています
連続するアニメーションの処理
オブジェクトの上にフローティングテキストを出す。
チャットログの盗聴について
椅子に座った後で位置調整できるスクリプト
プカプカ浮くスクリプト。
連続するアニメーションの処理
オブジェクトの上にフローティングテキストを出す。
チャットログの盗聴について
椅子に座った後で位置調整できるスクリプト
プカプカ浮くスクリプト。
前もってテクスチャーを貼り分けたい子プリムの名前もしくは説明欄に識別用の名前を付けます。
テクスチャーのUUIDと識別用の名前をリストに持っておき、
方法1:、テクスチャーを変えるときに、全ての子プリムの名前または説明欄を調べて、名前が一致した場合、該当するテクスチャーを貼ります。
方法2:最初に全ての子プリムの名前または説明欄を調べて、名前が一致した場合、そのリンク番号をリストに保存しておきます。この時テクスチャーリストと対応できるように保存します。
テクスチャーを変えるときは、保存したリンク番号でテクスチャーを貼ります。
他にも方法はあるかもですが、こういう処理の仕方でいけるはずです。
ちなみに、「Syntax error」となるのは、llGetLinkName(i)の変数iが定義されていないためです。
なるほど、詳しい解説をいただいて助かります><
ご指摘があったllGetLinkName(i)の変数iの定義をしてみたのですが
変わらずSyntax errorとなってしまいますね。。。なぜでしょう@@
エラーは「(llGetLinkName(i) == "prim1")」の部分の末尾と
「(llGetLinkName(i)=="prim2")」の末尾のようです。
これらはiの定義付けをしていない状態からエラーとなっています;
integer channel=◯◯◯◯◯◯◯;
default
{
state_entry()
{
llListen(channel,"",NULL_KEY,"");
}
listen(integer channel, string name, key id, string msg)
{
if (llGetOwner() == llGetOwnerKey(id))
{
integer i = llGetNumberOfPrims();
for (; i >= 0; --i)
{
if(llGetLinkName(i) == "prim1") && (msg == "テクスAのUUID"){llSetTexture(llGetSubString(msg,0,-1),ALL_SIDES);}
else if(llGetLinkName(i)=="prim2") && (msg == "テクスBのUUID"){llSetTexture(llGetSubString(msg,0,-1),ALL_SIDES);}
}
}
}
}
たとえ条件が単項式であっても括弧は必須です。
このため
if ( 条件式 ) アクション;
と記述する必要があります
if 条件式 アクション;
このように括弧を省略した表記は解釈されません
おそらくは最初の対応する括弧の後の位置をsyntax errorが示しているはずです
参考 : http://wiki.secondlife.com/wiki/If/ja
助言をいただいたおかげでsyntax errorの件は無事に解決しました。
()の使い方を誤解しておりました><;
修正して保存後、HUDを試してみたのですが
なぜか親プリムだけが反応してテクスA→Bと替わってしまいました。
llSetTextureのせいかなと思って
llSetLinkTexture(LINK_ALL_CHILDREN,msg,ALL_SIDES);に書き換えてみたのですが
全プリムがテクスA→Bと替わってしまいます。む、むずかしい。。。
ありがとうございました!