C# 将事件作为参数传递的正确方法是什么?

C# 将事件作为参数传递的正确方法是什么?,c#,unity3d,C#,Unity3d,首先,我不知道我是否正确地陈述了这个问题。我将在下面解释我的情况。 我有一个方法: public void FocusTargetZoom(Transform target, float focusTime, float zoomFactorPercentage, OnStopFocusing onStopFocusing

首先,我不知道我是否正确地陈述了这个问题。我将在下面解释我的情况。 我有一个方法:

public void FocusTargetZoom(Transform target, 
                            float focusTime, 
                            float zoomFactorPercentage, 
                            OnStopFocusing onStopFocusing = null, 
                            bool lockMovement = true)
{
    if (lockMovement)
    {
        Character.Instance.LockMovement();
    }
    if(onStopFocusing != null)
    {
        //StopFocusing = onStopFocusing;
    }
    zoomFactor = initFOV * zoomFactorPercentage / 100f;

    FocusOnTarget(target, focusTime);
}
其中,
OnStopFocusing
是我的委托无效。此
FocusTargetZoom
方法将从任何其他对象调用,例如具有
OnTriggerEnter
OnTriggerExit
事件的对象。现在,我要做的是将OnTriggerExit事件传递给
FocusTargetZoom
方法,这样每当调用我的
OnTriggerExit
方法时,它都会停止缩放。基本上,计划是:

  • 从调用方调用FocusTargetZoom方法
  • 等待调用方执行某些操作并触发传递给方法的事件
  • 停止缩放

  • 但我不确定这是否是解决此类问题的正确方法。如果你有一些见解,请分享

    一个
    事件
    是发生的事情,触发了另一件事,倾听它。因此,
    事件
    有一个侦听器,而不是调用者

    这里使用的是
    操作
    (无效委托基本上是一个操作),而不是
    事件

    要获得所需的结果,您需要进行检查以查看您的目标是否仍然有效,因此您需要一个
    委托
    ,该委托返回一些内容(例如
    函数

    当我们有
    OnTriggerExit
    时,这个
    Func
    需要返回false 此外,您还需要将此
    Func
    传递给正在进行聚焦的方法(
    FocusOnTarget

        public void FocusTargetZoom(Transform target, float focusTime, float zoomFactorPercentage, Func<bool> whenToStopFunc, bool lockMovement = true)
        {
            if (lockMovement)
            {
                Character.Instance.LockMovement();
            }
    
            StopFocusing = whenToStopFunc;
    
            zoomFactor = initFOV * zoomFactorPercentage / 100f;
    
            FocusOnTarget(target, focusTime, whenToStopFunc);
        }
    
    
    private void FocusOnTarget(Transform target, float focusTime, Func<bool> whenToStopFunc)
    {
           while(notYetFocused)
           {
               if(whenToStopFunc != null && !whenToStopFunc())
               { KeepFocusing(); }
           }
    }
    
    public void Caller : MonoBehaviour
    {
         bool isSelected = false;
    
         void IsThisSelected() => isSelected;
    
         private CallTheFocus() => _focusClass.FocusTargetZoom(transform, 1f, 1f, IsThisSelected);
    
         private void OnTriggerEnter() => isSelected = true;
         private void OnTriggerExit() => isSelected = false;
    
    }