实用的Delegate学习:
最好还是去看看原视频,地址在下面
文章来源地址:https://www.bilibili.com/video/av7554622?from=search&seid=13213488219183773854
首先来一个需求:想要获取游戏结束后的玩家的统计:需要最高分的玩家和被捕次数最多的玩家
一般的写法是这样的:
/// <summary>
/// 游戏结束时 获得想要的数据
/// </summary>
public void OnGameOver(PlayerStats[] allPlayerStats)
{
string bestKillName = this.GetPlayerName(allPlayerStats);
string bestFlagsCaptured = this.GetFlagsCaptured(allPlayerStats);
}
/// <summary>
/// 得到杀敌最多的人的名字
/// </summary>
private string GetPlayerName(PlayerStats[] allPlayer)
{
string name = "";
int bestScore = 0;
foreach (PlayerStats stats in allPlayer)
{
int score = stats.kills;
if (score > bestScore)
{
bestScore = score;
name = stats.name;
}
}
return name;
}
/// <summary>
/// 得到被捕次数最多的人的名字
/// </summary>
private string GetFlagsCaptured(PlayerStats[] allPlayer)
{
string name = "";
int bestScore = 0;
foreach (PlayerStats stats in allPlayer)
{
int score = stats.flagsCaptured;
if (score > bestScore)
{
bestScore = score;
name = stats.name;
}
}
return name;
}
使用委托后的写法是这样的:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 玩家信息保存
/// </summary>
public class PlayerStats
{
public string name;
public int kills;
public int deaths;
public int flagsCaptured; //被捕次数
}
public class MainScript {
//定义一个委托
delegate int WantGetSomething(PlayerStats stats);
/// <summary>
/// 游戏结束时 获得想要的数据
/// </summary>
/// <param name="allPlayerStats"></param>
public void OnGameOver(PlayerStats[] allPlayerStats)
{
string bestKillName = this.GetPlayerName(allPlayerStats, GetBestKill);
string bestFlagsCapturedName = this.GetPlayerName(allPlayerStats, GetBestFlags);
}
/// <summary>
/// 返回杀敌人数
/// </summary>
private int GetBestKill(PlayerStats stats)
{
return stats.kills;
}
/// <summary>
/// 返回被捕次数
/// </summary>
private int GetBestFlags(PlayerStats stats)
{
return stats.flagsCaptured;
}
/// <summary>
/// 得到杀敌最多的人的名字
/// </summary>
/// <param name="allPlayer"></param>
/// <returns></returns>
private string GetPlayerName(PlayerStats[] allPlayer, WantGetSomething wantGet)
{
string name = "";
int bestScore = 0;
foreach (PlayerStats stats in allPlayer)
{
int score = wantGet(stats);
if (score > bestScore)
{
bestScore = score;
name = stats.name;
}
}
return name;
}
}
总结:总的来说据一句话,将方法作为参数传递。。。。。。。。