unity System.Action 回调
在项目开发过程中,有时会需要使用 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 类包含了两个日期属性 Date1 和 Date2,以及一个 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 回调。