如何在C#中将函数作为参数传递?代码改写求助
Unity C# 正确传递函数参数的写法
你代码里的function f是错误的,C#里没有这种语法。要传递无参数、无返回值的函数,直接用Action委托就行(记得引用System命名空间)。修改后的函数定义如下:
using System; // 必须加这个才能使用Action void AvoidSpawn(float sRate, Action f) { // 注意:这里的calculateRate是局部变量,每次调用都会重置成0,逻辑有问题,后面说怎么改 float calculateRate = 0; if(Time.time >= calculateRate) { f(); // 调用传入的函数 calculateRate = Time.time + sRate; // 你原来写的spawnRate应该是参数sRate吧?这里改过来 } }
怎么调用这个函数?
两种常见方式:
1. 传递现成的方法
先写一个符合无参无返回要求的方法,直接传方法名就行:
// 先定义一个要执行的方法 void SpawnEnemy() { Debug.Log("生成敌人"); } // 调用AvoidSpawn,间隔2秒执行一次 AvoidSpawn(2f, SpawnEnemy);
2. 传递lambda表达式
如果只是临时写一段逻辑,直接用lambda更方便:
AvoidSpawn(2f, () => { Debug.Log("执行自定义逻辑"); // 这里写你要触发的代码 });
顺便修复你的逻辑bug
原代码里calculateRate是局部变量,每次调用AvoidSpawn都会被重置为0,结果就是每次调用都会触发f(),完全起不到间隔执行的作用。得把它改成类的成员变量,比如:
using System; using UnityEngine; public class YourSpawnScript : MonoBehaviour { private float calculateRate = 0; // 成员变量,不会每次调用重置 void Update() { // 在Update里每帧检查,实现定时触发 AvoidSpawn(2f, SpawnEnemy); } void AvoidSpawn(float sRate, Action f) { if(Time.time >= calculateRate) { f(); calculateRate = Time.time + sRate; } } void SpawnEnemy() { Debug.Log("生成敌人"); } }
要是你需要传递带参数的函数,就用Action<T>、Action<T1,T2>这种泛型委托;如果函数有返回值,就用Func<TResult>、Func<T,TResult>这类,用法差不多。
内容的提问来源于stack exchange,提问作者Tiến Hưng
相关产品推荐
相关产品推荐

