TOPVCI連携フォーマット > 食べ物VCIテンプレート

食べ物VCIテンプレート


ダウンロード

下記のリンクよりダウンロードしてください。
FoodTemplate.unitypackage



更新履歴

アップデートする場合はテンプレートのアップデートを参照

更新日 バージョン 内容
2022/06/09 Ver1.04.1 焼ける判定の対象マテリアルの指定が無いと、適用時にエラーになる不具合を修正
2022/04/30 Ver1.04 音声ファイルがVciObjectに組み込まれ、VCI出力時にエラーが発生した不具合を修正
2022/01/09 Ver1.03 UniVCI 0.33でUnity上でエラーが発生した不具合を修正
2021/02/20 Ver1.02
  1. ルームでも焼けるように修正
  2. 皿をUseして食材リセットする機能を追加
    FoodScript.ResetFromPlate("皿のオブジェクト名")
2020/08/22 Ver1.00b Vキャス1.9.4bにおいて、モジュールFoodScript.luaにて、食べ物オブジェクトにアニメーションが入っていない場合にエラーが発生したため修正
2020/08/03 Ver1.00a 手動でVCI Objectを組み込んだ場合、適用でmain.luaがコピーされない不具合を修正



使用属性

||FIRE|| (火属性)

 本テンプレートの食べ物アイテムを衝突させると、焼くことができます。


テンプレートのインストール

UniVCIのunitypackageをインポート後、続けてFoodTemplate.unitypackageをインポートしてください。
インポート方法は、unitypackageファイルをUnityへドラッグ&ドロップします。

するとプロジェクトのAsset内にRamenVCI/FoodVCIフォルダが作成されます。


テンプレートのアップデート

過去バージョンからアップデートする場合は、下記の手順で差し替えてください。



新規に食べ物を作ってみる

手に取ってHeadボーンに接触すると食べれるアイテムを作ります。
サンプルはAssets/RamenVCI/RamenVCI/MeatSample.sceneです。

手順 新規に食べ物VCIを作る手順
1

シーンを新規作成した場合は、Directional Lightの色を白に変更してください。

2 Hierarchyを右クリックして、
GameObject→VCI→Plain VCIを選択してVCIの基礎を作成します。
※作成されるオブジェクト名は好きな名前で大丈夫です。
3 作成されたVCI Objectに、Add ComponentでFood VCI Generatorを追加します。
これは食べ物VCIの全体設定のスクリプトになりますが、最後に調整する項目ですので今はそのままで大丈夫です。
4

皿オブジェクトを追加します。
RamenVCI/FoodVCI/Prefab/PlateをVCIObjectの中にドラッグ&ドロップして追加します。

※自前で皿のFBXモデルを用意している場合は、そちらを追加してください。

5

皿オブジェクトのPosition.Yを0.5に設定します。
※これを設定しないと地面に埋まったまま出現します。

6

皿オブジェクトのInspector画面下部のAdd ComponentでBox Colliderを追加して、皿の当たり判定を設定します。

7

皿オブジェクトのInspector画面下部のAdd ComponentでVCI Sub Itemを追加して、持ち運べる設定のGrabbableにチェックを入れてください。
また、物理エンジンのRigidbodyが同時に追加されるので、こちらのUse GravityをOFF、Is KinematicをONにしてください。

8

食べ物のオブジェクトを追加します。
RamenVCI/FoodVCI/Model/MeatSampleをVCIObjectの中にドラッグ&ドロップして追加します。

※自前で食べ物のFBXモデルを用意している場合は、そちらを追加してください。

8

食べ物のオブジェクトのInspector画面下部のAdd ComponentでBox Colliderを追加して、食べ物の当たり判定を設定します。

9

追加した食べ物オブジェクトにAdd ComponentでFood Objectを追加します。
これが食べ物ごとの設定用スクリプトになります。また、自動でVCI Sub Itemスクリプトも追加されます。

10

追加したFood Objectの「食べれる判定」にチェックを入れます。
これはHeadボーンに衝突した時に食べる(消える)設定になります。

また、成功するとHierarchyに肉のアイコンが表示されます。

11

リスポーン先の皿に「皿オブジェクト」を追加してください。
食べた後、このお皿の位置にリスポーンします。

また、成功するとHierarchyに皿付きのアイコンが表示されます。

12

「焼ける判定」にチェックを入れて「マテリアル自動判定」ボタンを押します。
すると、オブジェクトで最初に見つかったマテリアルが、食べ物のマテリアルとして自動的に指定されます。

成功すればHierarchyにフライパンのアイコンが表示され、焼けるアイテムとして認識します。

13

「専用マテリアル作成」ボタンを押します。
するとマテリアルがあるフォルダにBurnMaterialフォルダが作成され、そこにオブジェクト専用のマテリアルが自動生成され、対象マテリアルにも適用されます。
作成されるマテリアル名は、オブジェクトの名前になります。

焼くためにはアイテムごとに色を変更する必要があるため、専用のマテリアルが必要になってきます。

14

「サンプルから煙エフェクト引用」ボタンを押します。
これは火属性(||FIRE||)に衝突時に発生するエフェクトが自動で設定されます。
※自前で用意する場合は、オブジェクトに組み込んだ後、「煙エフェクトオブジェ」に適用してください。

15 VCIObjectを選択して、Food VCI Generator適用ボタンを押してください。
これでFood VCI GeneratorFood Objectの内容からLuaが自動生成されます。
またこの操作で自動生成されるオブジェクトがありますが、焼く・リスポーンするのに必要なオブジェクトなので削除しないでください。詳細は自動生成されるオブジェクトの説明を参照してください。

今回のテンプレートを用いる場合、オブジェクトやパラメータの変更があった場合には必ずこの「適用」を押した後にVCI出力をしてください。
16 同オブジェクトにあるVCI Objectの一番下のVCIエクスポートボタンを押してVCIを出力します。

串系の食べ物を作ってみる

食べた後串を残す食べ物の作り方です。
応用すれば魚を食べたら骨が残る等の表現もできます。
サンプルはAssets/RamenVCI/RamenVCI/YakitoriSample.sceneです。

手順 串系の食べ物の作り方
1

先程の食べ物の作り方の手順7の皿の作成まで同じ手順を行います。

2 串物のサンプルとして焼き鳥オブジェクトを追加します。
RamenVCI/FoodVCI/Prefab/YakitoriをVCIObjectの中にドラッグ&ドロップして追加します。
3 串の残し方はアニメーションで表現します。
アニメーションクリップのFoodNormalで食べる前の状態。FoodEatで食べた後の状態になるようにスケール変更をしてください。

上記2つのアニメーションが登録されてあれば、スクリプト側で自動的に再生してくれます。
4 焼き鳥の具・串にAdd ComponentでBox Colliderを追加します。
5 あとは焼き鳥オブジェクトにFood Objectを追加する手順9~VCI出力まで同じ手順になります。

その他カスタマイズ

音を鳴らす
Food VCI Generator焼く音食べた音に音声ファイルをドラッグ&ドロップして、適用ボタンを押します。

※VCI作成時には音声ファイルがAudio Sourceとしてオブジェクト内に組み込まれている必要がありますが、上記操作を行うと自動で組み込んでくれます。

複数の食べ物オブジェクトを追加する
オブジェクトを選択してコピー&ペースト、またはCtrl+Dで複製して皿オブジェクトの上に並べます。
この配置がリスポーン時の配置場所になるので、なるべく綺麗に並べましょう。

サンプルはAssets/RamenVCI/RamenVCI/FoodSetSample.sceneです。
複製したオブジェクトを全て選択して、Food Objectの専用マテリアル作成を押して、それぞれに専用マテリアルを割り当てます。
※上記の専用マテリアルが作成されていない場合、Food VCI Generatorの「適用」を押した際にマテリアル名が重複していると警告が出力されます。

焼き色の変化を設定する
Food VCI Generatorの焼く設定で、焼き色が変化する時間・色合いを設定できます。
【最後まで焼ける時間】
最後の色合いになるまでの時間です。
【焼き色設定】
焼く時間によって変化する色設定です。
0番目を生の色として、上から順番に色が変化していきます。各段階への変化時間は、上記の時間から等間隔に設定され、数が多いほど短い時間で変化します。

右図の例では生の状態から5段階に焼き色が設定され、0.5秒ごとに次の色に推移していきます。
2.5秒後には真っ赤になります。


焼く表現を色変更ではなく、別のテクスチャに変更する
マテリアルシェーダMToon限定の機能になります。
生の状態のテクスチャをTexture、焼いた状態のテクスチャをEmissionに適用してください。

実際のVキャス上の処理では
生の状態:Texture 白色 Emission 黒色
焼き状態:Texture 黒色 Emission 白色
という感じに、徐々にTextureが暗く、Emissionが明るくなります。

Food Objectの焼き色の表現をEmissionに変更します。
またマテリアルのEmissionにテクスチャが適用されている状態で、マテリアル自動判定をクリックすると、自動的にEmissionに変更されます。

Food Objectの設定項目

追加したFood Objectで食べ物の設定をしていきます。




食べれる判定 Headボーンに近づけた時に消えるようになります。
リスポーン先の皿 再出現する皿や箱等のオブジェクトを指定します。
※未指定の場合は、VCIの出現位置付近に再出現します。

焼ける判定
※1
火属性(||FIRE||)に衝突すると、焼くこと(マテリアル変化)ができます。
対象マテリアル
※1
焼く対象のマテリアルを指定します。
焼き色の表現 焼く表現方法を指定します。
BaseColor:色が変化します。
Emission:Emissionのテクスチャに変化します。
マテリアル自動判定 オブジェクト内にあるモデルを検索し、最初に見つかったマテリアルを対象マテリアルへ自動的に適用します。
専用マテリアル作成 焼けるアイテムごとに専用のマテリアルを用意する必要があります。
このボタンを押すと、対象マテリアルファイルがあるフォルダにBurnMaterialフォルダが作成され、そこにオブジェクト専用のマテリアルが自動生成され、対象マテリアルにも適用されます。
煙エフェクトオブジェ 煙のEffekseerが組み込まれたオブジェクトを指定します。
指定しない場合は煙が出ません。
煙エフェクト自動判定 オブジェクト内にあるEffekseerが組み込まれたオブジェクトを検索し、煙エフェクトオブジェに適用します。
サンプルから煙エフェクト引用 サンプルのエフェクトを引用します。

※1:焼く設定をする必須項目です。


Food VCI Generatorの設定項目

VCI Objectのオブジェクトを選択して、全体設定をします。




リスポーン時間 食べる、地面に落ちる等した後の、リスポーン時間を設定します。
単位は[秒]で指定します。
地面衝突時に削除 チェックすると、地面に衝突したら消えます。

最後まで焼ける時間 生の状態から、完全に焼け終わるまでの時間を指定します。
単位は[秒]で指定します。
焼き色設定 カラーを指定することで、生から焦げるまでの焼き色の推移を設定できます。

焼く音 食べ物を火属性(||FIRE||)に衝突した時に鳴る音を指定します。
食べた音 食べ物をHeadボーンに衝突させて食べた時に鳴る音を指定します。
適用 Food VCI Generator・Food Objectの内容から、自動的にLuaソースを作成します。
ソースはVCI ObjectのScriptに自動的に出力されます。
また、音声ファイルが全体のオブジェクト内に組み込まれていない場合、上記で指定した音声ファイルが自動的に組み込まれます。

自動生成されるオブジェクトの説明

Food VCI Generatorの「適用」ボタンを押した時に自動生成されるオブジェクトの説明です。
また、このオブジェクトは「適用」ボタンを押すごとに全削除・再生成されるので、食べ物を減らしたから生成したオブジェクトをいちいち削除する必要はありません。

SPAWN_POINT◯◯ 食べ物アイテムのリスポーン先を表すオブジェクトです。
皿オブジェクトをしていていた場合は皿の子オブジェクトに生成されます。
BURN_FLAG◯◯ 焼き加減を表すオブジェクトです。
PositionのY座標によって、焼いてる状態か、焼いていない状態かを表し、
ScaleのYによって、焼き加減を表します。

Luaスクリプトの概要

FoodScript.lua

食べ物VCIの処理全般になります。一部関数はmain.luaでも使用することができます。


FoodDatabase.lua

Food Object・Food VCI Generatorの内容から、パラメータやオブジェクト名、マテリアル名等必要なデータが入力されます。

FoodScript.lua 関数説明
Setup() 初期化時に必要になる処理です。
vciクラス、FoodDatabase.luaのデータを引数で渡します。
最初に自動生成されるmain.luaに組み込まれますが、既にあるmain.luaに組み込む場合はソースの頭に下記のように組み込む事で機能します。

FoodDatabase = require "FoodDatabase"
FoodScript = require "FoodScript"
FoodScript.Setup(vci, FoodDatabase)
updateAll
onUngrab
main.lua内で使用する関数内に組み込みます。
最初に自動生成されるmain.luaに組み込まれますが、既にあるmain.luaに組み込む場合は下記のように対応する各関数全てに組み込む事で機能します。

function updateAll()
    FoodScript.updateAll()
end
function onUngrab(target)
    FoodScript.onUngrab(target)
end
onTargetEnter
onTargetExit
main.lua内で使用する衝突判定に組み込みます。
onTragetEnterはアイテムと衝突時、onTargetExitはアイテムから離れた時の処理になり、onCollisionEnter、onTriggerEnterと共通処理になります。
最初に自動生成されるmain.luaに組み込まれますが、既にあるmain.luaに組み込む場合は下記のように組み込むことで機能します。

function onTriggerEnter(item, hit)
    FoodScript.onTargetEnter(item, hit)
end
function onTriggerExit(item, hit)
    FoodScript.onTargetExit(item, hit)
end

onCollision系も同じように組み込みます。
GetFoodID(target) オブジェクト名からFoodScriptが認識している食べ物IDを取得します。
登録されていないオブジェクト名の場合-1が返ってきます。
EatFood(foodID) 引数に食べ物ID、またはオブジェクト名を指定すると、食べる処理を行います。
IsEaten(foodID) 引数に食べ物ID、またはオブジェクト名を指定すると、現在食べた状態であるかboolean型で取得します。
true:食べた false:食べてない
GetBurnRate(foodID) 引数に食べ物ID、またはオブジェクト名を指定すると、対象の食べ物アイテムの焼き加減を取得します。
値は0.0(生)~1.0(焦げた)の範囲で取得されます。
※フラグの仕様上、0にできないので、0.001が最低値になります。
ResetFoodObj(foodID) 引数に食べ物ID、またはオブジェクト名を指定すると、対象の食べ物アイテムが焼ける前に戻り「リスポーン先の皿」にリスポーンします。
ResetFromPlate(plateName) 引数に皿のオブジェクト名を指定すると、該当の「リスポーン先の皿」に指定している食べ物アイテムがすべてリセットされます。