Unityを使った3Dゲームの作り方(かめくめ)ゲーム開発エンジンUnityを使った3Dゲームの制作に参考になる情報を公開しています。Scriptingを使ってゲームのロジックを作成していきたいと思います。C#スクリプトを記述せずに、グラフを使って視覚的にわかりやすくスクリプトを作ることが出来ます。Scriptingの機能はUnity2021.1以降は標準でパッケージとしてインストールされています。Managerを選択し、そこからインストールしてください。StoreでBOLTという名前で存在します。BOLTは2018.4.15以降のバージョンで使用可能です。Scriptのファイルを除外する必要があります。Scriptを違法頒布したとされます。Machineコンポーネントを取り付け、Graphにスクリプトグラフやステートグラフを設定して使用します。Machineを選択して取り付けます。Graphに設定するスクリプトグラフやステートグラフは上の各コンポーネントのNewを押して指定するフォルダに新しいグラフを作成することが出来ます。Graphを選択することでも該当するグラフを作成することが出来ます。GraphのGraph等に設定する必要があります。MachineのGraphにドラッグ&ドロップするか、Graphの○のアイコンを押して選択して設定します。MachineコンポーネントのSourceをGraphからEmbedに変更するとマシン自体にグラフが埋め込まれるようになります。グラフの再利用が出来なくなります。EmbedとGraphの違いについてはUnityマニュアルを参照してみてください。Graphを選択すると、ビジュアルスクリプトを作成するウインドウが開きます。Graphのファイルをダブルクリックするとグラフウインドウにグラフが表示されます。GraphにCubeStateというステートグラフを設定したと仮定して話を進めます。GraphウインドウにCubeScriptグラフを開きます。ヒエラルキーのCubeゲームオブジェクトを選択します。Graphウインドウでは以下のような感じで表示されます。InspectorのTitleにはグラフのタイトル、Summaryにはグラフが何をするものなのかの概要を入力します。Outputsはグラフの最後に出力する値となっています。Input系のものはInputユニット、Output系のものはOutputユニットを使用した時に表示されます。これらはひとまとまりの処理を行うスーパーユニット(ひと塊の処理を行うメソッドのようなもの)の入力と出力のポートの名前とデータで使います。変数Blackboardでは変数の設定が出来ます。変数にはいくつかの種類があります。グラフ変数グラフ変数はそのグラフだけで使用する変数で、C#スクリプトで言うとアクセス修飾子がprivateなフィールドと似ています。オブジェクト変数オブジェクト変数はグラフが設定されたオブジェクトだけで使用する変数で、C#スクリプトで言うとアクセス修飾子がpublicなフィールドと似ています。シーン変数シーン変数はそのシーン全体で使用する変数です。シーン全体で変数を使いたい時に使用します。アプリケーション変数アプリケーション変数はこのアプリケーション全体で使用する変数です。アプリケーション(ゲーム)全体で変数を使いたい時に使用します。セーブ変数セーブ変数はアプリケーションが終了した後も値が保持される変数です。Initialでは初期値、Savedでは保存されている値が表示されます。値の保存にはPlayerPrefsを使って保存しているようです。Unityでゲームデータのセーブ・ロードを行う方法Unityのゲームで進行具合やキャラクターのステータスをデータとして保存しておき、それらのデータを読みだして続きから再開するというのは必須の機能になっています。その為に今回はゲームデータのセーブとロードが出来るようにしてみたいと思います。gametukurikata.com2016.12.01変数は再生モード中に変更した値は元に戻りますが、インライン(グラフ中のみで使用している値)の値は再生モードを解除しても値は変更されたままになります。変数はドラッグ&ドロップしてグラフ上に配置出来ます。Variableユニットになります。ユニットユニットは処理の単位で、何らかの処理を実行する単位です。グラフの何もない所で右クリックする事であいまい検索(ファジー検索)画面を開いて、ユニットを選択したり、検索窓に対象を絞った検索をしてユニットを選択することが出来ます。その他ユニットのポートからドラッグして、接続できるユニットから選択することも出来ます。ポートポートはユニットに付いている接続部分で、処理の流れを作るフローポートと値を渡すデータポートがあります。Logユニットにフローが接続され、Stringに入力されている「テスト文字列」というデータがMessageに接続されています。接続元のポートをドラッグし、接続先の該当するポートにドロップするとポートが接続されます。Unityの実行ボタンを押すとコンソールに「テスト文字列」と表示されます。確認したら作成したユニットは使わないので全部削除します。グラフでの操作ユニットの作成方法と接続方法がわかったところでグラフでのショートカットや操作方法について少し見ていきます。Scriptingのグラフウインドウはグラフの何もない所でダブルクリック、もしくはShiftキーを押しながらSpaceキーを押すことでウインドウを最大化する事が出来ます。同じ動作をする事で元に戻せます。ユニットの操作ユニットはマウスの左ボタンで選択する事が出来ます。ユニットを選択した状態でマウスの左ボタンを押してドラッグするとユニットを移動出来ます。ユニットを選択した状態でCtrl+Dキーで複製、Deleteキーで削除、Ctrl+Xで切り取り、Ctrl+Vキーで貼り付け、Ctrl+Aキーで全ユニットの選択が出来ます。ユニットを選択した状態で右クリックでメニューを表示して同様の処理が出来ます。グラフの何もない所でマウスの左ボタンを押してドラッグすると四角い枠が出て、複数のユニットを選択することが出来ます。グループの作成Ctrlキーを押しながらマウスの左ボタンを押してドラッグするとグループを作成することが出来ます。グループは処理の説明をする為のコメントの役割をします。Inspectorでグループの色を変更することが出来ます。Inspectorのタイトル部分を押して変更することが出来ます。スクリプトグラフスクリプトグラフはC#スクリプトで作っていたような機能(例えばプレイヤー操作スクリプト)を作る物です。C#スクリプトの場合はStartメソッド(登場した時1回)やUpdateメソッド(毎フレーム)を使って、何らかの処理を実行していましたが、スクリプトグラフでも同じようにStartユニットやUpdateユニットを使って同じように流れを作って何らかの機能を作成するということが出来ます。上の場合はグラフの何もない所で右クリックし、検索窓でStartで検索しStartユニットを配置し、同じようにして検索窓でUpdateユニットを配置したものです。Startは最初に1回、Updateは毎フレーム呼ばれるイベントなのでそこからフローを繋げばC#スクリプトを作成した時にデフォルトで作成されているStartメソッドやUpdateメソッドと同じような処理を作ることが出来ます。状態グラフ状態グラフは特定の状態にある時にゲームオブジェクトがどのように動作するかの状態と流れを作る物です。CubeStateグラフを開きます。Stateで状態を作成出来ます。Stateで状態を作成すると以下のように表示されます。State(この状態から離脱した時)、Update(この状態の時に毎フレーム)というイベントを含んだStartという状態が作られました。InspectorのStartの部分を押して名前を変更することが出来ます。State、Updateというイベントのユニットがあり、そこからフローを繋げて処理を作ることが出来ます。必要のないイベントがあればユニットを選択し、削除します。Updateユニットが必要なければ選択してDeleteキーを押します。Start状態からCubeStateを選択し、元の状態を表示しているグラフに戻ります。Start状態は初期状態です。Startを選択し、ユニットの上部が緑色になると、その状態が初期状態になります。Start状態から他の状態に遷移し、状態によって処理を分けたい事があります。キャラクターが健康な状態とダメージを負っている状態で処理を分けたい時等です。Transitionを選択し、矢印が出たらマウスの左ボタンを押して決定します。上のように新しい状態が作成されました。状態が変更されるには条件があります。その条件が状態と状態の間にある黄色い部分の所で、ここをダブルクリックします。Transitionというユニットがありますが、これにフローを繋がるとこの遷移が行われます。状態グラフはどの状態にある時にこういう処理をしたい!という時に使いますが、状態グラフの状態の中身はスクリプトグラフなので、今の状態に合わせて処理を実行させたい時は便利です。無理に状態グラフを使わずともスクリプトグラフ内だけで自分で状態を管理して同じようなことが出来るので、無理に使う必要はないのかも?スーパーユニットの作成スーパーユニットは特定の処理を行うユニットを一まとめにしたもので、入力と出力を設定出来るので、C#スクリプトのメソッドのようなものです。Unitを選択して作ります。Unitが出てきません。Scriptingグラフ内にドラッグ&ドロップして使う事が出来るので便利です。Unitユニットをダブルクリックすると以下のようにInputとOutputというユニットがあります(ない場合は自分で追加します)。デフォルトではInputとOutputにはフローポートもデータポートもありません。Inspectorでフローポートとデータポートの設定をする必要があります。Inputsの+を押し、KeyにinputFlowと入力します。これがフローポートの名前になります。Inputsの+を押し、KeyにinputValueと入力し、TypeにIntegerを入力します。これがデータポートになります。同じようにOutputユニットにも設定します。このスーパーユニットでは受け取ったint型の数値に5を足して、それを呼び出し元に返すという処理にしたいと思います。そこでAddユニット(Scalarのやつ)を追加し、InputからOutputにフローポートを繋ぎます。Input→Add→Outputにそれぞれデータポートを繋ぎます。スーパーユニットの中身は以下のようになりました。スクリプトグラフでこのスーパーユニットを使った流れを作ってみます。Literalには3を入力します。LogのMessageに繋ぎます。Unityを実行するとコンソールに8が表示されます。CubeScriptスクリプトグラフの中身はもう使わないので削除しておきます。Unitも使わないので削除します。Scriptingで使用する型のタイプはIntやFloat等はデフォルトで定義されています。Scriptingで使用したいと思ったとします。Effectの型のタイプは設定されていないので、ユニットとして登場しません。Effectのタイプを追加する必要があります。タイプの追加の前にその定義されているアセンブリを追加する必要があるので、まずはそちらを行います。Effectの定義が含まれるUnityEngine.VFXを設定します。Libraryを押し、スクロールして下の+を押し、UnityEngine.VFXModuleを設定します。Effect等のタイプを追加します。Unitsボタンを押します。Effect関連のユニットが使えるようになります。Unitsボタンを押してくださいというエラーが出る事があるので、その時はまた押してください。自前のユニットを作成するC#スクリプトを使って自前のユニットを作成することが出来ます。詳細についてはUnityマニュアルをご覧ください。新しいユニットを作成します。{}}usingディレクティブでUnity.VisualScriptingを指定します。Unitクラスを継承して新しいクラスを作成します。UnitクラスはDefinitionメソッドをオーバーライドする必要があるのでoverrideキーワードを使ってメソッドのオーバーライドをします。Unitsボタンを押して反映します。これでスクリプトグラフ内で右クリックするとMyNodeユニットが一番下に項目として現れます。入力トリガーポートと出力トリガーポートの作成このままだとユニットとしては使えないので、入力トリガーポート、出力トリガーポートを作成します。outputTrigger;ControlInputが入力トリガーポート、ControlOutputが出力トリガーポートになります。次にDefinitionメソッド内でインスタンスの生成をします。ControlOutput("outputTrigger");}入力トリガーポートにはInputTriggerという名前を表示し、フローが出力トリガーポートに流れます。出力トリガーポートにはOutputTriggerと表示されます。次に入力データポートと出力データポートを作ります。resultValue;});}ValueInput型は入力データポート、ValueOutput型は出力データポートになります。inputTriggerのインスタンス生成時の処理の実行でflow.GetValueを使って入力データの二つを足してresultValueに値を入れるという処理をさせます。outputには計算した結果のresultValueが返されます。機能としては出来ましたが、スクリプトグラフのRelationsを押した時に既存のユニットの場合は関係性の表示がされます。押した場合は以下のような関係性を表す表示がされます。MyNodeユニットでも同じように関係性を表示するようにします。output);}Requirementで入力トリガーポートで必要なデータを設定します。Successionで入力トリガーポートから出力トリガーポートまでのパスを設定します。Assignmentで入力トリガーがされた時にデータ出力までのパスを表示します。これでMyNodeユニットが出来たので、簡単なサンプルを作成します。ゲームオブジェクトが登場したら1回だけMyNodeユニットを実行します。MyNodeユニットでは入力データポートが二つあり、1と5を入力データとします。Logユニットを使ってコンソールに表示します。Unityを実行するとコンソールに6が表示されます。CubeScriptスクリプトグラフ内のユニットはもう使わないので全削除します。作成済みのC#スクリプトのメソッドを実行することも出来ます。以下のように静的なクラスと静的なメソッドを定義します。intValue2;}}このMyScriptクラスのMyAddMethodは二つのint型の入力を受け取り、足した数値を返すメソッドです。Unitsボタンを押します。終わったらスクリプトグラフ内の何もない所で右クリックし、検索窓にMyScriptを入力し、MyAddMethodメソッドを選択します。ユニットが表示されるので以下のようにCubeScriptスクリプトに作成するとコンソールに20が表示されます。ここまでは静的クラスの静的メソッドをユニットとして使っているのでインスタンス化せずに実行出来ました。MonoBehavioourクラスを継承したクラスをゲームオブジェクトに取り付けてそれを実行することも出来ます。intValue2;}}スクリプトが出来たらCubeゲームオブジェクトに取り付けます。CubeScriptスクリプトグラフでMyScriptのMyAddMethodを選択し、適当にユニットを繋げてUnityを実行します。MyScriptはCubeゲームオブジェクトに取り付けたので、参照ではSelfとし自身のゲームオブジェクトに取り付けられたMyScriptを取得しています。Graphを使って簡単なサンプルを作成してみます。サンプルの概要としてはCubeゲームオブジェクトがX軸の正の方向に一定のスピードで移動し、その先にあるGoalAreaと接触したらコンソールにゴールと表示します。Machineコンポーネントを取り付け、GraphにCubeScriptスクリプトグラフを取り付けているので、これらを使います。Cubeゲームオブジェクトのインスペクタは以下のようになっています。Triggerにチェックを入れます。Gravityのチェックを外します。MachineのGraphにはCubeScriptスクリプトグラフが設定されていることとします。Variablesというゲームオブジェクトも自動で作られます。次にヒエラルキーに新しくCubeを作成し、名前をGoalAreaとします。GoalAreaのインスペクタは以下のようにします。新しくGoalAreaというタグを作成し、GoalAreaゲームオブジェクトに設定します。TransformのPositionのXを5にします。Triggerにチェックを入れます。今回のサンプルではCube自身でGoalAreaに侵入したかどうかを判定するのでGoalAreaゲームオブジェクトはGoalAreaタグを設定し、コライダが衝突しないようにするだけです。CubeScriptグラフの中身を作成するCubeScriptスクリプトグラフの中身を作成していきます。ここまででCubeScriptには色々なユニットを配置していましたが、全て削除しておきます。スクリプトグラフ内でCtrl+Aキーを押すと全ユニットを選択出来るので、その状態でDeleteキーを押すと全削除出来ます。変数の作成Cubeは一定のスピードで移動させるのでオブジェクト変数としてspeedを定義し、インスペクタで数値を設定出来るようにします。ヒエラルキーでCubeゲームオブジェクトを選択したら、CubeScriptスクリプトグラフのObjectを押し、名前にspeedと入力し、+を押します。TypeにはFloatを選択し、Valueには2を設定します。ヒエラルキーのCubeゲームオブジェクトを選択すると、インスペクタのVariablesにSpeedが表示され値を変更出来るのが確認出来ます。オブジェクト変数はこのオブジェクトが持つ変数で、C#スクリプトのpublicフィールドと同じと考えることが出来ます。次に、CubeゲームオブジェクトはGoalAreaに接触したら移動をやめるので、接触したかどうかを判定する変数を作ります。CubeScriptでGraphを押し、名前にgoalと入力し+を押したらTypeをBooleanにします。goalはグラフ変数なのでこのグラフのみで使用する変数になりC#スクリプトのprivateなフィールドと同じです。CubeScriptにユニットを作成する変数が出来たので次はユニットを作成し、Cubeゲームオブジェクトの動きを作成していきます。Cubeゲームオブジェクトは毎フレームX軸の正の方向に移動させる必要があるので、Updateユニットを作成し、毎フレーム実行されるようにします。Cubeが移動するのはグラフ変数のgoalがfalseの時(ゴールしていない時)だけなのでGraphのgoalをグラフにドラッグ&ドロップして配置します。Updateユニットからifユニットを作成して繋げ、グラフ変数のgoalがfalseの時にTransformのTranslateユニットにフローを繋ぎます。Translateはゲームオブジェクトを移動させるユニットです。CubeはX軸の正の方向に移動させるのでTranslateのXに移動値を入れるようにします。Timeユニットを掛けて1フレームの移動値を合わせます。その値をTranslateのXに接続します。これでCubeは一定のスピードでX軸の正の方向に移動するようになりました。次にCubeがGoalAreaに接触したかどうかを判定する必要があります。CubeゲームオブジェクトがGoalAreaと接触したかどうかは、Cubeゲームオブジェクトが持つコライダがGoalAreaのコライダと接触したかどうかを判定することで判断できます。Enterユニットを作成し、Selfを指定して自身が持つコライダが他のコライダと接触した時に実行されるようにします。Variableユニットを使ってグラフ変数のgoalをtrueにします。Logユニットを使って「ゴール」という文字列をコンソールに表示します。Scriptingを使用するとC#スクリプトを自分で作成する必要がなく視覚的に確認しながら処理の流れやデータの確認が出来ますね。グラフの処理が多くなるとそれだけユニットも膨大になってC#スクリプトで処理を作るよりも流れが分かり辛くなる可能性も否めませんね。いう考えを実装していけば膨大なユニットを持つグラフにはならないかもしれません。Scriptingではあいまい検索でユニットを項目事に選べるので、どんな機能があるのか?またどうやって使うのか?がわかりやすいかもしれません。実行時にデータや流れも確認出来るのもいいですね。Scriptingを使用して作成してみたいと思います。Scriptingを使って同じように動かしてみます。Scriptingを使って同じように動かしてみます。Scriptingを使ってキャラクター移動スクリプトの作成ホームVisualScriptingスポンサーリンクサイト内検索が出来ますプロフィール管理人のかめくめちゃんです。(-_-)メールはこちらにお願いします(記事に関する質問は送らないでください、返信は期待しないでください(._.))。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をコピーしました。