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型で使用したいのと、ヘアオブジェクト側は親プリムのみにスクリプトを入れるようにしたいです。
どなたか教えていただけるとありがたいです。
よろしくお願いします><


同じカテゴリー(スクリプト関連)の記事画像
オブジェクトのリンクとタッチで開く扉
自動チャットを止めたい
テレポートするとアニメーションが解除される
同じカテゴリー(スクリプト関連)の記事
 モール用のプリムカウンターを探しています (2014-11-29 20:09)
 連続するアニメーションの処理 (2014-08-24 03:23)
 オブジェクトの上にフローティングテキストを出す。 (2014-08-22 16:46)
 チャットログの盗聴について (2014-02-03 03:43)
 椅子に座った後で位置調整できるスクリプト (2013-03-24 16:37)
 プカプカ浮くスクリプト。 (2013-03-12 17:32)

Posted by kerry  at 04:51 │Comments(5)スクリプト関連

この記事へのコメント
親プリムから複数の任意の子プリムにテクスチャーを貼り分けたい場合、以下の様な方法が考えられます。
前もってテクスチャーを貼り分けたい子プリムの名前もしくは説明欄に識別用の名前を付けます。
テクスチャーのUUIDと識別用の名前をリストに持っておき、

方法1:、テクスチャーを変えるときに、全ての子プリムの名前または説明欄を調べて、名前が一致した場合、該当するテクスチャーを貼ります。

方法2:最初に全ての子プリムの名前または説明欄を調べて、名前が一致した場合、そのリンク番号をリストに保存しておきます。この時テクスチャーリストと対応できるように保存します。
テクスチャーを変えるときは、保存したリンク番号でテクスチャーを貼ります。

他にも方法はあるかもですが、こういう処理の仕方でいけるはずです。
ちなみに、「Syntax error」となるのは、llGetLinkName(i)の変数iが定義されていないためです。
Posted by あっと at 2015年07月02日 08:06
あっとさん、コメントありがとうございます!
なるほど、詳しい解説をいただいて助かります><
ご指摘があった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);}
}
}
}
}
Posted by kerrykerry at 2015年07月03日 06:16
LSLでの制御文 if の条件式の記述は対応する括弧で囲まなくてはなりません。
たとえ条件が単項式であっても括弧は必須です。

このため

if ( 条件式 ) アクション;

と記述する必要があります


if 条件式 アクション;

このように括弧を省略した表記は解釈されません
おそらくは最初の対応する括弧の後の位置をsyntax errorが示しているはずです





参考 : http://wiki.secondlife.com/wiki/If/ja
Posted by まぁ頑張れや at 2015年07月03日 07:07
まぁ頑張れやさん、コメントありがとうございます!
助言をいただいたおかげでsyntax errorの件は無事に解決しました。
()の使い方を誤解しておりました><;
修正して保存後、HUDを試してみたのですが
なぜか親プリムだけが反応してテクスA→Bと替わってしまいました。
llSetTextureのせいかなと思って
llSetLinkTexture(LINK_ALL_CHILDREN,msg,ALL_SIDES);に書き換えてみたのですが
全プリムがテクスA→Bと替わってしまいます。む、むずかしい。。。
Posted by kerrykerry at 2015年07月03日 08:33
integer linknumberをiにしたら無事に完成しました!
ありがとうございました!
Posted by kerrykerry at 2015年07月03日 08:43
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。