Unity 脚本中公共变量初始化值修改后,为啥Inpector面板的对应变量属性不更新?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity 脚本中公共变量初始化值修改后,为啥Inpector面板的对应变量属性不更新?相关的知识,希望对你有一定的参考价值。

刚刚开始学习U3D,第一天.
学习用球撞击墙的脚本, 我写好脚本后,将其作为控件添加至摄像机. 公共变量被自动识别出来. 后来我觉得发射速度慢了就去直接修改脚本中公共变量的值, 保存重新运行游戏,发现该值并不会更新到Inspector面板对应属性上.(只有第一次添加脚本至该游戏对象才显示.) 这种现象是正常的吗?
而且我在声明时赋值,运行一次游戏后,再在脚本中改变这个赋值再运行游戏, 游戏并不会更新数据,依旧以未更新的面板数值为基准. 正常吗?
如果这种现象是正常的话,那是否公共变量的初始化都不应该放在外面 而应该放在Start()里面了.
那Inspector的对应属性面板不是没啥用途?.....

还有一个问题就是...无论用mono还是VS..代码只有提示...没有说明文字,这个正常吗?

下面是主要代码:
public class Shooter : MonoBehaviour
//param
public Rigidbody bullet; //刚体,保存我们对创造的物体的引用
public float power = 6000f; //射击力度 ---改变这个后,Inspector对应属性不会更新改变.....
public float moveSpeed = 2f; //方向键移动屏幕的速度
// Use this for initialization
void Start ()
power = 6000f;


// Update is called once per frame
void Update ()
float h = Input.GetAxis("Horizontal") * Time.deltaTime * moveSpeed;
float v = Input.GetAxis("Vertical") * Time.deltaTime * moveSpeed;
transform.Translate(h, v, 0);
if(Input.GetButtonUp("Fire1"))

Rigidbody instance = Instantiate(bullet, transform.position, transform.rotation) as Rigidbody;
Vector3 fwd = transform.TransformDirection(Vector3.forward);
instance.AddForce(fwd * power);



=======================================
比如上述代码: public float power = 6000f; 如果这个赋值是在声明时赋值的, 也就不是放在任何函数中重新赋值的话, 无论如果在编辑器中修改这个值, 并运行多少次, Inspector面板中的对应属性仅仅显示你在第一次添加这个脚本时, 所识别出来的第一个值(比如说此时是6000f, 添加后面板中显示是6000f, 然后我通过编辑器修改6000f 至1000f, 再运行程序, 发现面板中始终是6000f,并不会同步更新, 你试试你的是否也是这样.)
上例中我之所以放在start中,是因为,在重新运行程序的时候,只有这种方法可以确保自己的修改值被应用. 再不就只能在面板中手动输入修改值了.

首先确认在inspector面板修改数值时 必须是非调试状态。
在调试中修改会影响运行时逻辑。但结束调试后所有改动会恢复到之前的状态
一切赋值以编辑器中为准。即如果在脚本中有初值,并且在编辑器做了更改,运行时是以编辑器再动态赋值一遍的。
另外你的代码中,声明赋值后,start中不用再赋值了追问

这里有个问题是 在理论上我也认为应该是 "运行时是以编辑器再动态赋值一遍的".
但是我用的时候发现, 并不是这样的.
由于字数限制 我只能在补充问题里面描述了

参考技术A 之前我也遇到了,百思不得其解,后来发现要在Inspector面板,脚本选项里选择Reset,然后值就会变了!瞬间觉得好坑。。。。

为啥具有相同值的变量在 Python 中具有公共 ID? [复制]

【中文标题】为啥具有相同值的变量在 Python 中具有公共 ID? [复制]【英文标题】:Why variables holding same value has the common ID in Python? [duplicate]为什么具有相同值的变量在 Python 中具有公共 ID? [复制] 【发布时间】:2016-01-03 05:42:24 【问题描述】:

在 Python 中:

>>> a = "Hello"
>>> b = "Hello"
>>> id(a) == id(b)
True

为什么?这会在引用对象内存位置的复杂程序中产生问题吗?

【问题讨论】:

在 Python 中,您通常不会“引用内存位置” - 字符串是不可变的,因此 equal 字符串(相同的字符以相同的顺序)也可能是 identical (相同的确切对象)并不重要。当您在生产代码中依赖 str_a is str_b 而您真正的意思是 str_a == str_b 时,问题就来了,因为虽然相同的字符串必然相等,但不能保证相反。 您看到的是字符串实习,***.com/questions/28329498/…,您的示例将因a = "$foo"b = "$foo" 而失败,cpython 将实习任何由任何字母、下划线和数字组成的字符串,所以因为$被使用的字符串不会被迭代,它绝对不是依赖的东西 【参考方案1】:

来自the Python documentation

对于不可变类型[如字符串],计算新的操作 values 实际上可能返回对任何现有对象的引用 相同的类型和值。例如,在 a = 1; b = 1ab 之后可能或 可能不会引用值为 1 的同一对象,具体取决于 实施...

【讨论】:

字符串不是由数字、字母或下划线组成的,除非您执行a, b = "$foo", "$foo" 或字符串在函数中,否则不会被保留。 a = "$foo" 和 b = "$foo" 在解释器中不会返回相同的 id。在 cpython 中,小整数被缓存,因此它们总是具有相同的 id 您还需要解决这是否会在引用对象的内存位置的复杂程序中产生问题

以上是关于Unity 脚本中公共变量初始化值修改后,为啥Inpector面板的对应变量属性不更新?的主要内容,如果未能解决你的问题,请参考以下文章

unity3d 有个官方的车的例子 速度为啥乘2.23693629?

自定义修改Unity脚本模板

Unity脚本类为啥要尽量避免继承MonoBehaviour类

为啥具有相同值的变量在 Python 中具有公共 ID? [复制]

Unity脚本类为啥要尽量避免继承MonoBehaviour类

unity为啥不能加载脚本