C#报错CS0236:字段初始化器无法引用非静态成员的解决求助
问题解决方法
错误原因
你遇到的错误是因为字段初始化器不能在类实例化阶段引用非静态成员。highestPlayerPoint作为字段,在类对象创建时就会执行初始化,但此时highestPoint还未完成初始化,因此编译器报错。
解决方案
要让highestPlayerPoint始终同步highestPoint的取整值,推荐两种简单可行的方式:
方式1:使用计算属性
把highestPlayerPoint改成计算属性,每次访问时自动计算取整后的值:
using UnityEngine.SceneManagement; public class scoreKeepScript : MonoBehaviour { public float highestPoint; public GameObject playerObject; public float currentPosition; public float maxLow = 50; // 计算属性,每次访问都会返回highestPoint的最新取整值 public int highestPlayerPoint => Mathf.RoundToInt(highestPoint); void Update() { currentPosition = playerObject.transform.position.y; if (currentPosition > highestPoint) { highestPoint = currentPosition; } else if (currentPosition < highestPoint - maxLow) { Debug.Log("dede"); SceneManager.LoadScene(SceneManager.GetActiveScene().name); } } }
注:使用Unity内置的Mathf.RoundToInt比C#原生Math.Round更适配Unity数值处理,直接返回整数类型。
方式2:在Update中同步更新
如果需要highestPlayerPoint作为可存储的字段,就在每次highestPoint更新时同步修改它:
using UnityEngine.SceneManagement; public class scoreKeepScript : MonoBehaviour { public float highestPoint; public GameObject playerObject; public float currentPosition; public float maxLow = 50; public int highestPlayerPoint; void Start() { // 初始化时同步一次取整值 highestPlayerPoint = Mathf.RoundToInt(highestPoint); } void Update() { currentPosition = playerObject.transform.position.y; if (currentPosition > highestPoint) { highestPoint = currentPosition; // 每次highestPoint更新时同步取整 highestPlayerPoint = Mathf.RoundToInt(highestPoint); } else if (currentPosition < highestPoint - maxLow) { Debug.Log("dede"); SceneManager.LoadScene(SceneManager.GetActiveScene().name); } } }
额外提示
- 必须在代码顶部添加
using UnityEngine.SceneManagement;,否则SceneManager会报错。 - 字段命名建议遵循C#大驼峰规范(如
HighestPoint、PlayerObject),提升代码可读性。
内容的提问来源于stack exchange,提问作者Jildert Meijer
相关产品推荐
相关产品推荐

