我做了一个触发器,碰到玩家后会出现密码输入框,密码使用UI的inputfield实现的,但是输入后无法立刻检测,必须离开触发器后在触发一次才会执行if (pin.text == ppin)里的代码。
就是,第一次触发后开始输入密码,inputfield.text也开始变化,但if (pin.text == ppin)里的代码不执行,必须离开触发器再除法一次才会执行。
我觉得好像inputfield.text的内容好像没有确定,离开触发器后才能确定内容。
后面有两个截图,第一个是第一次触发触发器,密码输入对了,但没反应。第二个是第二次触发代码就直接运行了。
怎么让密码输入正确直接触发代码呢?(第一次输入按回车也没反应,好像不是普通的输入)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class terminal : MonoBehaviour
{
public GameObject panel;
public GameObject platform;
public GameObject block;
public InputField pin;
private string ppin = "308";
void Start()
{
pin = GameObject.Find("Password").GetComponent<InputField>();
}
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.tag == "player")
{
panel.SetActive(true);
if (pin.text == ppin)
{
Destroy(block);
platform.SetActive(true);
}
}
}
private void OnTriggerExit2D(Collider2D collision)
{
if (collision.tag == "player")
{
panel.SetActive(false);
}
}
}
根据你的描述是需要在用户输入完密码后进行校验,你需要给InputField
添加个监听就可以了
比如:
void Start()
{
pin = GameObject.Find("Password").GetComponent<InputField>();
pin.onEndEdit.AddListener(OnEndInput);
}
void OnEndInput()
{
if (pin.text == ppin)
{
Destroy(block);
platform.SetActive(true);
}
}
inputfield.onvaluechanged.addlistener(function)
我觉得这个可以完美符合你的需求,触发器调出panel后,为inputfield添加事件监听,每一次值改变时都会检测一次,而不用按下回车或其他键来确定。
triggerenter、exit时间只会在触发触发器那一帧执行一次,而你的输入密码是一个持续的过程,所以你的密码检测逻辑应该放在triggerstay里面进行,或者在enter后开个协程检测。