0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

# cluster Scriptable Item で「クリックしたら色が変わるキューブ」を作るメモ (Scriptable Itemを使ってみる)

0
Posted at

cluster Scriptable Item で「クリックしたら色が変わるキューブ」を作るメモ

(Item Material Set List + MaterialHandle)

ClusterColor.gif

Cluster では、従来のコンポーネント操作だけでなく
**スクリプト(Scriptable Item)**が使えるようになりました。

「スクリプトでどこまでできるの?」を確認するために、まずは

クリックしたら色が変わるキューブ

を作ってみたメモです。
やりたいことだけに絞って書いています。


公式ドキュメント

詳しい仕様は公式を見てください。この記事は「まず動かしたい人向けの最短ルート」です。

clusterでスクリプト(JavaScript)を使ってみよう!【ドキュメントリンク集】

  • Script 全体のリファレンス
    • Cluster Creator Kit Script Reference
  • Scriptable Item コンポーネント
  • Item Material Set List コンポーネント
  • ベータ機能:マテリアルプロパティ操作 API(setBaseColor など)

ゴールと前提

ゴール

  • シーン上の Cube をクリックすると
    • Item Material Set List に登録したマテリアルの BaseColor が変わる

前提

  • Unity 2021.3 LTS
  • Cluster Creator Kit 2.9.0 以降
  • Script は C# ではなく JavaScript
    • Scriptable Item コンポーネントに紐づいた JS の中で、$.~ という形で API を呼び出す

手順

やることはシンプルで 4 ステップです。

  1. キューブに Item / Item Material Set List を付ける
  2. 操作したい Material を作って、Item Material Set List に登録
  3. Scriptable Item$.material("Id").setBaseColor(...) を書く
  4. ワールドをアップロードして、cluster 側でクリックして確認

以下はその詳細です。


1. シーンにテスト用の Cube を置く

image.png

  1. GameObject ▸ 3D Object ▸ Cube で Cube を追加。
  2. Cube に以下のコンポーネントが付いていることを確認:
    • BoxCollider(自動で付いているはず)
    • MeshRenderer
  3. Add Component から Item Material Set List を追加。
    (このとき Item コンポーネントも自動で追加されます)

ポイント
色をスクリプトからいじりたい Material は、必ず
「Item + Item Material Set List の組み合わせ」で扱うことになります。


2. マテリアルを作成して Item Material Set List に登録

2-1. 色変更用マテリアルを作る

  1. ProjectAssets で右クリック → Create ▸ Material
  2. 適当な名前(例:Mat_PaintSample)を付ける
  3. Albedo を白 or グレー にしておく
    → クリックしたときに赤に変わるのが分かりやすいように
  • Cube を選択し、MeshRenderer ▸ Materials のスロットに
    作成した Mat_PaintSample をドラッグ&ドロップ。

2-2. Item Material Set List に登録

  1. Cube に追加した Item Material Set List+ を押して要素を 1 つ追加。
  2. Idpaint と入力。
  3. Material に 作成した Mat_PaintSample をアタッチ。

この Id 文字列(ここでは "paint")が、
スクリプト側からマテリアルを取得するときのキーになります。

※ここで Material が Renderer に設定されていないとアップロード時にエラーになります。

🔺エラー例
「MaterialはこのItem及び子孫要素のRendererに割り当てられている必要があります。(Id: paint)」

と言われたら、Cube か子オブジェクトの MeshRenderer
その Mat_PaintSample をちゃんと使っているか確認してください。


3. Scriptable Item で「クリックしたら色が変わる」スクリプトを書く

image.png

3-1. スクリプトアセットを作成

  1. ProjectAssets で右クリック
    Create ▸ Cluster ▸ Scriptable Item Script をクリック
  2. ColorChangeOnInteract.js などの名前を付ける。
  3. 中身を以下のように編集:
"use strict";

// 変化後の色(少し明るめの赤)
const targetColor = { r: 1.0, g: 0.2, b: 0.2, a: 1.0 };

// プレイヤーがこのアイテムをインタラクトしたときに呼ばれる
$.onInteract(player => {
  // Item Material Set List で Id = "paint" に登録したマテリアルを取得
  const mh = $.material("paint");

  // Base Color を上書き
  mh.setBaseColor(targetColor.r, targetColor.g, targetColor.b, targetColor.a);

  // 動作確認用ログ
  $.log("Cube interacted by: " + player.name);
});
  • $.material("paint") :
    Item Material Set List に登録した Id "paint"MaterialHandle を取得
  • mh.setBaseColor(...) :
    そのマテリアルの BaseColor をスクリプトから変更

3-2. Scriptable Item コンポーネントに割り当て

image.png

  1. Cube を選択。
  2. Add Component から Scriptable Item を追加。
  3. Source Code Asset に、さきほどの ColorChangeOnInteract.js を指定。

これで準備完了です。
Unity 上では何も起きないので、次の手順で cluster 側で確認します。


4. アップロードして cluster でテスト

image.png

重要: ClusterScript は Unity の再生では動きません。
必ずスペースにアップロードして cluster アプリ内で試します。

  1. Unity メニューの Cluster ▸ ワールドをアップロード から、
    「テスト用にアップロードする」にチェックを入れてアップロード。
  2. cluster デスクトップアプリで、そのスペースに入室。
  3. シーン内の Cube にカーソルを合わせて クリック(Interact)
  4. Cube のマテリアルが 白 → 赤 に変われば成功。
    右上のログにも "Cube interacted by: プレイヤー名" が出ているはずです。

下の 2 枚は Before / After のイメージ:


5. おまけ:クリックするたびに「白 ↔ 赤」をトグルする

変化が分かりやすいように、クリックごとに色を切り替える版も置いておきます。

"use strict";

const white = { r: 1.0, g: 1.0, b: 1.0, a: 1.0 };
const red   = { r: 1.0, g: 0.2, b: 0.2, a: 1.0 };

// このアイテム固有の状態を保存
$.state.isRed = false;

$.onInteract(() => {
  const mh = $.material("paint");

  const c = $.state.isRed ? white : red;
  mh.setBaseColor(c.r, c.g, c.b, c.a);

  $.state.isRed = !$.state.isRed;
});
  • $.state は「そのアイテム専用の保存領域」みたいなものです。
  • $.state.isRed に bool を持たせておいて、
    onInteract のたびに白 / 赤を反転させています。

6. ハマりポイントメモ

やってみて詰まりやすかったところだけピックアップします。

6-1. Material が Renderer で使われていないとアップロードエラー

  • Item Material Set List に登録した Material は
    その Item または子孫の Renderer で必ず使われている必要あり
  • 使っていない場合、アップロード時に
    「MaterialはこのItem及び子孫要素のRendererに割り当てられている必要があります。(Id: xxx)」
    というダイアログが出ます。

6-2. Unity の再生ではスクリプトは動かない

  • ClusterScript($.onInteract など)は cluster アプリ側でのみ実行されます。
  • Unity 上で再生してクリックしても一切反応しないので、挙動確認は必ずスペースで。

6-3. Interact Item Trigger と競合しないようにする

  • 同じ Item に Interact Item Trigger を付けると、
    そちらのギミックが優先されてスクリプトの $.onInteract が動かないことがあります。
  • 「全部スクリプトでやる」場合は、Interact 系コンポーネントは外しておくとシンプルです。

まとめ

  • Scriptable Item + Item Material Set List を使うと、
    「クリックしたら色が変わるキューブ」 は数行の JS で実装できます。
  • ここまでできれば、
    • 銃の弾が当たったらブロックの色を変える
    • ダメージ量に応じて色や Emission を変える
    • 時間経過で点滅させる
      など、色を絡めたギミックにそのまま発展できます。

次は、この onInteract弾の On Collide からの send で呼ぶようにして、
「撃ったオブジェクトの色が変わるワールド」を作っていく予定です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?