unity System.Action 回调

2015年01月23日 11:36 0 点赞 0 评论 更新于 2025-11-21 15:11

在项目开发过程中,有时会需要使用 Unity 中的 System.Action 回调机制。下面将为大家展示相关实现代码,仅供参考交流。

代码实现

数据类 Data

以下是定义的 Data 类,该类用于管理日期数据,并在数据发生变化时触发回调。

using UnityEngine;

namespace Liulala.Project
{
public class Data
{
// 定义一个带有两个 int 类型参数的 System.Action 委托
public System.Action<int, int> OnDateChange;
// 日期 1 属性,只读
public int Date1 { get; private set; }
// 日期 2 属性,只读
public int Date2 { get; private set; }

// 设置日期数据的方法
public void SetData(int date)
{
Date1 = date;
Date2 = _dateStart + date;
// 将 Date2 存储到 PlayerPrefs 中
PlayerPrefs.SetInt(NewDate, Date2);
// 触发日期变化回调
OnDateChange?.Invoke(Date1, Date2);
}

// 构造函数
public Data()
{
// 从 PlayerPrefs 中获取 Date2 的值
Date2 = PlayerPrefs.GetInt(NewDate);
_dateStart = Date2;
Date1 = 0;
// 为 OnDateChange 委托添加一个空的匿名方法,避免空引用异常
OnDateChange += (date1, date2) => { };
}

// 起始日期的私有字段
private int _dateStart;
// 存储在 PlayerPrefs 中的键名,静态只读
private static readonly string NewDate = "Date2";
}
}

在上述代码中,Data 类包含了两个日期属性 Date1Date2,以及一个 System.Action<int, int> 类型的委托 OnDateChange。当调用 SetData 方法时,会更新日期数据并触发 OnDateChange 回调。构造函数会从 PlayerPrefs 中读取初始的 Date2 值,并为 OnDateChange 委托添加一个空的匿名方法,以避免空引用异常。

游戏类 Game

以下是 Game 类的代码,该类继承自 MonoBehaviour,用于在游戏中使用 Data 类。

using Liulala.Project;
using UnityEngine;

public class Game : MonoBehaviour
{
// 存储 Data 类的实例
private Data _Data;

// 游戏开始时调用的方法
private void Start()
{
_Data = new Data();
// 为 OnDateChange 委托添加 ChangeView 方法
_Data.OnDateChange += (date1, date2) => ChangeView(date1, date2);
}

// 处理日期变化的方法
private void ChangeView(int date1, int date2)
{
// 这里可以添加处理日期变化的逻辑
}
}

Game 类中,Start 方法会创建一个 Data 类的实例,并为 OnDateChange 委托添加 ChangeView 方法。当 Data 类中的日期数据发生变化时,ChangeView 方法会被调用。

注意事项

  • Game 类中,为 OnDateChange 委托添加方法时,需要注意方法的参数类型和数量要与委托定义一致。原代码中 _Data.OnDateChange += ChangeView(); 存在错误,因为 ChangeView 方法没有参数,而 OnDateChange 委托需要两个 int 类型的参数,所以修改为 _Data.OnDateChange += (date1, date2) => ChangeView(date1, date2);
  • Data 类的 SetData 方法中,调用 OnDateChange 时使用了空条件运算符 ?.,这可以避免在 OnDateChange 委托为空时引发空引用异常。

通过上述代码,我们可以在 Unity 项目中使用 System.Action 回调机制来处理数据变化。希望这些代码能帮助你理解和应用 System.Action 回调。

作者信息

feifeila

feifeila

共发布了 3994 篇文章