You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 10:00:24