Unity 2D平台项目中C# Get Accessor替代if语句的用法问询
关于Unity玩家对象中
heightHalf属性的疑问解答 首先给你一个肯定的答复:你的理解完全正确!heightHalf的作用就是你描述的那样:当玩家处于跳跃(jumped)或滚动(rolling)状态时,返回ballHeight / 2f;否则返回standingHeight / 2f。
接下来拆解你剩下的两个问题:
1. 这个变量是“根据两种结果赋值”吗?
其实严格来说,它并不是一个“被赋值”的变量——这是一个只读属性(只有get访问器,没有set)。它不会存储一个固定的数值,而是每次你访问heightHalf的时候,都会实时执行一遍里面的判断逻辑,返回当前状态对应的结果。比如玩家刚从跳跃落地,jumped变成false,下一次调用heightHalf时,就会自动返回standingHeight/2f,完全不用手动去更新它。
2. 为什么要用Get Accessor而不是直接用if语句赋值?
如果换成你写的那种直接赋值的方式,heightHalf就变成了一个普通的字段,只有在你主动执行那段if代码的时候才会更新。但玩家的状态是动态变化的:
- 比如玩家突然触发滚动动作,
rolling变成true,如果没及时执行那段if代码,heightHalf还是之前的站立半高,会导致碰撞检测、物理交互等逻辑出错; - 又或者玩家跳跃落地后
jumped变回false,如果没重新赋值,heightHalf还停留在球型半高,同样会出问题。
而用get访问器的好处就很明显了:
- 实时同步状态:每次用到这个值时,都会自动检查当前的
rolling和jumped状态,返回最准确的结果,永远不会和玩家状态脱节; - 封装逻辑:把计算规则藏在属性内部,外部代码只需要用
heightHalf就行,不用关心它的计算逻辑。以后如果要加新状态(比如蹲下crouching),只需要修改这个属性的判断逻辑,不用改所有用到这个值的地方; - 避免意外修改:因为只有
get没有set,外部代码没办法直接给heightHalf赋值,保证了这个值的逻辑永远由玩家状态决定,不会被误操作篡改。
内容的提问来源于stack exchange,提问作者segasega89
相关产品推荐
相关产品推荐

