unity的public在属性面板修改的实时性

本文通过一个具体的Unity示例,介绍了如何使用公共变量并在属性面板中进行实时更新,展示了如何通过代码设置对象颜色和显示文字,并解释了属性面板修改对游戏对象的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

unity的公共变量是会出现在属性面板的。今发现,面板中对公共变量的改动会是实时的改动。好深奥的说法,是不是没有理解。好吧,来个例子就明白了。


例如场景中放一个cube,进行两个测试,一个是改变整个cube的颜色,另一个就是写一个字符串。过一会这两个都要在属性面板进行。


写上一段代码并且绑定到cube上。代码如下:


[csharp]  view plain  copy
  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. public class testdevice : MonoBehaviour {  
  5.     public string word = "我哒哒的马蹄是个美丽的错误";  
  6.     public Color changecolor=Color.blue;  
  7.     // Use this for initialization  
  8.     void Start () {  
  9.         this.GetComponent<MeshRenderer>().material.color=changecolor;  
  10.     }  
  11.       
  12.     // Update is called once per frame  
  13.     void Update () {  
  14.         if (Input.GetMouseButton(0))  
  15.         {  
  16.               
  17.             this.GetComponent<MeshRenderer>().material.color = changecolor;  
  18.             Debug.Log(word);  
  19.         }  
  20.     }  
  21. }  


绑定好之后看看我们的属性面板,如下图:



运行之后,颜色会是蓝色,这也正是我们定义的颜色。如图:


然后点击鼠标左键,会看到出现了log文字,这些文字也是我们代码中的文字完全一样:



---------------------------------------------至此都是我们没有在属性面板修改的东西----------接下来要进行修改来了--------------------------------------


在非运行状态下对颜色和文字进行修改:




艺星整形 http://www.iyestar.com/

然后进行运行看到颜色的初始化已经被修改了,这时文字也被修改了只是还么有看到,如下图:




接下来点击一下看文字也被修改了,说明我们在属性面板的修改会修改我们初始化的内容

### Unity Inspector 面板不实时刷新的解决方案 在开发过程中,如果发现 Unity 的 Inspector 面板无法及时刷新显示数据的变化,可以尝试以下几种方法来解决问题。 #### 方法一:强制触发界面更新 可以通过调用 `Repaint` 或者 `EditorUtility.SetDirty` 来手动通知编辑器重新绘制或保存更改的内容。例如,在自定义的 `OnInspectorGUI` 中加入以下逻辑: ```csharp public override void OnInspectorGUI() { serializedObject.Update(); EditorGUILayout.PropertyField(serializedObject.FindProperty("yourPropertyName"), true); if (GUILayout.Button("Force Update")) { Repaint(); // 强制刷新当前窗口 EditorUtility.SetDirty(target); // 设置目标对象为脏态,标记其需要被保存 } serializedObject.ApplyModifiedProperties(); } ``` 这种方法适用于当某些操作完成后需要立即看到变化的情况[^1]。 #### 方法二:确保属性正确声明 对于那些希望能够在运行时以及编辑状态下都能正常工作的变量,应该考虑将其设为 `[SerializeField] private` 类型而非完全私有或者仅公开而不加以修饰符控制访问权限的方式。这样做既保留了封装性又允许编辑器读取该字段的信息用于展示目的[^5]。 另外需要注意的是,如果你正在处理的是某种复杂的数据结构比如列表数组之类的复合类型,则可能还需要额外实现一些辅助函数来进行深拷贝或者其他必要的初始化工作以防浅复制带来的同步问题影响到最终呈现效果。 #### 方法三:调整项目配置与清理缓存 有时候即使上述代码层面都没有明显错误仍然会出现异常行为,这时候可以从外部环境角度出发排查原因: - 检查是否存在重复导入相同命名空间下的不同版本库文件造成冲突; - 删除不必要的依赖项减少干扰因素; - 清理构建产物及相关临时目录如Library/Caches等位置内的旧记录有助于恢复正常的交互体验[^3]; 最后记得重启IDE让改动生效后再测试一遍看看是否解决了原有难题。 --- ### 示例代码片段 下面给出一段简单的例子演示如何利用按钮点击事件触发表单重绘过程从而达到即时反馈的目的: ```csharp using UnityEditor; using UnityEngine; [CustomEditor(typeof(MyTarget))] public class MyTargetEditor : Editor { public override void OnInspectorGUI () { DrawDefaultInspector(); MyTarget myTarget = (MyTarget)target; if(GUILayout.Button("Update Value")){ myTarget.someValue += 10f; Debug.Log($"Updated value to {myTarget.someValue}"); this.Repaint(); EditorUtility.SetDirty(myTarget); } } } [System.Serializable] public class MyTarget : MonoBehaviour { public float someValue=0f; } ``` 此段程序展示了通过增加数值的方式来模拟实际应用中的动态变更场景,并且每次按下按键之后都会立刻反映至界面上供开发者观察验证结果准确性[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值