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

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

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

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

Unity

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

Q&A

解決済

1回答

371閲覧

unity セーブ PlayerPrefs.SetString()の動作タイミングについて

BitCoin

総合スコア53

C#

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

Unity

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

0グッド

0クリップ

投稿2017/09/08 12:07

編集2017/09/08 12:11

unityでインプットフィールドコンポーネントに入力されたテキストの値を
保持し、プレイスフォルダー(インプットフィールドに何も文字が入力されてない場合に表示される文字)に表示させたいのですが

onEndEditイベント(リターンキーが押された場合にトリガーされるイベント)がトリガーされない場合でも**PlayerPrefs.SetString()が作動してしまうのです。
これをonEndEditイベントがトリガーされた場合のみ
PlaerPrefs.SetString()**を動作させたいのですが解決策などあるでしょうか。

因みに

public void OnSubmit(string value) { Debug.Log (inputField.text); PlayerPrefs.SetString (key, inputField.text); Debug.Log("Submit value is " + value); }

のPlayerPrefs.SetString (key, inputField.text);をコメントアウトし

void Start () { inputField.placeholder.GetComponent<Text> ().text = PlayerPrefs.GetString (key); inputField.onValueChange.AddListener(OnValueChange); inputField.onEndEdit.AddListener(OnSubmit); //PlayerPrefs.SetString (key, inputField.text); //ここのコメントを外すとインプットフィールドコンポーネントのplaceholderがつぎから何も表示されなくなる }

PlayerPrefs.SetString (key, inputField.text); ここのコメントを外すとインプットフィールドコンポーネントのplaceholderがつぎから何も表示されなくなるのです。


本題のコード

c#

1using UnityEngine; 2using UnityEngine.UI; 3using System.Collections; 4 5public class InputFieldEventExample : MonoBehaviour { 6 public string placeholderValue ; 7 public string key; 8 [SerializeField] private InputField inputField; 9 10 void Start () { 11 12 inputField.placeholder.GetComponent<Text> ().text = PlayerPrefs.GetString (key); 13 14 inputField.onValueChange.AddListener(OnValueChange); 15 inputField.onEndEdit.AddListener(OnSubmit); 16 17 //PlayerPrefs.SetString (key, inputField.text); //ここのコメントを外すとインプットフィールドコンポーネントのplaceholderがつぎから何も表示されなくなる 18 19 20 } 21 22 23 public void OnValueChange(string value) 24 { 25 Debug.Log("Input Field value is " + value); 26 } 27 28 public void OnSubmit(string value) 29 { 30 Debug.Log (inputField.text); 31 PlayerPrefs.SetString (key, inputField.text); 32 Debug.Log("Submit value is " + value); 33 } 34} 35

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

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

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

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

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

guest

回答1

0

ベストアンサー

onEndEditは「送信時」ではなく「編集終了時」に呼び出されますので、
リターンキーを押されずに別の場所をクリックした場合にも発動します。
なので「リターンキーが押されていないのにPlayerPrefs.SetString()が作動している」ように見えたのではないでしょうか。

リターンキーが押された時のみ動作させるにはinputField.onEndEdit.AddListenerの行を以下のように変更してください。
参考:Submit inputField when Enter is clicked - Unity Forums

C#

1inputField.onEndEdit.AddListener(fieldValue => { 2 if (Input.GetKey(KeyCode.Return)) 3 OnSubmit(fieldValue); 4});

「ここのコメントを外すと〜」については、コメントを外した状態で
「ゲームスタート → (何も入力せず)ゲーム停止 → ゲームスタート」
と動かすとplaceholderが空になると思います。

これは、「Start時点で何も入力されていないinputField.text(つまり"")が保存される → 次回起動時にplaceholderに保存されていた""が入力される(つまり何も見えない)」となる為です。

このコードが存在していても、inputFieldに入力(保存)しておけば想定通りの動作は行われます。

投稿2017/09/09 03:11

sakura_hana

総合スコア11425

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

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

BitCoin

2017/09/10 13:37

回答ありがとうございます。 提示されたコードで試したところうまくいきました。 ここで私が勘違いしていたのは「onEndEdit」が呼ばれるタイミングです。 リターンキーを押されずに別の場所をクリックした場合にも発動します。 ↑この通りでしたが、私の場合unity本体で再生と停止をしていた際、停止する際に停止ボタンを押すタイミング?でonEndEditが呼ばれていたみたいです。 ここら辺がややこしいですね・・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問