5年了,这5年你知道我怎么过的吗,而你还在开发飞行棋
经验:未知
个别模块优化(如果你的项目已经有几百几千个 MonsterSystem.Instance ,那以下内容对你毫无帮助) 是有可能,有亿点点做用
cs
public class PopupTextPanel : BasePanel
{
[Header("需要带 UIPopupText")]
public GameObject PopupTextPrefab;
private void OnEnable()
{
MonsterSystem.Instance.OnMonsterTakeDamage += OnMonsterTakeDamage;
}
假如你有一点点Unity,你可能觉得,可以写在Start 方法内
cs
void Start()
{
}
但很快你会发现没用,所以
改一下
改成回调
内核就是Unity 的基础知识,和C# 的回调
cs
public class PopupTextPanel : BasePanel
{
[Header("需要带 UIPopupText")]
public GameObject PopupTextPrefab;
private void OnEnable()
{
//MonsterSystem.Instance.OnMonsterTakeDamage += OnMonsterTakeDamage;
ArpgFacade.RegisterMonsterTakeDamage(OnMonsterTakeDamage);
}
private void OnDisable()
{
//MonsterSystem.Instance.OnMonsterTakeDamage -= OnMonsterTakeDamage;
ArpgFacade.UnregisterMonsterTakeDamage(OnMonsterTakeDamage);
}
cs
//ArpgFacade.cs
//
#region 先缓存注册
public static event Action<MonsterCtrl, double, bool> OnMonsterTakeDamage;
public static void RegisterMonsterTakeDamage(Action<MonsterCtrl, double, bool> callback)
{
OnMonsterTakeDamage += callback;
}
public static void UnregisterMonsterTakeDamage(Action<MonsterCtrl, double, bool> callback)
{
OnMonsterTakeDamage -= callback;
}
#endregion
/// <summary>
/// 把 Facade 缓存的订阅者同步到 MonsterSystem
/// </summary>
public static void FlushToMonsterSystem()
{
if (OnMonsterTakeDamage == null) return;
foreach (var d in OnMonsterTakeDamage.GetInvocationList())
{
var cb = (Action<MonsterCtrl, double, bool>)d;
MonsterSystem.Instance.OnMonsterTakeDamage += cb;
}
}
但其实重点就只要一个
cs
public event Action<MonsterCtrl, double, bool> OnMonsterTakeDamage;
// public delegate void OnMonsterTakeDamageDel(MonsterCtrl monsterCtrl, double damage, bool isCrit);
// public event OnMonsterTakeDamageDel OnMonsterTakeDamage;
用Action 替换掉 delegate , Unity已经替我们优化,或者最新的C#,同样作用的两个代码,一个delegate 是强行强命名写法,一个是灵活调用,关键是能实现平替
经验:大一新生

飞行棋之简单框架---游戏头和初始化地图_谷艳爽faye的博客-CSDN博客
经验:1~2年

C#---飞行棋超全总结(全注释版)_c#飞行棋_刘爽-zjy的博客-CSDN博客
3~5年

10年以上
简单的JS鸿蒙小游戏---飞行棋之游戏逻辑-小游戏飞行棋开始玩

