質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

2948閲覧

UnityのInputSystemで押された後、押されたとき等の実装

Benway

総合スコア3

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2022/05/19 15:27

タイトルの通りです。あと初心者です。
今回、RigidbodyとInputSystemを使った自機の移動を作りました、その中で移動している自機に慣性が乗っているのでそれを消すためにボタンが離された時、という処理をスクリプトで実行したいんですけど方法が全くわかりません。

今回欲しい内容として、InputSystemで押したとき、離した時をどうやって実行するかです。(このスクリプトの場合だと、OnMoveが離された後ですね)

調べたこと、
https://gamedev65535.com/entry/unity_inputsystem_interaction/
https://logmi.jp/tech/articles/326468
https://gamedev65535.com/entry/unity_inputsystem_interaction_longpressedrapidfire/

以下上から、 OnEnable内のinput.actions[""].performed までは分かる、そのあとに何故+=があるのか?そもそもなぜ足しているのか?

コールバックを調べてもよくわからなかった。

contextを調べてもよくわからなかった、public void Process(ref InputInteractionContext context)この引数の意味も。

C#

1コード 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5using UnityEngine.InputSystem; 6 7[RequireComponent(typeof(PlayerInput))] 8public class InputSystemTest : MonoBehaviour 9{ 10 private Rigidbody rb; 11 private InputAction moveAction, jumpAction; //_これ(アンダーヴァー)を識別で着けたりする。unity道場では突けてる 12 public float Speed = 500; //スピードを1.0とインスペクター上で仮定して 13 14 private void Awake() 15 { 16 var input = GetComponent<PlayerInput>(); 17 var actionMap = input.currentActionMap; 18 rb = GetComponent<Rigidbody>(); 19 20 moveAction = actionMap["Move"]; 21 jumpAction = actionMap["Jump"]; 22 23 } 24 25 26 27 28 void OnMove() 29 { 30 var move = moveAction.ReadValue<Vector2>(); 31 32 33 34 if (move.x > 0) 35 { 36 rb.AddForce(new Vector3(Speed, 0.0f, 0.0f)); 37 } 38 39 if (move.x < 0) 40 { 41 rb.AddForce(new Vector3(-Speed, 0.0f, 0.0f)); 42 } 43 44 if (move.y > 0) 45 { 46 rb.AddForce(new Vector3(0.0f, 0.0f, Speed)); 47 } 48 49 if (move.y < 0) 50 { 51 rb.AddForce(new Vector3(0.0f, 0.0f, -Speed)); 52 } 53 } 54 55 void Onjump() 56 { 57 var jump = jumpAction.triggered; 58 59 if (jump) 60 { 61 rb.AddForce(new Vector3(0.0f, 200.0f, 0.0f)); 62 Debug.Log("aa"); 63 } 64 } 65 66 67 68 69 // Start is called before the first frame update 70 void Start() 71 { 72 73 } 74 75 // Update is called once per frame 76 void FixedUpdate() 77 { 78 OnMove(); 79 80 Onjump(); 81 } 82 83} 84

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bboydaisuke

2022/05/19 21:49

デリゲートを勉強するとよいでしょう。
Benway

2022/05/21 14:23

ご返事遅れてすみません、しました!教えてくれてありがとうございます! +=の意味がやっと分かりました!
guest

回答1

0

ベストアンサー

Input Systemまだ使ってなかったので気になってました。楽しそうですね!
phaseで確認できるようですよ。離した時はInputActionPhase.Canceledを返します。
今回のコードで言うと下記のように取得できます。

c#

1var move = moveAction.ReadValue<Vector2>(); 2Debug.Log(moveAction.phase); 3// 下記のいずれかがコンソールに出力される 4// InputActionPhase.Waiting => "何もしていない" 5// InputActionPhase.Started => "開始" 6// InputActionPhase.Performed => "閾値を超えた入力" 7// InputActionPhase.Canceled => "離した" 8// InputActionPhase.Disabled => "無効中"

参考

+=

どこに書いてるか分からないので予想ですが、下記のように実装するとInputActionPhase.CanceledのタイミングでOnCanceled(InputAction.CallbackContext obj)が呼ばれます。

c#

1 moveAction = actionMap["Move"]; 2 // += すると 3 moveAction.canceled += OnCanceled; 4} 5 6// この関数が呼ばれるようになる 7void OnCanceled(InputAction.CallbackContext obj) 8{ 9 Debug.Log("離した"); 10} 11 12void OnDisable() 13{ 14 // 逆に -= すると 以降関数が呼ばれなくなる 15 moveAction.canceled -= OnCanceled; 16}

参考

InputInteraction

長押しやダブルクリックなどそういうのをInteractionsで指定するみたいですね。
デフォルトでも何個か用意されているみたいです。下記みたいなやつです。

イメージ説明

これを自作したい時に、IInputInteractionを実装して初期化するとInteractionsで選択できるようになるみたいです。

イメージ説明

何も実装されていない最小コードが下記です。

c#

1using UnityEngine; 2using UnityEngine.InputSystem; 3 4#if UNITY_EDITOR 5using UnityEditor; 6[InitializeOnLoad] 7#endif 8public class InputInteractionTest : IInputInteraction 9{ 10 public void Process(ref InputInteractionContext context) 11 { 12 // ここに自作したい内容を記述 13 } 14 15 public void Reset() 16 { 17 18 } 19 20 // 初期化 ---------- 21#if UNITY_EDITOR 22 static InputInteractionTest() 23 { 24 Initialize(); 25 } 26#endif 27 28 [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)] 29 static void Initialize() 30 { 31 InputSystem.RegisterInteraction<InputInteractionTest>(); 32 } 33}

投稿2022/05/20 16:47

編集2022/05/20 17:36
IShix

総合スコア1724

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Benway

2022/05/21 14:21

ありがとうございます!ベストアンサーが遅くなってすみません、無事実装できました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問