UnityのUV Overlapが思っていたのと違う件

---UnityのUV Overlapが思っていたのと違う件---

Unityのライトマップについて学習していても
Refferenceが意味不明の場合が多いので
Toolから攻めてみることにします
今回はライトマップのUV overlapを試してみました
debugDrawModeとViewに選択肢があります

これは何を表示するものでしょうか

Blender側でUVの重なったものをいくつか用意しました

GLBファイルを経由したので2つ目のUV2として用意しました
最初は黒地に白で何も見えませんでしたが
拡大するとみえてきました
Lightmap Resolution=解像度を40から5にさげたら見えてきました
赤い線が見えてきました

てっきりUV overlapといえば面と面のかさなり
を予想していましたが違うようです

図ではCubeのサイコロ展開図で面を重ねた例です
面と面がかさなっているところはむしろ白のままです
これはどうしたことでしょう
つまり島の重なりではなく海岸線のかさなりを意味しているようです
なので overlapが線か点で現れがちなわけです
それで余白の大小を評価しようとしているようです
表示が推理どおりでないこともあります
推理が不完全なのかToolが不完全なのかもしれません

表示の仕方、使い方がわかってきました
具体的に何の役に立つToolでしょうか
余白=Paddingの大小の話題に登場するようです
しかし、面と面の重なりを警告してくれません。
それは3DCGアプリでやっておけということでしょうか
初級者には不便ですね。

・・・以上

自分用のメモを兼ねた飽くまでも体験的記事です
Refferenceの文章が意味不明なので文献的根拠を示せません
実験と推理の報告です。ご容赦ください
環境Unity6    Blender3.6
2026.9  #cluster

UnityPrimitiveのUV座標

UnityPrimitiveのUV座標
ちょっとしたテストにUnityPrimitiveを使うことがあります
そのUVはどうなっているのでしょうか
Blenderで調べてみました
UVが2種類用意されていることがわかりました
ベイクライトするときに疑問に思ったり
混乱したことがあるのではっきりさせておきたいものです

 




Unityでは UnityPrimitiveのUV展開図を知る方法が見当たりません
importしたFBXにはあるのに
Generate Lightmap UVs も見当たりません
Blenderで調べてみると
cubeと CylinderのUVは重なっています
これはライトベイクするときに困ります
ところがちゃんと2つ目のUVが用意されていました
なお、PlaneとQuadには2つ目のUV座標はありませんでした

UVの名称は BlenderではUVset0 と UVset1 になっていましたが
Blender側の都合かもしれません
Unityでは channel0,channel1 やUV0,UV1 だったりしますが
正確な名称がどうであるかはわかりません

ライトベイクとUV座標の詳細については今回は触れません
自分用のメモを兼ねた飽くまでも体験的記事なので
検証不足もありえますので ご容赦ください

環境Unity6
2026.8  #cluster

Unity6とUnity2021の新月アイコン


Blenderならワイヤフレーム、Textureなし、Textureあり、影ありのボタンがありますが

unityにはそれに相当するボタンがあったのでしょうか
Unity6になってから何か変だとおもっていましたが
ライト関係のメニューが2021と違っています。今更ですが整理してみました
 
図1

ほぼdefaultの状態から
1>2>3>4と 状態をかえてみました
unity6 ---------------
1 unlit ライト無視   満月のアイコンです
2 ライトオン 新月のアイコンです
    unity6では影が真っ黒なのが特徴です
3 bake staticOBJなし
    LightingData  と  reflectionProbeが作られます
4 bake staticOBJあり
    何らかのLightmapファイルが作られます
 
Unity2021-------------
1 ライトなし 新月のアイコンでした
2 ライトオン 電球のアイコンでした トグルスイッチになっています
   Unity2021では結局これで事足りた気がします
3 bake staticOBJなし
    LightingData  と  reflectionProbeが作られます
4 bake staticOBJあり
      何らかのLightmapファイルが作られます
 
考察   満月のアイコン 新月のアイコン の意味が変わっていて混乱ぎみです
Unity2021では最初から環境光がみえているのが今となっては不思議です
reflectionProbeがない段階から見えています
Unity2021ではIOS用にまじないのように取り敢えずbakeしていました
Unity6では 取り敢えずbakeしないと金属反射がみえません
図ではcrome質感の球体を置いています
図2

unity6 ---------------
虫のアイコンが debug mode でトグルスイッチになっています
debug modeと ライトオンがトグルになっています
ヒョットして このボタン一つで普段は事足りる気がします
その右の三角のpulldownメニューの中にたくさん種類があります
Unity2021-------------
新月のアイコンの三角のpulldownメニューの中に debug mode相当がありました
新月アイコンが化けるので当時はアイコンを見失ってうろたえました
アイコンはへたに変化しないほうがいいですね。Unity6の方が使い良いです
 
図3

unity6 ---------------ボタンを見失った時
満月のアイコンや新月のアイコンや虫のアイコンが非表示になるボタンがあります
 Overlaymenu です これ自体も非表示になってしまうことがあります
Sceneビューの上部ツールバー付近にある 右肩の点3つメニューが大元のようです
ここから表示にもどせるようです
Unity6では  Overlaymenu の中に Overlaymenu がもう一つふえました
 ややこしい ことです
Unity2021-------------
Overlaymenuがありましたが 滅多に使わない存在でした
Sceneビューの上部ツールバー付近にある 右肩の点3つメニューからたどると
何とかなるのは変わりがありません
 
ちなみにClusterでは
Unity2021.3.4f1 CCK2.37.1  の次が
Unity6000.2.6f2    CCK3  でした。
  世間では Unity2022,Unity2023  と途中のversionがありますが言及しません
環境はWinです
・・・・以上 ざっと調べた所をまとめました 2026.8  #cluster

ClusterでNavMesh事始め

 
◯ ClusterでNavMesh事始め
2026年7月6日にNavMeshが解禁されました。
最短経路を探索して追いかけてくるアレです
追従ペットに比べて 奥も深い、大物ではありませんか
ちょっとかじってみました。自分用にメモを残します
 
環境  Unity6 CCK3.3.0.2 AI Navigation 2.0.13  CSEmulator V3.08
 
◯ どこから始めればよいのでしょうか 公式tutorialもまだありません。
  かおもさんのサンプルから始めました
NavMeshテスト.zip
◯ どういう仕組か理解するには tutorialやworldをみるより
  ギズモや補助線を観察した方が早いです
playGame中に scneneでAgentを選択していると現れます
ClusterScriptを自作して、工夫をするなら、CSEmulatorが必須になってきます
Cluster上ではNavMeshの青い面やギズモや補助線がみえないですから
◯ どの資料を参考にすればよいでしょうか
 Unityも歴史が重なって古い情報と新しい情報で混乱があります
概略は古い記事も参考になりますが 細かい所で変更点があります
例えば、豆情報を書いておきます
NavMeshから AINavMeshという名称に変わっています
ちなみにAI~という名称は今はやりのAIとは無関係だそうです
今のversionでは staticに設定しなくても NavMeshをbakeできました
Off-Mesh リンクは  NavMeshLink という名称に変更されています。
 
◯ ClusterでUnityのNavMesh機能のどこまでできるのでしょうか ざっと点検してみました
 コンポーネントで言うと
NavMeshAgent   使える
NavMeshSurface 下準備に使う機能なので使える
NavMeshObstacle 動く障害物・・・使えた
NavMeshLink    空中移動 ・・・使えた
NavMeshModifier 下準備に使う機能なので使える
NavMeshModifierVolume 下準備に使う機能なので使える
 その他の機能
HeightMesh、エリアとコストなども 使えました
 
◯ コンポーネントだけでは何も起きない,何も試せない。scriptが必要なようです
参考になるシーンデータはないでしょうか
package managerから AI NavigationSamples が入手できました
sample1~9まであります
C#は、cluster上では機能しません、jsで書き起こす必要があるようです
しかしsampleがUnity上でどう動くかぐらいは見ることができました
公式の方でCluster用の sample scriptを 何種類か提示してほしいところです
 
・・・・以上 途中報告でした  2026.7  #cluster
飽くまでも体験的記事なので 検証不足もありえますので ご容赦ください
 
 
 

NotebookLMでjavascriptの読み込みのトラブル

【概要1】
Boothから入手したscriptをAIによませて改造しようとしたら
苦労した件を報告する
【概要2】
前回のblogでは メモ を使ってたまたま、うまく行った例を書いたが
今回は はっきりした原因を見つけた
javaScriptが資料=ソースとして読み込ますと欠落していた
どうも markdown書式として誤認識されたらしい
書き方を整えていったら改善されてきたが、もうひとつ要因があった。
原因4として Scriptの量がトークン数制限を超えていたことも影響していた。
環境  windows11 unity6 CCK=3   NotebookLM(無料版) 2026年6月頃
以下 AIと書いているのは NotebookLM を指しています
【喰わせたいScriptの特徴】
そのScriptは300行ほどあり 、書き方にその作者の癖があったようです
ユニークなアイデアではじまり、細かい配慮が丁寧に作り込まれていました
ただし scriptの記述が我流なのか癖があってAIが正しく読み込めない
という問題がありました
幸いなことは UnityやCluster上では正常機能していることでした
一から作り直すよりは ぜひAIに喰わせて 改造したり発展させたいScriptでした
【症状と経緯--------】
 【AIの回答】 とりあえずAIに「このスクリプトは正常に機能するか」と質問したら
意味不明なエラー(AIの問題点の指摘)が列挙されて
AIは「スタートした途端にエラーで停止する」と断言するではありませんか
どうにもソースの段階で欠落が生じているようです
以前の経験から「AIはいったん誤解すると頑固である。しかし 検証事実に弱い。」
という格言を思い出した 
Cluster本番上で正常機能しているという事実を突きつけると態度が急変しました
AIはソースファイルとして誤認識がありうると言い出した
(欠落の痕跡が残っていたようだ。  痕跡さえ残さないケースは後述)
(当初の私はJavaScriptをtxtとしてuploadすると そのままソースになると思っていた)
 【ボヤキ】
notebookLMにもハルシネがおきた。AIが「マークダウン記号の誤認識による欠落は
ありません」 と自信をもって断言したが、調べるとウソだった。
「欠落の痕跡が見当たらない」ぐらいは言えても
「欠落が全くない」と断言することは不可能なはずだ
資料=ソースに忠実でハルシネを起こさないのがnotebookLMのメリットなのに
ソースにjavaScriptを読み込む段階で欠落したり誤認識されてはいたようだ。
これでは notebookLMを使う意味がない・・困ったことだ。
後でわかってきたことだが、出力時にトークン数制限をこえると欠落がおきるようだ
 
【原因1】 ・・・AIに文字化けのパターンを聞いてみました
 資料=ソースを読み込む時にMarkdown(マークダウン)との錯覚が起きるらしい
 JavaScriptの「掛け算」で使われる[ * ]も、Markdownでは斜体タグの開始・終了
とみなされ欠落が起きる 
元script: estimatedNeckHeight=0.8*head.y+0.2*spine.y
誤認識例: estimatedNeckHeight=0.8*spine.y;
対策は [*]を 前後に半角をいれる  [ * ] に置き換えること。
 他にも記号[ <  ]がMarkdownタグと誤認され、
その後の命令が丸ごと消滅することがある
記号[ <  ]から次の区切り(多くの場合、次の閉じ括弧 } や不自然な位置まで)
が丸ごと消失します
【原因2】 つまり原文に問題がありました。作者さんはjavascriptの記述に癖があり
半角スペースを省略して記号をツメツメに書いていました。
文末の [ ; ]が抜けているところもありました。
これをunityは解釈できたが AIは Markdown(マークダウン)形式として
誤認識してしまうようです。
これをマナーに従った表現に整形していくと、見る見るうちに
 意味不明なエラー(AIの問題点の指摘)は減っていきました。
【対策1】
次の記号類の前後に半角スペースを入れる。  _ * = - / < >
ただし単純に一括置換で整形すると危険ですね。
次の演算子は半角で分断してはいけません。
 ==, ===, >=, <=, !=, !== &&, || +=, -=, *=, /= =>
 
【使った AIに対する質問やprompt】
【 prompt1】:「正常に機能するか」という問いでは
意味不明なエラー(AIの問題点の指摘)が列挙された
AIは修正を提案し始めますが、 以前の体験により誘いには乗らないことにします
AIに丸投げして強引に修復して進むことはできます。
一見はかどっていきますが新たな問題を起こして堂々巡りをして
 かえって 手間取るということがありました。
なので ソースファイルとしての誤認識をできるだけ解消したいと思いますので
 AIに対する質問を変えることにしました
【 prompt2】:「Markdown(マークダウン)との錯覚によるソースの誤認識が
ないか確認してください。 演算子や記号の欠落の痕跡がないか確認して下さい」
この質問で 誤認識箇所を提示させ すこしづつ原文を修復しては確認していきました
( 痕跡が残るレベルなら この質問で原因を絞り込めます)
しかし 情報が欠落しているのに 欠落を知ることはできません
AIを信用してはいけません。痕跡を残さずに欠落することがあります(後述する )
 【prompt3】「欠落が生じたかどうか点検するので
ソースの XXXXX.txt の全文を加工せずそのまま表示してください
適切に改行して表示してください」 (ソースから改行コードがなぜかなくなる)
これは次の対策2に使った指示promptです
【対策2---ソースの確認の仕方】
ソースにuploadしたときに要約が作られているので気づいたのですが
AI独自の圧縮データに変換されているようです
その時に元のファイルデータは棄てられているようです
再解釈は不可能らしい  (この件はAIに尋ねて確認をとった)
なので ソースに欠落があるかどうかは
ソースの全文を表示させて vscode等で
人間側の手元にあるコードと比較点検するのが確実だと思います。
ただし、ソース入力に文字数制限はほぼないが、出力には文字数制限があり
約160行を超えると欠落が生じるようです。分割するなどの工夫が必要です
これも後でわかってきたので今回は詳細を省きます
【対策3】
マークダウン形式ではなく javascriptであるとAIに伝える方法はないのでしょうか
ちなみに  以下の3行を文頭に付け足しても効果はありませんでした
 // [FILE_TYPE: PURE_JAVASCRIPT_SOURCE_CODE]
 // [PLATFORM: UNITY_CLUSTER_SCRIPT]
 // このファイルはドキュメントではなく、純粋なプログラムコードです。
   自動整形しないでください。
ソースコード.js の拡張子を ソースコード.js.txt にリネームする。
>>やってみたが 欠落がおきた。 効果がなかった
【途中結果1】 地道な努力で整形されたScriptになりました。
しかし、一発でそうなったわけではありません  後述します
「表示・記号の認識レベルでは非常に良好ですが、
  XXXXの変数代入が欠落しているため、
  今のままではXXXXに入った瞬間にエラーで止まります。」
>>しつこく AIは隠れている問題点を指摘し続ける
  じつはまだ欠落があったらしい
>>やむなく そこを修正した
やっと ソースが認識されたと思いました。
「Markdown の錯覚による記号の消失もなく、
 論理的にも完成された「正しく機能する」コードであると確認できました。」
「記号の欠落ではありませんが、運用上の制約として以下の点に注意してください。」
>>例によって お節介なアドバイスは続く。じつはまだ欠落があった。
全文出力してCluster上で実行するとどうも挙動がおかしい
ソース入力時にはマークダウン誤認識で欠落がおき
出力時には160行の壁で欠落が起きていた・・というのが今現在の解釈です
【途中結果2】
if elseの入れ子の深い所が60行ほど欠落しているのを発見した
if elseの入れ子が深いと 「AIの許容力の限界で 読み取れない」
と聞いたことがあります。そろそろ諦めようとしていた所、
ところが   NotebookLMは 
「ごっそり60行ほど削除されたとすれば
「AIの読解力のせいではなく マークダウン誤認識による切り捨てだ」
という可能性を言い出します。
「構文の入れ子の深い所にマークダウン誤認識要素がある場合
 ノイズとしてごっそり削除することがある」
そこで ごっそり削除された60行を 点検してみることにする
60行ほどを抜粋して 一つのファイルにして
AIに読み込ませて 点検したら Markdown の誤認識があるという
そこで その60行ほどを 慎重に地道に 記号類を整形していった
それを 元のscriptに戻した全文をAIに読み込ませた
 これで誤認識なく読込みに成功したと思う。やれやれ。
 
【考察】 NotebookLMが拡張子.jsのまま「ソースに追加」
ができないのがそもそもの原因3な気がします
どんなに JavaScriptをマナーよく清書しても txtとしてuploadするなら
markdownや 他の何かの書式に 誤認識される怖れがあります
セキュリティ上の問題で拡張子.jsファイルをuploadできないというので
改善が期待できない
何かもっとよい方法があるべきだと思います。とりあえず体験の報告でした
 
【考察その2】
 javaScriptが欠落なくSourceとして読み込まれたと判断して改造に進んだ。
かろうじて改造に成功した。 しかし、表示の一部が欠落している
さらに修復・改造しようとしたところ 中落ちが発生しました。
まだ、 安定してないようです 
どうも 160行の壁 というのがあるらしい。
160行を超えたscriptだったことがもう一つの原因4として考えられます
内容を短縮するために意図的な省略、欠落が起きると推理してみました
完全に誤認識は解消したはずが Script改造時に 160行に収めようする力が働いて 
どこかを省略しようとする。(飽くまで推理です)
そして、マークダウン形式との誤認識が起きた・・とか理由をつけて、
AIは弁解しているように思う。
 
【対策4】  「160行の壁」を突破するためにファイルを分割する方法があるようです
出力のトラブルについては別の機会に書くとことにして今回はここまでとします
ここまで読まれた方に、明快な答えがなくて申し訳ないが
同様なトラブルに見舞われた方の参考になればと 報告を残します 悪しからず
・・・・以上 2026.6
飽くまでも体験的記事なので 検証不足もありえますので ご容赦ください
#cluster

 

「Unity6で揺れものができますか」

----「Unity6で揺れものができますか」----
はじめに
できるという情報をいただき VRM0.x を使って実現できました
Unity6+VRM1.0で調べていた私は 無駄に遠回りしていたようですトホホ
ClusterのCCKワールドでのお話で、アバターではなく ヘビとかグニョグニョ
するアイテムのお話しです。

【1】.検証しました 2つのversionで試しました

実験1
環境は  VRM=130  で成功
CCK=3.3.0  かおも=V3.06   cluster=v3.85(2026/6/1)
UniVRM-0.130.1_c721.unitypackage をimportしました
VRM-0.130.1_c721.unitypackage をimportしました
>>問題なく VRM0.xのヘビが揺れた unity上でも cluster本番上でも揺れた
   VRM1.0の蜘蛛がunity上で揺れたが cluster本番上で揺れず
実験2
環境は  VRM=127  で成功
CCK=3.3.0  かおも=V3.06   cluster=v3.85(2026/6/1)
VRM-0.127.0_d320.unitypackage  をimportしました
UniVRM-0.127.0_d320.unitypackage をimportしました
>>問題なく VRM0.xのヘビが揺れた unity上でも cluster本番上でも揺れた
   VRM1.0の蜘蛛がunity上で揺れたが cluster本番上で揺れず
考察 「VRM0.x を使えば Unity6で 揺れものを実現できる」
「VRM0.x とVRM1.0を併用しても問題ない」
・・・ということが言えそうです
【2】----「VRMとUniVRMのどっちを使えばよいの?」----
両方使えばよいという結論に至る前の、疑問や不満から書きます。
当初は vrm1.0かvrm0.x どっちか片方を使うものと思っていました
旧いvrmは 打ち止めでいいのじゃないかと思っていました
downloadサイトでは 同じversionの vrm1.0 と vrm0.x を置いているのが
まぎらわしいとおもっていました
ファイル名も どっちがどれかまぎらわしくて不便を感じていました
例
 UniVRM-0.130.1_c721.unitypackage
 VRM-0.130.1_c721.unitypackage
どうして わかりやすいネーミングにしてくれなかったのでしょう
ネーミングとして 私ならこうします
 UniVRM-0.130.1.unitypackage  これなら VRM0.x とわかる
 UniVRM-1.130.1.unitypackage   これなら VRM1.x とわかる
「迷ったらどっちもいれちゃえ」というアドバイスのもとに
乱暴にも両方importしてみました
vrm1.0 が入っているprojectに 適当なversionの vrm0.x を入れると
エラーが多数でて、驚き、焦ります。
これでは vrm1.0とvrm0.x の併用はできないのかと 早とちりするところです
ところが同じversionの  vrm0.x をimportするとエラーがピタッとでなくなります
これはどうも、何か勘違いしていたようです。
一つのprojectに  vrm1.0とvrm0.x の両方をimportして使えるようです。
話しが前後しますが 私のUnityでは必ず両方インストールすることになりました 
私のCCKworld用のunityProjectとしては
 VRM0.x はspringboneのために必要で
 VRM1.0 はかおもエミュレータのために必要です
    (Scriptの点検に便利です)
そうなると、ファイル名の区別はどうでも良くなってきました
downloadサイトで 同じversionの vrm1.0 と vrm0.x を
置いているのが便利にみえてきました
vrm1.0とvrm0.x の両方をprojectに入れて使うのがもともと
想定されているかもしれない
併用が必須の環境が他にもあって、それを想定しているのじゃないかと推理します
 
【3】.----「Unity6とVRM1.0で揺れものができますか」----
私の試した範囲ではだめでした。
Unity上では揺れますが Cluster本番上では揺れません
 
下調べもせずに、いじっているうちに
VRM1.0で揺れものをするには 人型部分がどうしても必要らしい
ということがわかってきました
そこで dummyの人型部分を含む skinを Blenderで作って
後で 人型部分を非表示にして隠してしまうトリックを考えました
確認のため
VRM1.0の アバターを CCKワールドに NPCとして置いてみました
Unity上では揺れますが Cluster本番上では揺れません
これは残念 行き詰まりました
ワールド内でNPCアバターが踊っているのを見かけます
髪の毛やスカートが揺れているものがあります
VRM0.x 時代のものかもしれません  
plotやbakeAnimationしたものかもしれません
(VRM1.0のNPCにアニメーションを流し込んだらどうでしょう
 そこまでは検証していません)
 
【4】.----「今後も CCKワールドで揺れものは可能でしょうか」
ここでAIの意見と反応を書いておきます
geminiは当初、次のように断言していました
回答: 「VRM 0.xの vrm_Secondary(旧バージョンのSpringBone)は
「一切使えません」」
揺らすことができたという事実を伝えるとgeminiは謝罪してきました
回答: 「事実と異なる回答をしてしまったことを深くお詫び申し上げます。」
そして手のひらを返したように 否定から肯定的意見にニュアンスを変えてきました 
「Cluster公式の『Unity アップデート説明会』フォローアップでも、
「VRM0.xを作成される場合は(Unity 6移行後も)以前と同様に
UniVRMの使用を推奨する」という旨が明記されていました。
つまり、Unity 6環境であっても、プロジェクト内に旧UniVRMの
コンポーネントが生きていれば、
Unityの物理演算エンジン(Update処理)によって vrm_Secondary などの古いSpringBone計算がそのまま駆動します。」
 
しかし、 NotebookLMは 慎重でした(喰わせた資料によります)
回答:「ワールド内の「アイテム」や「展示物」として配置された場合、
髪や服が自動で揺れることはありません。」
・・・と最初から否定的で  実験により実行できたことを伝えても
回答:「揺れもの」を実現されたとのこと、素晴らしいですね。
 ・・・と褒めるだけです
質問:「なぜ最初に尋ねたときに VRM0.x の利用を提案できなかったのですか」
 さらに問い詰めても NotebookLMの回答は慎重で 
謝罪もなく、注意事項を回答してきました
回答:1. VRM 0.xは「非推奨」の旧規格であるため
開発の主眼は新規格である1.0にあり、
0.xは過去の資産との互換性のために残されている状態です。
回答:2. Clusterアプリ上での「動作保証」がないため
「VrmSpringBone等のコンポーネントはワールド上で動作しない可能性があります」
**と明記されています
(ここからさらに根拠を探しましたが見つけられませんでした)
 
AIの回答がぶれるのはネット上に正確な情報が不足しているからだと思われます
結局 今後も使えるかどうかはグレーゾーンのようです
VRM0.x のアバターが使えるうちは 
旧のspringboneが使える可能性がありそうですが
必ず使えるという確約や根拠がみつけられませんでした。
自己責任ということでしょうか
 
 
・・・・以上 2026.6
飽くまでも体験的記事なので 検証不足もありえますので ご容赦ください
#cluster #VRM1 

 

 

ClusterでHPゲージ表示

 
ClusterでHPゲージ表示
--2022年タイプと2024年タイプの混乱と整理--

発端 playerScriptから PlayerLocalUIに表示するルートが
見当たらなかったので調べてみました
    具体的には $.setStateCompat  では owner 、this しかなく
PlayerLocalUI側の Global,Item,LocalPlayer のどれにもつながらず 行き詰まりました。
そこで、HPゲージの新旧2つの資料を見直して 整理してみました
ここで言う旧式と新式とは 
旧式とは・・・2022年タイプ・・・ItemScriptタイプ です
新式とは・・・2024年タイプ・・・PlayerScriptタイプ です
旧式は $.setStateCompat  が要点で
これで Cluster独自のKey(変数)にして コンポーネントに伝えています
欠点は 整数の区別とか owner,thisとか ややこしいことでした
新式は .getUnityComponent  でコンポーネントのhandleを入手して
.unityProp で書き込んでいます
長所は owner 、this などを経由せず
playerScriptから PlayerLocalUIに表示できました
 
script全文と 補足文と コンポーネントの図を提示します
この記事では、表示部分のみを比較するため HPの変化はサイン関数で算出しています
なので、敵や獲物をヒットする部分は省略しています
HPゲージによる表示と 数字による表示の2通りを実装しています
なお、主に自分用のメモなので 勘違い等ありましたら悪しからず。
 
HPゲージの参考資料  
2020.12.17 simatten(しまってん) HPとHPバーを実装する
2024年12月26日 HPゲージをつくる【サンプルunitypackage付き】
 
おまけ 旧式のHPゲージでは fillAmount
を操作していたので 円グラフも可能でした
新式のHPゲージでは scaleのX値を操作していたので
棒グラフしかできないのかと思われましたが
scriptで fillAmountを制御できることを確認したので
円グラフも可能と思われます
 
環境 Unity6 CCK3.2.0 
検索ワード #Cluster HPgauge HPgage HPスコア HPscore
点検時に かおもさんのエミュレーター CSEmulator V3 を利用しました。感謝です。
sampleデータは添付していません
以下はコンポーネント図とscriptです

----旧式----

 

--script1----

//item_sin008 item_gauge008 旧式・・2022年タイプ・・・ItemScriptタイプ
//実行時起点:10秒周期HP振動 & HP数値のテキスト表示
 
// --- 1. 定数設定 ---
const hpOscillationPeriod = 8.0; // HPが振動する時間 (8秒)
const hpBlockDuration = 10.0;    // 全体のサイクル (10秒)
const updateInterval = 0.1;      // 通信頻度の制限 (0.1秒間隔) [1]
 
$.onUpdate((deltaTime) => {
    // --- 2. 実行時からの経過時間を累積計算 ---
    // $.state を使用して、フレームを跨いで経過時間を累積します [2, 3]
    let elapsed = ($.state.elapsedTime || 0) + deltaTime;
    $.state.elapsedTime = elapsed;
 
    // --- 3. 流量制御 (0.1秒ごとに処理・送信を評価) ---
    // Clusterの流量制御(Flow Control)による遅延を防ぐための定石です [1]
    if (elapsed - ($.state.lastEvalTime || 0) >= updateInterval) {
        $.state.lastEvalTime = elapsed;
 
        // --- 4. HP振動ロジック (10秒周期) ---
        // 累積時間(elapsed)を周期(10秒)で割った余りを使用します
        const timeInBlock = elapsed % hpBlockDuration;
 
        let hp;
        if (timeInBlock < hpOscillationPeriod) {
            // 【サイン波振動フェーズ:8秒間】
            const phase = (timeInBlock / hpOscillationPeriod) * 2 * Math.PI;
            hp = 50 + 50 * Math.sin(phase);
        } else {
            // 【停止フェーズ:残り2秒間】
            hp = 50;
        }
 
        // --- 5. UIへの反映 (Stateの更新) ---
        // HPの数値を整数に変換して countdown キーとして利用します
        const displayCount = Math.floor(hp);
 
        // setStateCompat を通じてUI(ゲージやテキスト)へ値を送ります [4, 5]
        $.setStateCompat("this", "HP", hp);
        $.setStateCompat("this", "countdown", displayCount);
    }
});
//ここまでがscript1
-----------------
//item_sin008 旧式・・2022年タイプ・・・ItemScriptタイプ
このスクリプトをUnity上で動作させ、実際にUIへ反映させるためには以下の設定が必要です。
1. Scriptable Item コンポーネント
このスクリプトをアタッチするオブジェクト(Item)には、
必ず「Scriptable Item」コンポーネントを追加してください
2. UI反映用のギミック設定
HPゲージの伸縮: 反映先のゲージオブジェクトに 「Set Fill Amount Gimmick」 を追加し、
Key を HP、Target を Item(このスクリプトが動いているアイテム)に設定します
数値の表示: 反映先のテキストオブジェクトに 「Set Text Gimmick」 を追加し、
Key を countdown、Target を Item に設定します
5. 流量制御(Flow Control)への対応
updateInterval(0.1秒)を用いてメッセージ送信の頻度を制限しています。
これは、setStateCompat などのメッセージ系コマンドに「秒間10回以内」という制約があるため、
反映の遅延やエラーを避けるために重要です
-------------
要点:LocalUIがUnity標準機能のCluster独自presetだと思う そこにCluster独自コンポーネントを追加する
新式2024年の場合は それがなくて PlayerScriptの .unityProp で直接書き込むことになる
Set Fill Amount Gimmick
Set Text Gimmick
 

---新式----------------

 

--script2----

//player_gauge303                新式・2024年タイプ・・・PlayerScriptタイプ
// --- 1. HP表示用(PlayerLocalObject)の設定 ---
// Unity上の「Player Local Object Reference List」に Id: "ui" で登録されている前提です
const ui = _.playerLocalObject("ui");
const safeArea = ui ? ui.findObject("SafeArea") : null;

// HPゲージ(Transform)と数値テキスト(Text)のハンドルを取得
const hpBarTransform = safeArea ? safeArea.findObject("HPBar").getUnityComponent("Transform") : null;
const timerText = safeArea ? safeArea.findObject("TimerText").getUnityComponent("Text") : null;

// --- 2. HP振動設定 ---
const oscillationPeriod = 8.0; // HPが振動する時間 (8秒)
const blockDuration = 10.0;    // 1サイクルの合計時間 (10秒)
let elapsedTime = 0;           // スクリプト発動時からの累積時間

_.onFrame((deltaTime) => {
    // 実行時からの経過時間を累積計算
    elapsedTime += deltaTime;
    
    // 10秒周期内での経過時間を算出 (0.0 ~ 9.99...秒)
    const timeInBlock = elapsedTime % blockDuration;

    let hp;
    if (timeInBlock < oscillationPeriod) {
        // 【サイン波振動フェーズ:8秒間】
        const phase = (timeInBlock / oscillationPeriod) * 2 * Math.PI;
        hp = 50 + 50 * Math.sin(phase);
    } else {
        // 【停止フェーズ:残り2秒間】
        hp = 50;
    }

    // --- 3. UIへの反映 ---
    
    // HPゲージの伸縮 (localScaleのx値を 0.0~1.0 に変換)
    if (hpBarTransform) {
        hpBarTransform.unityProp.localScale = new Vector3(hp / 100, 1, 1);
    }

    // HP数値の表示 (整数に切り捨てて表示)
    if (timerText) {
        const displayCount = Math.floor(hp);
        timerText.unityProp.text = displayCount.toString();
    }
});

//ここまでがscript2
--------------------------

//player_gauge303 新式・2024年タイプ・・・PlayerScriptタイプ
このスクリプトを正しく動作させるためには、Unityエディタ側で以下の設定が必要です。
1. Player Local Object Reference List の設定
スクリプトがアタッチされているItemに「Player Local Object Reference List」
コンポーネントを追加してください。
リストの Id に ui と入力し、プレイヤー自身の画面にのみ表示したい
UIのルートオブジェクト(Canvasなど)を指定してください。
2. UIの階層構造と命名
登録した ui オブジェクトの子階層に以下の名前のオブジェクトを作成してください。
SafeArea: UIの配置基準となる空の親オブジェクト。
    HPBar: HPゲージ用の画像オブジェクト。Transform コンポーネントを保持していること。
    TimerText: カウントダウン表示用のオブジェクト。
HPBar: (HPゲージ用)これ自体に特別なコンポーネントは不要ですが、
スクリプトが Transform を取得して Scale を変更します。
3. 使用するテキストコンポーネントの種類
重要: TimerText オブジェクトには、Cluster専用の TextView ではなく、
Unity旧来の「Text」コンポーネント(Legacy UI または UI > Text)をアタッチしてください。
PlayerScriptにおける getUnityComponent を経由したテキスト書き換えは、
現状、旧来の Text コンポーネントを使用するのが最も安定する作法とされています
4. プロパティ操作の作法 (unityProp)
ItemScriptの SubNode では .setText() というメソッドが使えますが、
PlayerScriptの PlayerLocalObject にはそのような専用メソッドはありません
そのため、getUnityComponent("Text") で取得したハンドルの
unityProp.text プロパティに直接代入 する必要があります
 
-------------ItemScriptからPlayerScriptを呼び出すscript
$.onInteract(player => {
  $.setPlayerScript(player);
});
---------------
・・・・以上です