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

问题描述 投票:1回答:1

首先,我不知道我说的问题是否正确。下面我将试着解释一下我的情况,我有一个方法。

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 方法将从任何其他对象中被调用,例如,一个对象,他有 OnTriggerEnterOnTriggerExit 事件。现在,我想做的是 传递OnTriggerExit事件FocusTargetZoom 方法,所以只要我的 OnTriggerExit 方法将被调用,它将停止缩放。基本上,计划是

  1. 调用 FocusTargetZoom 方法从 来电者;
  2. 等到 来电者 做某事并触发传递给该方法的事件。
  3. 停止缩放。

然而我不知道这种问题的方法是否正确。如果你有一些见解,请与我分享

c# unity3d
1个回答
1
投票

一个 event 是发生和 触发器 别的 听力 到它。所以一个 event 拥有 听众 而非 来电者.

你使用的是 Action 在这里(一个void委托基本上是一个Action),而不是一个 event.

为了达到您想要的效果,您需要一个 核对 看看你的目标是否仍然有效,所以你需要一个 delegate 的东西(如 Func<bool>).

Func<bool>的时候,需要返回false。OnTriggerExit. 另外,你需要通过这个 Func<bool> 对正在进行聚焦的方法(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(); }
       }
}

而调用者MonoBehaviour要求是这样的。

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;

}
© www.soinside.com 2019 - 2024. All rights reserved.