如何从类实例中读取静态属性?(基于Time类多态场景)
解决方案:通过接口抽象实现Time类的调试/发布切换
问题根源
你原来的思路走不通有两个核心原因:
- C#中静态成员属于类本身,不能通过实例对象访问,所以
timer.deltaTime会触发编译错误 - 静态成员不支持多态,你用
new关键字定义的TimeDebug.deltaTime只是隐藏了基类的静态成员,无法通过基类引用实现多态切换
正确实现方式
通过定义接口抽象时间提供逻辑,分别实现发布模式(包装Unity原生Time)和调试模式(返回固定值)的实现类,再通过接口参数实现多态传递。
1. 定义时间提供接口
public interface ITimeProvider { // 用实例属性替代静态属性,支持多态 float DeltaTime { get; } }
2. 实现发布模式的时间提供类
包装Unity原生的Time.deltaTime静态属性:
public class UnityTimeProvider : ITimeProvider { public float DeltaTime => UnityEngine.Time.deltaTime; }
3. 实现调试模式的时间提供类
返回固定的调试值:
public class DebugTimeProvider : ITimeProvider { public float DeltaTime => 0.2f; // 可自定义的固定调试值 }
4. 修改目标方法接收接口参数
void DoSomething(ITimeProvider timeProvider) { // 正常访问DeltaTime,支持多态 Debug.Log(timeProvider.DeltaTime); }
5. 根据编译模式切换调用
利用Unity的编译宏自动切换:
#if DEBUG DoSomething(new DebugTimeProvider()); #else DoSomething(new UnityTimeProvider()); #endif
扩展说明
如果需要使用Time类的其他属性(比如timeScale、fixedDeltaTime),只需在ITimeProvider接口中添加对应的属性定义,再在两个实现类中分别实现即可。
内容的提问来源于stack exchange,提问作者oscar
相关产品推荐
相关产品推荐

