起因是遇到了一个很奇怪的问题,在图一的代码打印结果debug.log(3)没有生效,但所有的绑定我都确认过一遍没有遗漏,于是一路加debug,发现name不为空且name.text是可以打印出来的,唯独name打印不了也无法修改name.texrt,最坑的是什么报错都没有,完全不理解什么地方出了问题。
直到把问题发在ggj群里,虽然还是没解决,但有人提了一句这个功能好像没必要用多线程,突然想到android中是禁止非主线程修改ui的,会不会unity中也是这样呢?将name.changename(1)移到了debug.log(1)下面,竟然真的成功了!
后来问了下gpt,这是他的回答:
“Unity禁止在非主线程中修改UI。在这个例子中,你使用了Task.Run来异步执行ConfirmBtn_onclickAsync方法,这个方法中包含了对UI元素的操作,在确认按钮被点击时,它会改变Name和Content的值并更新UI。由于Task.Run会在另一个线程中执行ConfirmBtn_onclickAsync方法,而名为ChangeName()和SetContent()的函数都试图修改UI元素的状态,所以会导致程序异常。
为了解决这个问题,你可以通过使用Unity提供的Coroutines来替代使用Task.Run。Coroutines在Unity中用于处理异步任务,并确保它们始终在主线程上运行,因此可以安全地修改UI元素。”
然而最坑的是这段出错的代码本来就是我把需求扔给GPT让它生成的……emmm看来还是不够智能啊……