Unity/C#中If语句始终为true的问题排查求助
问题描述
原本计划基于working布尔值与按键输入编写条件判断,却发现所有If语句始终返回true。尝试了多种条件:
- 基于float变量(如示例中的
speed >= 500f) - 基于布尔值
- 基于碰撞检测
均出现同样问题,即使移除speed的public修饰符也无法解决。附上完整代码,请求排查原因。
完整代码
using System.Collections; using System.Collections.Generic; using UnityEngine; public class player : MonoBehaviour { float speed; bool working = false; // Start is called before the first frame update void Start() { speed = 3f; } // Update is called once per frame void Update() { Vector3 playerInput = new Vector3(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical"), 0); transform.position = transform.position + playerInput.normalized * speed * Time.deltaTime; if(speed >= 500f) { print("test"); } } /*void OnTriggerEnter2D(Collider2D other) { if(other.tag == "Skill") { //skilling = true; } else skilling = false; }*/ }
问题原因排查与解决
从给出的代码来看,speed初始值设为3f,且没有任何逻辑修改它的值,理论上speed >=500f不可能为true。出现你描述的问题,大概率是以下原因:
Inspector面板数值覆盖
- 如果之前
speed是public修饰符时,你在Unity Inspector面板中给它设置过≥500的数值,即使后来改成private,Unity的序列化缓存可能会保留这个值,覆盖Start()里的初始赋值。 - 解决:选中挂载
player脚本的对象,临时给speed加上[SerializeField]让它在Inspector显示,右键变量选择Reset,或者删除场景/预制体中该对象的序列化数据后重新挂载脚本。
- 如果之前
运行时意外修改数值
- 测试过程中可能不小心在Unity的Console面板、运行时模式的Inspector面板中修改了
speed的数值,导致它≥500。 - 解决:停止运行后重新启动Play模式,或者在
Update()开头加一行Debug.Log(speed),实时查看speed的实际值,确认是否被意外修改。
- 测试过程中可能不小心在Unity的Console面板、运行时模式的Inspector面板中修改了
Unity编译缓存问题
- 有时候Unity的编译不彻底,旧的代码逻辑(比如之前有自动增加
speed的代码)没有被替换,导致speed不断变大。 - 解决:点击Unity顶部菜单栏的Assets → Reimport All,或者删除项目的
Library文件夹后重新打开项目(注意备份),强制重新编译所有代码。
- 有时候Unity的编译不彻底,旧的代码逻辑(比如之前有自动增加
代码逻辑遗漏
- 你提到的
working布尔值、按键输入相关的逻辑在当前代码中没有体现,可能之前的代码中有修改speed或working的逻辑,现在被删除或注释,但残留的逻辑仍在生效。 - 解决:检查项目中是否有其他脚本修改了该对象的
speed变量,或者恢复之前的完整代码片段进行排查。
- 你提到的
内容的提问来源于stack exchange,提问作者PapaNoahh
相关产品推荐
相关产品推荐

