Unityを使った3Dゲームの作り方(かめくめ)ゲーム開発エンジンUnityを使った3Dゲームの制作に参考になる情報を公開しています。2019.11.19今回はUnityの新しい入力システムであるInputSystemを使ってみたいと思います。現時点(2019/11/13)ではまだプレビュー版ですが、今後はInputSystemが使われ、おそらく以前から使用しているInputManagerが廃止されていくような感じですね。いつInputManagerが使えなくなってもいいようにInputSystemを使えるようにしておくことにしました。4ランタイムが必要です。packagesを選択します。packagesにチェックを入れるとプレビュー版の機能も表示されます。Systemを選択し、Installボタンを押してインストールします。これでInputSystemのインストールが出来ました。InputSystemを使えるように設定するInputSystemをインストールすると既に使える状態になりますが、後から以前のInputManagerを使った操作とInputSystemのどちらを使うか、または両方使うかの設定をすることができます。Handlingで切り替えが出来ます。設定を切り替えて反映させる為にUnityが再起動されます。System(Preview)もしくはBothを選択するとUIのText等に直接日本語入力が出来ないです(以前のUnityでも同様の現象があったような?)。スクリプトから出力もしくはコピーしたやつを貼り付ける事は出来るようです。正式版が出るころには出来るようになっているでしょうか。assetボタンを押し設定ファイルを作成します。するとAssetフォルダに設定ファイルが作成され、InputSystemPackageを選択した時の設定ファイルとされます。右上の歯車を押すと他の設定ファイルと切り替えたり、新しい設定ファイルを作成する事が出来ます。Modeは入力システムの処理をするタイミングのイベントのモードです。Updateは現在のフレームレートでイベントが発生します。Updateは固定フレームレートでイベントが発生します。ManuallyはスクリプトからInputSystem.Updateメソッドを呼んで自分でイベントを発生させます。currentはスクリプトで.currentプロパティを使用する場合にチェックを入れます。新しい入力があった場合に、現在のゲームパッドを取得する場合はGamepad.currentで取得できますが、PS4コントローラー等はジャイロ機能の影響でノイズが発生する為に一定の入力値が得られてしまうのでここでチェックを入れてノイズをカットするようです。スクリプトで.currentプロパティを使わない場合はチェックは入れない方がいいみたいです。Orientationはセンサーによって得られる回転値をZ軸を中心に回転させます。Minはプロセッサで値が明示的にされていない時の代替で使用する最小値です。この値より下の入力値の場合は入力を無視します。Maxはプロセッサで値が明示的にされていない時の代替で使用する最大値です。この値より上の入力値の場合は入力を無視します。Pointはボタンが「押された」と判定するまでに押し続ける必要がある範囲です。Timeはタップと認識する時間。Timeはスロータップとして認識する時間。Timeはアクションを保持する時間。Timeはマルチタップと認識する為の間隔時間。DevicesはInputSystemで認識出来るデバイスをプロジェクト毎に限定したい時に使用します。全てのデバイスの入力を受け付ける場合はリストには何も登録せず、例えばゲームパッドだけの入力を受け付ける時はリストにGamepadだけを登録します。Debuggerウインドウを開きます。Devices’を選択します。ここら辺はドキュメントに記載があるので詳しい所はそちらを参照してみてください。1.0.2docs.unity3d.comゲームパッドやキーボード、マウスの入力を直接取得してみるInputSystemのインストールと設定が出来たので、次はゲームパッドやキーボード、マウスの入力をスクリプトで直接取得してみましょう。InputManagerの時のInput.GetKeyDown(“space”)のように直接キーの指定をして取得するのと同じ感じです。新しくDirectInputTestスクリプトを作成しMainCamera等のゲームオブジェクトに取り付けます。c);}}InputSystem系のクラスはUnityEngine.InputSystemパッケージにありますのでusingディレクティブで指定します。スクリプトで使用しているKeyControlクラスはUnityEngine.InputSystem.Controlsパッケージにありますのでこれも指定します。UnityEngine.InputSystem.Controls;現在のキーボードはKeyboard.currentで得られ、その後プロパティでa.Key等とすればそのキーのKeyControlが得られ、その後.isPressedとすればそのキーが押されているかどうかのbool値が得られます。{a.Keyの部分を変更すれば他のキーが押されているかどうかも判定出来ます。キーの指定は列挙型のKeyを使って行う事も出来ます。その1フレーム内だけ押されたかどうか判定したい場合は.wasPressedThisFrameを使用します。{これらのキーは物理的なキーボードの配列でのキーと一致していて、QWERTY配列のQキーはAZERTY配列のキーボードの場合はAキーになります。実際のキーの名前と一致させたい場合はKeyControl.displayNameを使います。{Debug.Log("Cキーが押された");}現在のマウスはMouse.currentで取得出来、プロパティのleftButtonで左ボタンを取得出来ます。現在のゲームパッドはGamepad.currentで取得出来ます。今回はPS4コントローラーを接続して確認しますが、わたくしのパソコンかPS4コントローラーの接続状態が悪いのかエラーがちょくちょく発生するので取得出来なかった時はその後の処理はしないようにします。キーボードやマウスの場合も確認した方がいいかもしれません。gamepad.leftStick.ReadValue()でPS4コントローラーの左スティックの入力値(Vector2)の値が取得出来ます。gamepad.buttonEast.isPressedでPS4コントローラーの〇ボタンが押されたかどうかを取得出来ます。gamepad.dpad.up.wasPressedThisFrameでPS4コントローラーのDパッド(十字キー)の上が押されたかどうかをこの1フレームだけ判定します。ある特定のキーを押したかではなく、どのキーを押したかを判定する時はInputManagerではInput.inputStringで取得出来ましたが、InputSystemの場合はKeyBoard.current.onTextInputイベントのリスナーにメソッドを追加し同じような機能を実現出来ます。c);}スクリプトを取り付けたゲームオブジェクトがアクティブになったらKeyboard.current.onTextInputのイベントリスナーにOnTextInputメソッドを追加し、非アクティブになる時はイベントリスナーから削除します。コメント化しているOnEnableはしていないOnEnableと同じ事をしていてよりわかりやすいかなと思って記述しています。OnTextInputメソッドでは今打った文字を受け取りそれをコンソールに出力しているだけです。これで直接ゲームパッド、キーボード、マウスの入力を取得する事が出来ました。アクション設定ファイルを作成して入力を検知するここまでで直接ゲームパッド、キーボード、マウスの入力を取得しましたが、InputManagerの時と同じようにHorizontalやFire1等のボタンにゲームパッドのボタンやキーボードのキー、マウスのボタンの割り当てを行うことで入力デバイスが変わっても同じように入力を受け付けるようにすると便利です。その為に使用するのが、アクション設定ファイルです。Actionsを選択すると何も設定されていない空のアクションファイルを作成出来ます。Actionsボタンを押すと予め設定が施されたアクションファイルが作成されます。Inputコンポーネントはアクション設定ファイルのデータを使って実際に操作する時に使用するコンポーネントです。使い方は後で見ていきます。試しに空のアクションファイルを作成し、アクションの設定をしてみましょう。Actionsを選択し、名前をMyControlとします。assetボタンを押すとアクション設定ファイルウインドウが開きます。空のアクション設定ファイルの場合は以下のようになります。Assetボタンを押して保存する必要があります。MapsはActions(InputManagerのHorizontalやFire1に該当)の全体を表す名前でActionsはアクションの名前とキーボードのキーやマウス等の割り当て、Propertiesは選択したアクションのプロパティが表示されます。Mapの作成アクションマップを作成してみます。Mapsの横の+を押し、名前をPlayerとします。アクションマップを作成すると一つActionが作成されます。Actionを選択した状態でダブルクリックするかF2キーを押して名前をMoveと変更します。これでInputManagerのHorizontal等と似たようなMoveというアクションが出来ました。Moveアクションの設定Moveアクションに設定をしていきます。TypeをVector2とします。これでMoveは値を取得するタイプのアクションでVector2にフィルタリングをします。矢印キーのバインドMoveアクションに割り当てるキーの設定をしてみます。Binding>はとりあえず削除します。Binding>を選択し、右クリックからDeleteを選択するかShiftキーを押しながらDeleteキーを押して削除します。Compositeを選択します。追加すると以下のようにUp、Down、Left、Rightの複合型のバインディングが作成されます。Upを選択し、PropertiesのPathの右のリストメニューを押します。出てきたリストメニューの左上のListenを押した状態で該当するボタンやキーを押すとそのリストに関する項目だけが表示されるので便利です。Arrow[Keyboard]をマウスの左ボタンで選択します(キーボードのEnterだとEnter[Keyboard]の項目が出てしまう・・・)。同じようにDown、Left、Rightも対応する矢印キーをバインド(結びつける)してください。これでキーボードの矢印キーの設定が出来ました。Vectorという名前だと分かりずらいのでArrowに変更します。ゲームパッドの左スティックのバインド次にPS4コントローラーの左スティックのバインドを追加します。Binding>削除しなくても良かったですね・・・)。Stick[Gamepad]を設定します。これでゲームパッドの左スティックもMoveにバインドされました。次に新しくFireアクションを作成し、キーボードのSpaceキーを押した時とマウスの左ボタンを押した時の設定をします。Actionsの右の+を押して新しいアクションを作成し、名前をFireとします。TypeはButtonにします。Button[Mouse]を選択します。キーボードのSpaceキーのバインド次にキーボードのSpaceキーのバインドを設定します。Bindingを選択します。新しく出来たバインド設定を選択し、PropertiesのPathの右のリストメニューを選択し、Listenボタンを押した後、キーボードのSpaceキーを押して出てきたSpace[Keyboard]を選択します。Schemeの作成アクション設定ファイルにコントロールスキームを作成することで、バインドするキーやボタンにスキームを設定し、そのスキームだけを表示するように出来ます。Schemeを選択します。試しにキーボードとマウス操作のスキームを作成してみると以下のようになります。Nameは任意で、ListにKeyboardとMouseを追加します。同じようにゲームパッドのスキームも作成します。NameはGamepadでListにGamepadを追加します。すると作成したバインドの所でコントロールスキームのチェックを入れることが出来るようになります。キーボードとマウス操作のコントロールスキームはKeyboard&Mouseにチェックを入れ、ゲームパッドのコントロールスキームはGamepadにチェックを入れます。Schemesを選択した状態だと全てのスキームが表示されますが、例えばGamepadスキームだけを選択するとPropertiesでGamepadにチェックを入れたバインドしか表示されません。これでアクション設定ファイルの作成が出来ました。スクリプトで入力を受け取るアクション設定ファイルが出来たので、次は設定したアクションのキーやボタンが押された時にそれらをスクリプトで取得してみます。Inputに先ほど作成したアクション設定ファイルのMyControlを設定して、該当するボタンが押された時に何らかの処理をするやり方をしてみます。Inputを選択します。InputのActionsにMyControlを設定します。Messagesにしたやり方をやってみます。Messagesにすると該当するアクションボタンが押された時にOn+アクション名のメソッドが呼ばれます。Moveの場合はOnMoveメソッド、Fireの場合はOnFireメソッドが呼ばれます。試しに新しくSendMessageScriptスクリプトを作成しMainCameraに取り付けて実験してみます。{Debug.Log("Fire");}}OnMoveはMoveアクションにバインドしたキー等を押した時に呼ばれ、引数でInputValueを受け取ります。受け取ったinputValueのGetメソッドでジェネリックでVector2を指定しVector2の値をコンソールに出力しています。currentにチェックを入れておきます。PS4コントローラーの左スティックやキーボードの矢印キー、マウスの左ボタン等を押して確認してみてください。PS4コントローラーの接続先のUSBポートによっては左スティックがうまく反応しないかもしれません。フィールドにVector3型のvelocity等を用意しておいて、OnMoveメソッド内でその値をvelocityに足すとキャラクター移動の処理も出来そうですね。Eventsにしたやり方をやります。新しくUnityEventScriptスクリプトを作成し、MainCameraに取り付けます。MainCameraに取り付けてあったSendMessageScriptは削除しておきます。context.ReadValue<Vector2>();Debug.Log(value);}}こちらは引数でInputAction.CallbackContext型の引数を受け取るようにOnFireとOnMoveメソッドを定義しています。InputのEventsのPlayerのMoveとFireにUnityEventScriptのOnMoveとOnFireを実行するように設定します。これでMoveアクションとFireアクションにバインドしたキーやボタン等が押された時にUnityEventScriptのOnMoveとOnFireメソッドをトリガーするようになりました。InputコンポーネントにMyControlアクション設定ファイルを設定してそれを取得しなくてもスクリプト内でアクション設定ファイルのインスタンスを生成してそれを利用するやり方もあります。Classにチェックを入れてApplyボタンを押します。するとMyControlのC#のラッパークラスが作成されます。クラス名等をいじっていなければMyControlスクリプトが作成されます。InputコンポーネントとUnityEventScriptを削除し、新しくCreateInputActionControlスクリプトを作成し取り付けます。{Debug.Log("Fire");}}MyControl型のmyControlフィールドを宣言します。AwakeメソッドでMyControlのインスタンスを生成し、PlayerアクションマップのMoveとFireアクションのperformedのフェーズ(段階)でそれぞれOnMoveメソッドとOnFireメソッドをトリガーするように設定します。performedフェーズはアクションとの相互作用が完了した時のフェーズで他にはstarted(アクションとの相互作用を開始した時)等があります。スクリプトのフィールドにInputAction型のフィールドを用意しインスペクタで設定するやり方スクリプトのフィールドにInputAction型のフィールドを用意し、インスペクタでアクション設定し、スクリプトから取得をすることも出来ます。MainCameraのCreateInputActionControlを削除し、新しくCreateInputActionScriptを作成しMainCameraに取り付けます。{Debug.Log("Fire");}}CreateInputActionScriptのインスペクタでアクション設定をします。この場合はあらかじめアクション設定ファイルを作らずインスペクタで同じように設定していきます。スクリプトでアクションのバインドも設定するやり方スクリプト内でInputActionの作成とバインドの設定をする事も出来ます。{Debug.Log("Fire");}}行っていることはアクション設定ファイルを作った時と同じ設定をスクリプトで記述しているだけです。キーボードの矢印キーはコンポジットで作成したので作成したMoveアクションのInputActionにAddCompositeBindingメソッドを使って追加しています。バインドの設定文字列はアクション設定ファイルのActionのPropertiesのPathの右のTを押した時に出てくる文字列と同じ物を指定します。ArrowのUpであれば以下のようにTキーを押すと該当する文字列に変わります。通常のバインドはAddBindingメソッドで行えます。ゲーム中にスクリプトからバインド設定を変更するゲーム中に設定したアクションの割り当てを変更する事も出来ます。BindInputActionにUpdateメソッドを追加します。InputControlPath.ToHumanReadableString(action.effectivePath));}}}マウスの右ボタンを押したらFireアクションにバインドしていたキーボードのSpaceキーをキーボードのTabキーに変更しています。ModuleではInputManagerのボタン等が設定されています。InputSystemUIInputModuleボタンを押します。ModuleコンポーネントがInputSystemUIInputModuleコンポーネントに変わります。System/InputSystem/Plugins/PlayerInput/DefaultInputActionsアクション設定ファイルがデフォルトで設定されます。Assetには自分で作ったアクション設定ファイルも設定出来ます。Moduleを選択して取り付ける事も出来ます。終わりにInputManagerの使い方に慣れているので、InputSystemへと変更するのはなんだか難しいですね。(^_^;)InputSystemのドキュメントに情報がたくさんありますので、他にやりたい事があれば参照してみてください。́Д`)InputManagerが完全に廃止されたら使用している全ての記事の内容を変更せにゃいかんのか・・・・こりゃ大変だ。InputSystemを使ったキャラクター操作やPlayerInputManagerコンポーネントの使い方については以下の記事を参照してください。UnityのInputSystemを使ったキャラクターの操作機能Unityの新しい入力システムであるInputSystemを使ったキャラクターの操作機能とローカルマルチプレイヤーゲーム対応を作成してみます。gametukurikata.com2019.11.20参考サイト以下のInputSystemのドキュメントから詳細が見れます。コピーかめくめちゃんをフォローする7Unityを使った3Dゲームの作り方(かめくめ)Unityを使った3Dゲームの作り方(かめくめ)関連記事Unity基本情報UnityのReflectionProbeを使って鏡を作ってみるUnityのReflectionProbeを使って鏡を作り、キャラクターを動かして映るかどうかを試していきます。Unity基本情報UnityのInputSystemを使ったキャラクターの操作機能Unityの新しい入力システムであるInputSystemを使ったキャラクターの操作機能とローカルマルチプレイヤーゲーム対応を作成してみます。Unity基本情報Unityで厚みのあるレイを飛ばして当たり判定を行うUnityでBoxCast、CapsuleCast、SphereCast等の厚みのあるレイを飛ばして、他のゲームオブジェクトとの当たり判定をしてみます。Unity基本情報UnityHubが開かなくなったUnityHubで新しいUnityのバージョンをインストールしたら失敗し、その後UnityHubを開いてもローディング画面でロードしたまま開けなくなったので備忘録的に情報を残しておきます。Unity基本情報Unityのレンダーテクスチャを使って鏡を作成するUnityのレンダーテクスチャを使って鏡の機能を作成していきます。Unity基本情報UnityのAddressablesを使ってサーバーにあるアセットバンドルを使うUnityのAddressablesを使うとアセットの差し替えや追加ダウンロードをする機能などサーバー上にあるアセットバンドルをロードして使用することが出来ます。ユニティちゃんのRPGを作ってみよう21ー戦闘で使うスキルデータを作成するーUnityのInputSystemを使ったキャラクターの操作機能ホームUnity基本情報スポンサーリンクサイト内検索が出来ますプロフィール管理人のかめくめちゃんです。(-_-)メールはこちらにお願いします(記事に関する質問は送らないでください、返信は期待しないでください(._.))。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をコピーしました。