今回は「うにty生活」の世界にクリエイティブ要素を追加したいと思います
環境
Unity2019.4.10f1
HDRP7.4.1
構想
今回は単純にクリックした場所にオブジェクトの生成を行なっていく機能と配置プレビュー機能など実装していこうと考えています。
今回作成する機能は以下の4つです。
・クリックした先を衝突検知してオブジェクトが生成されること
・Colliderに沿って生成されること
・配置プレビュー
・オブジェクト生成をスライスシェーダー で行う
クリック先にオブジェクト生成
とりあえずCubeオブジェクトを、カメラから発するRayがぶつかるところに生成できるか検証
床にめり込んではいますが、クリックした場所にオブジェクトを生成することができました。
以下のコードを使って実現可能です。
これは以前ピン差し記事を書いたときに汎用的に作成したものを変数名変えてそのまま使いました。
ピン/シグナル/マーカー設置システムを作ってみた #34 - うにty生活
上記コードのcloneにただのCubeオブジェクトのPrefabをアタッチして利用します。
他のColliderに沿って生成
このままでは床にCubeがめり込んでいます。
これをちゃんと床の上に生成されるように機能を改善していきます。
まずは以下のコードでCubeがめり込んでしまうことを回避します。
25行目のif内を以下のように変更します
Vector3 movement = Vector3.Scale(previewClone.transform.localScale, hit.normal) / 2;
target = Instantiate(clone, hit.point, Quaternion.identity)
target.transform.position = new Vector3(hit.point.x + movement.x, hit.point.y + movement.y, hit.point.z + movement.z);
上記コードを簡単に説明すると、
ヒットしたオブジェクトの法線ベクトルを取得。
法線ベクトルが1か−1の方向に、Cubeのスケールの半分をプラス。
そうすることで生成される原点をヒット先から半分ずらしています。
また、上記のコードではRayがヒットした先のオブジェクトに関してのみめり込まないようにするものなので、床と既に存在しているオブジェクトの境界あたりをタップするとめり込みます。
それを回避するために、生成するオブジェクトには新たにRigidbodyコンポーネントをアタッチしています(結局)。
Rigidbodyを使わずにできる方法はこれから模索してみます。
配置プレビュー
今のところ、どこにCubeが置かれるか全然わからないので、配置プレビュー機能を作成します。
まずはマテリアルを作成します。
先ほどまでのコードを以下になるように修正した後previewMaterialに、作成したマテリアルをアタッチします。
オブジェクトが徐々に出てくるようにする
オブジェクトが生成されるときに下から徐々に表示されていくように変更します。
作成したシェーダー グラフはこんな感じです。
シェーダー は以下の動画を参考にしてます。
Faderのスライダーを動かすことで下から表示されます。
このスライダーをオブジェクト生成時に自動的に動かしたいので、生成するオブジェクトにFaderを−1から1にするアニメーションを追加します。
ループはしないので、作成したAnimationのLoop Timeのチェックは外しておきましょう。
これで完成です。
ブログ始めた当初からこのクリエイティブ機能は作成したかったので、嬉しいです!
これから他のオブジェクトも置けるように機能拡張していくつもりです!
それではまた