unity开发蝴蝶游戏之使用labmda表达式

可以使用 LINQ 中的 Zip 方法结合 Lambda 表达式来完成类似的操作。假设 cellList 是一个 Cell 组件数组,每个 Cell 组件包含一个 IsLight 属性,而 GameManager.Instance.cellInputs 是一个布尔值列表,表示输入值。你可以这样重写为 Lambda 表达式:

cellList.Zip(GameManager.Instance.cellInputs, (cell, input) => {
    cell.GetComponent<Cell>().IsLight = input;
    return cell;
}).ToList();

csharp复制代码

这段代码会遍历 cellList 数组和 GameManager.Instance.cellInputs 列表,并对每一对元素执行相应的操作。Lambda 表达式中的 (cell, input) 部分表示参数列表,其中 cell 表示 cellList 中的每个元素,而 input 表示 GameManager.Instance.cellInputs 中对应位置的布尔值。Lambda 表达式的方法体 { ... } 包含了具体的操作,将 input 的值赋给了 cell.GetComponent<Cell>().IsLight 属性。

示例:

        //use lambda
        cellList.Zip(cellList, (cell, input) =>
        {
            cell.GetComponent<Cell>().IsLight = input;
            return cell;
        }).ToList();

    private void SaveInput(ref List<bool> copys)
    {
        copys.Clear();
        var lists = cellList.Select(cell => cell.GetComponent<Cell>().IsLight).ToList();
        copys = new List<bool>(lists);
    }

为list赋值

赋值

你可以使用 LINQ 中的 Select 方法结合 Lambda 表达式来快速赋值 cellInputs 列表为 true。这里假设 cellInputs 是一个名为 cellInputs 的 List<bool> 类型的成员变量。你可以这样写:

using System.Linq;

// 假设 cellInputs 是一个 List<bool> 类型的成员变量
cellInputs = cellInputs.Select(_ => true).ToList();

csharp复制代码

在这个示例中,Select 方法遍历了 cellInputs 列表中的每个元素,并对每个元素执行 Lambda 表达式中的操作。Lambda 表达式 (_) => true 中的 _ 表示列表中的每个元素,而方法体 true 则表示将每个元素赋值为 true。最后,通过 ToList() 方法将得到的结果转换为列表并赋值给 cellInputs

初始化并赋值

你可以在声明列表时进行初始化,并使用 LINQ 中的 Select 方法结合 Lambda 表达式来进行赋值。这样可以将初始化和赋值合并到一行代码中。以下是一个示例:

using System.Linq;

// 假设 cellInputs 是一个 List<bool> 类型的成员变量
cellInputs = Enumerable.Range(0, 9).Select(_ => true).ToList();

csharp复制代码

在这个示例中,Enumerable.Range(0, 9) 创建了一个包含了从 0 到 8 的整数序列。然后,Select 方法遍历了这个序列中的每个元素(在这里我们用 _ 表示),并对每个元素执行 Lambda 表达式中的操作,将其赋值为 true。最后,通过 ToList() 方法将得到的结果转换为列表并赋值给 cellInputs

##运用

// 使用LINQ和Lambda表达式将子物体的GameObject合成一个列表

childObjects = parentTransform.Cast<Transform>() .Select(childTransform => childTransform.gameObject) .ToList();

获取所有含有某个component的子物体

//这里我使用Cell做示范(自己编写的一个类)

    public void LoadData()
    {
        //cellList = new GameObject[]();
        cellList = transform.GetComponentsInChildren<Transform>().Where(child => child.GetComponent<Cell>() != null).Select(_=>_.gameObject).ToArray();
        Debug.Log(cellList.Length);
     // Cast<GameObject>().Select(child=>child.gameObject).ToList();
        //use lambda
        cellList.Zip(GameManager.Instance.cellInputs, (cell, input) =>
        {
            cell.GetComponent<Cell>().IsLight = input;
            return cell;
        }).ToList();
        selectList = new List<int>(GameManager.Instance.selectList);
        Select();
    }

想要添加便捷操作,不用每次得解锁关卡才能执行某种操作

如果您希望在 Unity 编辑器中修改 isFinish 属性时也能触发相应的操作,您可以使用 Unity 提供的 OnValidate() 方法。OnValidate() 方法在编辑器中修改了任何检视面板属性时都会被调用。以下是如何在 OnValidate() 方法中执行相应操作的示例

// 在 Unity 编辑器中修改任何检视面板属性时都会调用该方法

private void OnValidate() {

// 当在编辑器中将 isFinished 设置为 true 时,执行相应操作

if (_isFinished) {

ExecuteSomeMethod();

}

}

无法out 属性

  • 17
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值