Verwenden Sie asynchrones WhenAny in Unity, um Folgendes zu erreichen: Wenn Sie auf einen beliebigen Teil der Schaufel klicken, heben Sie die gesamte Schaufel auf

1. Die Zusammensetzung der Schaufel

Die Schaufel besteht aus vielen Teilen. Wenn Sie die Schaufel aufheben, klicken Sie einfach auf ein beliebiges Teil der Schaufel.
Klicken Sie wie in der Abbildung gezeigt auf [Holzgriff], [Mutter], [Schaufel], um das Objekt aufzuheben.
Bitte fügen Sie eine Bildbeschreibung hinzu
(1) Hervorhebung einschalten
(2) Warten, bis die Erdschaufel angeklickt wird: jeder Teil kann angeklickt werden
(3) Hervorhebung ausschalten und Erdschaufel wegnehmen

Zweitens die Idee der Verwirklichung

Asynchron implementiert: Warten Sie, bis ein beliebiges Widget angeklickt wird

  • 1. Der Schlüsselcode von whenAny: Warten Sie, bis auf eine beliebige Unterkomponente geklickt wird.
    Achten Sie darauf, wie Sie eine Aufgabenliste mit select umschließen
var allTasks = mamoty.GetComponentsInChildren<Transform>().Select(t => t.gameObject.OnClickAsync());
await UniTask.WhenAny(allTasks);
  • 2. Die asynchrone Implementierung des angeklickten Objekts
    (1) Verwendung mit dem Collider-Kollisionskörper
    (2) Achten Sie auf die Reinigung von Komponenten und Delegaten
    /// <summary>
    /// 3D物体的异步点击方法
    /// </summary>
    /// <param name="gameObject"></param>
    /// <returns></returns>
    public static async UniTask OnClickAsync(this GameObject gameObject, EventTriggerType eventType = EventTriggerType.PointerClick)
    {
    
    
        //碰撞体判断
        if (!gameObject.GetComponent<Collider>()) Debug.LogWarning($"{
      
      gameObject}建议加上相应形状的collider组件");

        //添加组件
        var hasEventTrigger = gameObject.GetComponent<EventTrigger>() != null;
        if (!hasEventTrigger) gameObject.AddComponent<EventTrigger>();
        bool triggered = false;
        
        //委托及实例方法
        Action myAction = null;
        Action fn = () =>
        {
    
    
            triggered = true;
        };

        //委托绑定
        myAction += fn;

        //事件触发
        gameObject.GetComponent<EventTrigger>().AddListener(eventType, (PointerEventData eventData) =>
        {
    
    
            if (myAction != null)
            {
    
    
                myAction.Invoke();
            }
        });

        //等待事件触发
        await UniTask.WaitUntil(() => triggered == true);
        Debug.Log("");

        //取消绑定
        myAction -= fn;

        //资源清理:如果代码是并发执行,可能会把别人动态添加的eventTrigger销毁掉,所以建议不销毁
        //if (!hasEventTrigger) GameObject.DestroyImmediate(gameObject.GetComponent<EventTrigger>());
        
        return;
    }

3. Der Hauptprozess des Bodenschaufelpflückens

 //取土铲
 FlowGetMamoty = async () =>
  {
    
    
      //打开高亮
      if (mamoty.GetComponent<Highlighter>() == null) mamoty.AddComponent<Highlighter>();
      mamoty.GetComponent<Highlighter>().tween = true;

      //等待土铲被点击:任一部件被点击
      var allTasks = mamoty.GetComponentsInChildren<Transform>().Select(t => t.gameObject.OnClickAsync());
      await UniTask.WhenAny(allTasks);
      
      //关闭高亮,取走土铲 
      mamoty.GetComponent<Highlighter>().tween = false;
      await mamoty.DoMove(openedPos, closedPos, closeDuration);
  };

Supongo que te gusta

Origin blog.csdn.net/dzj2021/article/details/130504320
Recomendado
Clasificación