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

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

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

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

Q&A

解決済

1回答

4506閲覧

[unity]InputFieldクラスのonValidateInputデリゲードについて

BitCoin

総合スコア53

Unity

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

0グッド

0クリップ

投稿2017/09/03 13:17

編集2017/09/03 13:30

InputFieldのonValidateInputデリゲードについてですが

デリゲードとはメそッドを入れるだけでそれ自体のメソッドには実装をもたないとおもっていまいた。

しかし

C#

1private InputField inputField; 2 3inputField.onValidateInput = (string text, int charIndex, char addedChar)=>{ 4 // アルファベット小文字が入力されたら大文字にする 5 char ret = addedChar; 6 if(addedChar >= 'a' && addedChar <= 'z') 7 { 8 ret = (char)(addedChar + ('A' - 'a')); 9 } 10return ret; 11}

このようにするとインプットフィールド文字が入力された際小文字から大文字になるのです。

これはonValidateInputデリゲードが入力された文字を取得する機能を持っているとしか思えません。

これはどいうことなのでしょうか?
デリゲードはメソッドの参照をいれるだけじゃない?
よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

デリゲートは確かに「関数を入れる関数」であり、そこに実装は行われません。
ですがonValidateInputはそもそも「デリゲートを入れることが出来る関数」であり、「デリゲートではない」です。

Unity - スクリプトリファレンス:InputField.onValidateInput
Unity - スクリプトリファレンス:InputField.OnValidateInput

まずは上記を見比べてください。
わかりにくいですが、onValidateInputは「OnValidateInputを引数に取る関数」です。


参考までに、onValidateInputのページにある下記サンプルコードの挙動は以下の通りです。

mainInputField.onValidateInput += delegate(string input, int charIndex, char addedChar) { return MyValidate( addedChar ); };

  1. mainInputFieldに文字が入力される。
  2. onValidateInputの引数である「delegate(=OnValidateInput)」が呼ばれる。
  3. 「delegate」によりMyValidateが呼ばれる。
  4. MyValidateで処理が実行され、charが「delegate」に返される。
  5. 「delegate」からonValidateInputにcharが返される。
  6. onValidateInputが返された文字列をmainInputFieldに反映(表示)させる。

(質問主さんのコードだと、MyValidateの部分をそのまま{}内で表記しているだけで意味としては一緒です)

投稿2017/09/04 02:01

sakura_hana

総合スコア11425

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

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

BitCoin

2017/09/05 13:58

なるほどやっと理解できました。 少し気になったことがあるのですが 関数の方のonValidateInputは public UI.InputField.OnValidateInput onValidateInput; とあるのですが リファレンスの表記が変数となっており 説明に入力文字を確認するために呼び出す関数となっているのですが 変数なのに関数?となって混乱しています。 例えば public UI.InputField.OnValidateInput onValidateInput( delegate char OnValidateInput(string text, int charIndex, char addedChar)); とかなら理解できるのですが・・・ どういうことなのでしょうか?
sakura_hana

2017/09/06 05:13

「OnValidateInputを引数に取る関数」というのは間違っていました、すみません。 正確にはonValidateInputは「デリゲートが入る変数」ですね。 onValidateInput:関数が入る変数 ↓この中身は OnValidateInput:デリゲート ↓この中身は MyValidate:関数 こんな感じかと。 変数ではあるのですが、実際入るのは関数なので、説明文では「入力文字を確認するために呼び出す関数」となっているのだと思います。
BitCoin

2017/09/06 17:19

onValidateInput:関数が入る変数 ↓この中身は OnValidateInput:デリゲート ↓この中身は MyValidate:関数 この流れをやっと理解できました。 ここでまた2つ疑問がわいてしまったのですが・・・・汗 OnValidateInputはデリゲードのプロパティですよね。 そもそもデリゲードはプロパティ化できるのかという疑問でして。。。 調べてもででこなかったので 2つ目の質問なのですが やはりどこで入力を受け取っているかということです。 OnValidateInputプロパティは http://gomocool.net/gomokulog/?p=255 ↑この記事のコンソールアプリケーション上のボタンをクリックをうけとる this.button1.ClickのClickのようなものなのかなと思いました。 OnValidateInputプロパティはイベントハンドラ?という物なのでしょうか。 となるとイベントハンドラは入力を受け付け、OnValidateInputデリゲートに実装された メソッドを実行するという物なのですかね・・・ 少し頭が混乱してきました・・汗
sakura_hana

2017/09/07 05:05

推測混じりとなりますがお許しを。 InputFieldのクラスの中を見ると、 public delegate char OnValidateInput (string text, int charIndex, char addedChar); public InputField.OnValidateInput onValidateInput { get; set; } protected override void OnValidate (); と宣言されています。 https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/delegates/using-delegates こちらの中に「インスタンス化されたデリゲートはオブジェクトであるため、パラメーターとして渡したり、プロパティに割り当てたりすることができます。」とありますので、プロパティ化は可能です。(上記2行目のonValidateInputがまさにそれです) イベントハンドラとしてはOnValidateメソッドが該当するのかなと思います。 文字入力時にOnValidateが呼ばれ、入力されたテキストを取得 ↓ OnValidate内で「onValidateInputに登録されているOnValidateInput(に登録されているメソッド)」が呼ばれ、テキストを編集 ↓ OnValidate内(続き)で、編集されたテキストを画面上に再表示 のような動きになっているのではないかなと思います。 (例示の記事で言うと、OnValidateInputはSayWorldに対応しているかと思います)
BitCoin

2017/09/08 06:00

なるほど納得できました。 プロパティ化は可能なのですね OnvalidateメソッドがOnvalidateInputデリゲードに登録されてるメソッドを呼んでいるわけですか。 ちょっと気になってOnvalidateメソッドの中身を見ようとしたのですが、monoのアゼンブリブラウザーでも見ることができないんですね... 私みたいな初心者は本や、ネットの資料を見ないと、初見では、OnvalidateInputプロパティにOnvalidateInputデリゲードを初期化すると入力された文字に対してアクションを起こせることは理解できないのですが、 何かいい勉強法などありますでしょうか? 質問が少しそれてしまったようで申し訳ありません...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問