Unityを使った3Dゲームの作り方(かめくめ)ゲーム開発エンジンUnityを使った3Dゲームの制作に参考になる情報を公開しています。2022.08.05今回はUnityで操作キャラクターを写すカメラの前に他のキャラクターや障害物等が入った時に半透明にして操作キャラクターを見えるような機能を作っていきます。通常であればカメラの前に他のキャラクター等がいると以下のように操作キャラクターが見えなくなってしまいます。今回の機能を取り付けると以下のようにカメラ前の他のキャラクター等が半透明になって操作キャラクターが見えるようになります。今回の機能ではUnityのShaderGraphを使用しますので、プロジェクトはURPやHDRP等のスクリタブルレンダーパイプラインである必要があります。今回使用しているUnityのバージョンは2021.3.7f1でShaderGraphのバージョンは12.1.7を使用しています。ShaderGraphに関しては以下の記事も参照してください。UnityのシェーダーグラフについてUnityのシェーダーグラフの使い方と個々のノードについて見ていきます。gametukurikata.com2018.11.09スポンサーリンク他のキャラクター用のシェーダーグラフの作成まず最初に他のキャラクター用のシェーダーグラフを作成していきます。今回操作キャラクター、他のキャラクター共にスタンダードアセットのEthanを使用しますが、他のキャラクターでも大丈夫です。Graphを選択し、名前をOtherCharacterとします。Graphを選択していますが、HDRPの場合は適宜変更してください。OtherCharacterをダブルクリックしてシェーダーグラフのウインドウを開きます。2Dを選択し、名前をMainTexture、Floatを選択し、名前をAlphaとします。以下のようにプロパティが出来ました。2Dノードを選択します。Colorに接続します。Assetボタンを押して保存します。他のキャラクター用のマテリアルを作成し、先ほど作ったシェーダーグラフを設定し、キャラクターに設定してみます。Assetsフォルダ内で右クリックからCreate→Materialを選択し、名前をOtherCharacterとします。Graphs→OtherCharacterを選択します(もしくはOtherCharacterシェーダーグラフをOtherCharacterマテリアルにドラッグ&ドロップ)。TextureにEthanOcclusionを設定します(キャラクターのテクスチャ)。ヒエラルキーにEthanを配置し、名前をOtherCharacterとし、子のEthanBodyとEthanGlassesのSkinnedMeshRendererコンポーネントのMaterialsのElement0にOtherCharacterマテリアルを設定します。これでキャラクターが通常どおり表示されていればOKです。実際にはFragmentのNormalにEthanNormalマップを接続していないので通常とは異なっています。ノーマルマップも設定したい場合は以下のようにノードを接続します。SampleTexture2DのTypeをNormalにし、TextureにはEthanNormalを設定し、FragmentのNormalに接続します。今回は指定するTextureをプロパティにしていませんが、プロパティにしておくとインスペクタで設定出来ます。これでとりあえずOtherCharacterシェーダーを設定したOtherCharacterマテリアルをキャラクターに設定し表示出来る事を確認出来ました。キャラクターを半透明にする仕組みをシェーダーグラフに追加キャラクターを通常通り表示出来たので、次は半透明にする仕組みを追加していきます。Clippingにチェックを入れます。Thresholdが追加されます。Thresholdは指定したアルファ値のしきい値より下の場合は表示しない設定になります。BlackboardのAlphaプロパティを何もない所にドラッグ&ドロップし、Alphaに接続します。Alphaプロパティの値を直接Alphaに反映できるようにしました。Thresholdの確認をしてみます。InputsのAlphaを0.49にしてみます。Thresholdの0.5より値が低くなります。クリップされてキャラクターが表示されなくなります。Thresholdの値を変更します。OtherCharacterシェーダーグラフの何もない所でSpaceキーを押して出てきたウインドウの検索窓にDitherと入力し選択します(DitherでなくNoise系でも出来る)。Thresholdに接続します。以前は0.5の値をしきい値としていましたが、Ditherを使う事で所々白~黒の範囲になり、しきい値が変わります。切り取られた部分があちこちにあるので実際のキャラクターでも所々切り取られ半透明になったかのように見えます(実際には透明ではなく間が切り取られていてそう見える)。InputsのAlphaを0.3にして確認してみると以下のように半透明のように見えます。操作キャラクターの配置OtherCharacterが出来たので次は自分で操作するキャラクターを配置します。Cameraを使って視点の変更が出来るようにしておきます。キャラクターの移動に関しては以下の記事を参照してください。Unityでキャラクターを移動する為の準備と概要(スクリプトを書く前に)Unityでキャラクターを移動させるスクリプトを書く前に準備しておく事と、移動させる為に必要な事を考えていきます。gametukurikata.com2016.01.19Unityでキャラクターの移動をプログラミングしてみるUnityで3Dキャラクターモデルを配置し、キャラクターをCharacterControllerの機能を使って移動させるようなプログラミングをしてみます。gametukurikata.com2016.01.20Cinemachineに関しては以下の記事を参照してください。UnityのCineMachineを使ってカメラの動きを作成してみるUnityのCineMachineを使うと通常のゲームシーンのカメラとしてだけでなく、イベントシーンのカメラワークの作成も簡単に作成出来ます。そんなCineMachineを使っていくつかのカメラワークを作成してみます。gametukurikata.com2018.02.23UnityのCinemachineの仮想カメラが優秀過ぎるUnityのCinemachineの仮想カメラを使うとキャラクターを追従させるのも簡単に出来ます。gametukurikata.com2018.02.25とりあえずキャラクターの移動が出来て、カメラの動きがあれば問題ないです。ヒエラルキーの操作キャラクターを選択し、インスペクタでTagをPlayerに設定しておきます。他のキャラクターがカメラに近づいた時にAlpha値を操作する操作キャラクターが出来たので次にカメラがOtherCharacterキャラクターに近づいた時にOtherCharacterシェーダーグラフのAlphaプロパティの値を操作して半透明にするという処理を作っていきます。シェーダーグラフ内でカメラとオブジェクトの距離を計算することも出来ますが、今回はC#スクリプトを使って操作することにします。EraseTheCharacterスクリプトを作成し、ヒエラルキーのOtherCharacterゲームオブジェクトにドラッグ&ドロップして設定します。1f);}}}}characterTransformは操作キャラクターのTransformです。renderersは自身の子の全てのレンダラーを入れます。materialsは自身の子の全てのマテリアルを入れます。cameraDistanceは自身がカメラとどのくらいの距離に入ったら半透明にするかです。alphaOffsetはアルファ値に関するオフセット値です。mainCameraはメインカメラです。distanceはカメラ位置と自身の距離。distanceBetweenCharacterAndCameraは操作キャラクターとカメラの距離。StartメソッドでFindWithTagを使ってPlayerタグを設定された操作キャラクターのTransformを取得しcharacterTransformに入れています。mainCameraにはCamera.mainを使ってMainCameraを設定されたカメラを取得し入れています。GetComponentsInChildrenを使って自身の子のRenderer(今回の場合はSkinnedMeshRenderer)を全て取得し、その各マテリアルをmaterialsに入れています。ここではEthanBodyとEthanGlassesに設定しているマテリアルが同じなので、ループを使って処理をせず、ひとつのマテリアルにRendererの.sharedMaterialプロパティを使って取得し変更するだけで出来ますが、sharedMaterialを使った場合はUnity実行後もマテリアルに加えた変化が反映されてしまうので今回は各materialを使ってmaterialsにそれぞれ入れています。Updateメソッドでは自身とカメラとの距離を計算しdistanceに入れ、操作キャラクターとカメラの距離をdistanceBetweenCharacterAndCameraに入れています。自身とカメラの距離が操作キャラクターとカメラの距離よりも短い時は操作キャラクターとカメラの間に自身がいるので半透明にする必要があります。自身とカメラの距離が指定したcameraDistanceよりも短いという条件も加えます。条件に合致していたら半透明にする必要があるので各マテリアルの_Alphaの値を設定します。注意が必要なのが、プロパティの操作にはAlphaプロパティの参照を使用する必要があります。設定する値はMathf.InverseLerpを使ってdistanceが0~cameraDistance+alphaOffsetの範囲のどこになるかを計算し設定しています。Mathf.InverseLerpはdistanceが0~cameraDistance+alphaOffsetのどの範囲にあるかを0~1の値で返しますが、範囲外の場合はその限界値の値を返します。自身とカメラの距離が指定した距離より長い場合は自身を半透明にする必要がないので_Alphaを1にしてクリッピングをしないようにします。常に計算するのを避ける先ほどのスクリプトだと毎フレームUpdateメソッドが呼ばれカメラ位置と自身の距離、操作キャラクターとカメラの距離を計算しています。スクリプトを取り付けたゲームオブジェクトが増えると処理が遅くなる可能性もある為、オブジェクトのレンダラーがカメラの範囲内にいる時だけ距離の計算をするように変更します。false;}}isVisibleがカメラの範囲内にレンダラーを持つオブジェクトがいるかいないかを入れます。UpdateメソッドではそのisVisibleがfalseの時(自身がカメラの範囲外にいる)はreturnでそれ以降の処理をしないようにします。カメラの範囲内かそうでないかを判断しているのはMonoBehaviourのメソッドのOnBecameVisible(カメラの範囲内にある時に実行される)とOnBecameInVisible(カメラの範囲内を出ると実行される)でしています。オブジェクトがカメラに映っていなくてもOnBecameVisibleが呼ばれることもあります。ここら辺は以下の記事も参照してみてください。Unityでカメラの範囲内にゲームオブジェクトがある時だけ何らかの処理をしたいUnityでカメラの範囲内にゲームオブジェクトがある時だけ時間の計測をする処理を作っていきます。gametukurikata.com2019.08.27改変したスクリプトはレンダラーを持つゲームオブジェクト個々に設定するようにする必要があるので(OnBecameVisibleとOnBecameInVisibleはスクリプトが取り付けられたレンダラーで呼び出される為)、今回の場合はOtherCharacterのEraseTheCharacterスクリプトを削除し、子のEthanBodyとEthanGlassesの2つにEraseScriptを取り付けて使用する必要があります。オブジェクトのレンダラーがカメラの範囲内かどうかで判断する他に、コライダを使って操作キャラクターがコライダの範囲内に入っているかどうかで計算処理をするということも出来ます。機能の確認これで機能が出来ました。今回は他のキャラクター用のマテリアルとしてOtherCharacterを作りましたが、確認の為にヒエラルキーにCubeを配置しOtherCharacterマテリアルを設定し、EraseTheCharacterスクリプト(もしくはEraseScript)を取り付けて障害物も同じように出来る事を確認します。InputsのAlphaを1に戻しておきます。終わりにオブジェクトを半透明にすると影もクリッピングされてしまいます。これに関しては以下の動画の4:05辺りにあるカスタム関数を使用してAlphaを設定すると影の変更はされません。...www.youtube.com今回の機能はPS4のニーアレプリカントにあったので作ってみました。コピーかめくめちゃんをフォローする7Unityを使った3Dゲームの作り方(かめくめ)Unityを使った3Dゲームの作り方(かめくめ)関連記事シェーダーUnityのシェーダースクリプトについてUnityのシェーダースクリプトの構造を勉強し、自分でスクリプトを組んでみます。シェーダーUnityのシェーダーグラフについてUnityのシェーダーグラフの使い方と個々のノードについて見ていきます。Unityで炎の剣を作成するUnityのSplinesを使ってみるホームシェーダースポンサーリンクサイト内検索が出来ますプロフィール管理人のかめくめちゃんです。(-_-)メールはこちらにお願いします(記事に関する質問は送らないでください、返信は期待しないでください(._.))。kamekumechan@gmail.comいずれはSIRENやバイオハザードみたいなアクションゲームを作りたいと思っています。ゲームシナリオが書けないので面白いゲームはなかなか作れません・・・・。(^_^;)名前の由来はカメが好きだからです。プロフィールになってないな・・・・(-.-)Unityをこれから始める人へこれからUnityを使ってみようという方はUnityを使った3Dゲームの作り方(かめくめ)の歩き方Unityを使った3Dゲームの作り方(かめくめ)で、はじめてUnityの学習をする時の当ブログの記事を読む順番を書きました。機能を積み上げていく形になるので便利かも?gametukurikata.com2019.06.21の記事に記載の順番で見て頂くとUnityの基本的な使い方がわかり、簡単なアクションゲームや、TPSゲームの作成までが出来ます。自作タイピングゲームタイピングゲームを作りました。WebGL形式なのでPCのブラウザで遊べます。以下からプレイ出来ます。FinalTypingUnityを使って作成したローマ字入力のタイピングゲームです。gametukurikata.com2022.01.02お知らせ2023/01/24個人的にUnity2022.2.3f1をインストールしました。2022/10/14UnityのIKを使って足の位置と角度を地面に合わせる機能Unityのゲームでキャラクターの両足が別の高さの地面の上にある時にそれぞれの足をそれぞれの地面につけるようにする機能を作成しますgametukurikata.com2016.04.11機能を少し修正しました。2020/09/19コメント欄は閉鎖しました。今までコメントを投稿してくださった方はありがとうございました。(^^)/2018/08/07わたくしに出来る事は既に記事にしてあるので、ブログ右上の検索窓を活用してください。(._.)またブログの最初の方の機能を積み上げていく記事に関しての疑問点は当ブログ記事のスクリプトの説明と寄せられた質問への回答Unityを使った3Dゲームの作り方(かめくめ)の機能積み上げ形式の記事のスクリプトの説明と寄せられた記事の機能についての質問への回答を掲載しています。gametukurikata.com2019.08.01Unityを使い始めたばかりの人がつまづきやすい点を解消するUnityを使い始めたばかりの人が結構な確率で陥る不具合や疑問点を解消していきます。基本的にはブログに寄せられた質問への回答という感じです。gametukurikata.com2018.12.04も参照してみてください。小・中学生によるデジタルコンテンツ開発の全国大会ですuycc.unity3d.jp2022年大会の先行エントリーが開始されているようです。当ブログはハイスピードプランです。WordPressの編集画面の動作が早くなった。当ブログはハイスピードプランです。WordPressの編集画面の動作が早くなった。記事の内容に質問がある方へUnityを使った3Dゲームの作り方(かめくめ)の歩き方UnityのJavaScriptとC#を読み替えてどちらでも対応出来るようにするホーム検索トップサイドバータイトルとURLをコピーしました。