我知道,很多人问过这个问题。我已经去了所有这些职位,但没有一个解决方案可以解决我的问题。我正在创建一个关卡进度条,在此脚本中,我试图更新文本(levelNumber)并在每次关卡完成时向levelNumber添加+1,在这里我使用playerprefs保存levelNumber,以便数据可以通过下一个关卡(场景) )。但是问题是levelNumber甚至没有在Text字段中更新,根据脚本,当游戏开始显示我在检查器1和2中给出的值时,Text_1应该从0开始,Text_2从1开始,以确认我已经将inspector中的值更改为21游戏开始显示21和30时,再次输入30和30。这意味着UI文本未从脚本更新。
public class PrograssBar : MonoBehaviour
{
[SerializeField] private Text Text_1;
[SerializeField] private Text Text_2;
private int levelNumber = 0;
[SerializeField] Transform startTransform;
Transform finishTransform;
[SerializeField] Slider slider;
float maxDistance;
void OnEnable()
{
levelNumber = 0;
}
void Start()
{
finishTransform = GameObject.FindGameObjectWithTag("CloneGoal").GetComponent<Transform>();
maxDistance = getDistance();
levelNumber = PlayerPrefs.GetInt("LevelNumber");
}
void Update()
{
if (startTransform.position.z <= maxDistance)
{
float distance = 1 - (getDistance() / maxDistance);
setProgress(distance);
}
}
float getDistance()
{
return Vector3.Distance(startTransform.position, (finishTransform.position - new Vector3(0, 0, 22)));
}
void setProgress(float p)
{
slider.value = p;
}
private void LevelUp()
{
UpdateLevel(levelNumber + 1);
PlayerPrefs.SetInt("LevelNumber", levelNumber);
}
private void UpdateLevel(int levelNumber)
{
this.levelNumber = levelNumber;
Text_1.text = " " +this.levelNumber.ToString();
Text_2.text = " " +(this.levelNumber + 1).ToString();
}
}
答案 0 :(得分:1)
问题在于您在执行过程中从未将levelNumber
保存到首选项,因此您的LevelUp
函数应类似于:
private void LevelUp()
{
UpdateLevel(levelNumber + 1);
PlayerPrefs.SetInt("LevelNumber", levelNumber);
PlayerPrefs.Save();
}
查看此doc
答案 1 :(得分:0)
在方法private void UpdateLevel(int level)
中,您要设置this.levelNumber = levelNumber
。
方法的属性为int level
。
所以您可能想做:
this.levelNumber = level;
而且我不太确定您在哪里调用方法private void LevelUp()
,因为它是私有的,并且在此类中的任何地方都没有被调用。