Я использую TextMeshPro с полем ввода. Я ищу входной символ и заменяю его другим символом. Я могу легко сделать это с помощью функции Update (), но вызовы довольно дороги. Как создать событие, чтобы проверить, было ли изменено текстовое поле?

РЕДАКТИРОВАТЬ: на основании ответа пользователя я попытался использовать onValueChanged, но получил ошибку исключения - StackOverflowException: The requested operation caused a stack overflow.

using System;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;

public class TextChangeEvent : MonoBehaviour {
   
   public TMP_InputField textInput_;   
   
   public void Start(){
     textInput_.onValueChanged.AddListener (delegate { myTextChanged(); });
   }

   public void myTextChanged(){
     textInput_.text = textInput_.text.Replace("World", "Unity");
  }
}
0
Max 15 Сен 2021 в 15:20

2 ответа

Лучший ответ

Что ты делаешь в

textInput_.text = textInput_.text.Replace("World", "Unity");

Меняет текст
→ таааак снова событие onValueChanged вызвано
→ снова вызывается myTextChanged
→ снова меняет текст
→ таааак снова событие onValueChanged вызвано
→ .......... БЕСКОНЕЧНАЯ ПЕТЛЯ

Что вы можете попробовать сделать, так это

public TMP_InputField textInput_;   
   
public void Start()
{
    // onValueChanged expects a `void(string)` so instead of adding an anonymous 
    // delegate you can never remove again rather make sure your method implements 
    // the correct signature and add it directly
    textInput_.onValueChanged.AddListener(myTextChanged);
}

// We need this signature in order to directly add and remove this method as 
// a listener for the onValueChanged event
public void myTextChanged(string newText)
{
    // temporarily remove your callback
    textInput_.onValueChanged.RemoveListener(myTextChanged);

    // change the text without being notified about it
    textInput_.text = newText.Replace("World", "Unity");

    // again attach the callback
    textInput_.onValueChanged.AddListener(myTextChanged);
}
1
derHugo 15 Сен 2021 в 13:27

Попробуйте это из документации Unity: OnValueChanged

Изменить 1:
Я изучил проблему и прочитал это сообщение: Удалить слушателя с помощью один параметр в Unity
Проблема в том, что вы меняете значение, когда вы обнаруживаете изменение, но это изменение вы сделали триггеры с рекурсивностью до бесконечности ... Итак, решение состоит в том, чтобы удалить слушателя, когда вы меняете значение, а затем вам нужно чтобы снова добавить слушателя.

1
Damian Piszka 15 Сен 2021 в 12:47