Unity跨脚本调用函数后编辑器值不更新但控制台输出正常
嘿,我一眼就看出问题出在哪了——你用继承的方式搞错了脚本实例的引用!
你的editProperties脚本继承了OrbitFireball,这意味着当你把它挂在Radius (+)对象上时,它是一个完全独立的OrbitFireball子类实例,和挂在CircleMovementTarget上的那个原始脚本半毛钱关系都没有。所以你调用increaseRadius()时,修改的是editProperties自己内部的orbitDistance值(这个值在编辑器面板里根本看不到,因为你没把这个子类的字段暴露出来),控制台输出的也是这个“分身”的数值,而真正控制轨道的CircleMovementTarget上的orbitDistance压根没被改动,编辑器面板和轨道运行逻辑自然不会同步。
正确的修复方法:直接引用目标脚本
别再用继承了,改成在editProperties里直接引用CircleMovementTarget上的OrbitFireball脚本就行:
修改后的editProperties代码:
using System.Collections; using System.Collections.Generic; using HoloToolkit.Unity.InputModule; using UnityEngine; public class editProperties : MonoBehaviour, IInputClickHandler { // 在编辑器里把挂了OrbitFireball的CircleMovementTarget拖到这里 public OrbitFireball targetOrbitScript; public void OnInputClicked(InputClickedEventData eventData) { if (gameObject.tag == "RadiusPlus" && targetOrbitScript != null) { targetOrbitScript.increaseRadius(); } } }
然后在Unity编辑器里做这一步:
- 选中
Radius (+)对象,找到editProperties组件,把CircleMovementTarget对象拖拽到targetOrbitScript字段上,完成引用关联。
这样点击Radius (+)时,就会直接调用CircleMovementTarget上的OrbitFireball的increaseRadius()方法,修改的是真正控制轨道的那个orbitDistance值,编辑器面板和运行时的轨道逻辑就会同步更新了。
另外提一句,你的orbitDistance已经是public字段了,Unity 2017里运行时修改这个值,编辑器面板会实时显示变化,但停止运行后会恢复到编辑模式的数值,如果需要保存修改可以考虑用PlayerPrefs做简单持久化。
内容的提问来源于stack exchange,提问作者Pratham Sehgal

