C#事件开发难题:对峙模拟程序中敌人瞄准触发事件实现
针对对峙模拟游戏中瞄准触发信任调整的实现建议
嘿,你已经迈出了用事件驱动来处理瞄准逻辑的关键一步!我来帮你把这个功能补全并优化,让它更健壮、更贴合你的需求~
首先,先把你给出的Enemy类代码补全并修正一些细节:
// 假设你已定义信任属性,示例初始值设为50 public float TrustLevel { get; set; } = 50f; public event EventHandler RexAim; // 线程安全的事件触发方法(推荐写法) protected virtual void OnRexAim(EventArgs e) { // 用空条件运算符避免多线程下的空引用问题 RexAim?.Invoke(this, e); } // 完善瞄准方法,接收目标对象参数 public void RexAimAt(object target) { // 替换成你的实际瞄准判断逻辑,比如是否锁定目标 bool isAimingSuccessfully = true; if (isAimingSuccessfully) { Console.WriteLine("Rex has aimed at a target!"); // 触发瞄准事件 OnRexAim(EventArgs.Empty); } }
进阶优化:传递瞄准目标信息
如果你的信任调整逻辑需要知道瞄准的具体对象,可以自定义EventArgs类来传递额外数据:
// 自定义瞄准事件参数,携带目标信息 public class RexAimEventArgs : EventArgs { public object Target { get; } public RexAimEventArgs(object target) { Target = target; } } // 更新Enemy类中的事件和触发方法 public event EventHandler<RexAimEventArgs> RexAim; protected virtual void OnRexAim(RexAimEventArgs e) { RexAim?.Invoke(this, e); } public void RexAimAt(object target) { bool isAimingSuccessfully = true; if (isAimingSuccessfully) { Console.WriteLine($"Rex has aimed at {target}!"); // 传递目标信息触发事件 OnRexAim(new RexAimEventArgs(target)); } }
订阅事件并调整信任属性
接下来,在需要处理信任调整的地方(比如游戏管理器、目标对象本身)订阅这个事件:
// 示例:初始化敌人实例并订阅事件 var enemyRex = new Enemy(); var targetEnemy = new Enemy(); // 订阅Rex的瞄准事件,触发时调整目标的信任值 enemyRex.RexAim += (sender, e) => { // 若使用自定义EventArgs,可直接获取目标对象 var target = e.Target as Enemy; if (target != null) { target.TrustLevel -= 10f; // 瞄准一次,信任值降低10 Console.WriteLine($"Target's trust level is now {target.TrustLevel}"); } }; // 调用瞄准方法触发事件 enemyRex.RexAimAt(targetEnemy);
关键注意点
- 事件触发方法
OnRexAim建议设为protected virtual,方便子类重写扩展逻辑。 - 使用
?.Invoke是C# 6+的语法,能避免多线程环境下“判断事件非空后,事件被突然注销”导致的空引用异常。 - 自定义EventArgs可以让事件传递更多业务数据,让你的逻辑更灵活。
内容的提问来源于stack exchange,提问作者Kurtillius
相关产品推荐
相关产品推荐

