如何使用 [ExecuteInEditMode] 更新 Update 函数中的列表?

How can i update a List inside Update function using [ExecuteInEditMode]?

using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;

[ExecuteInEditMode]
public class AnimationCamera : MonoBehaviour
{
    public string test;
    public Camera animationCamera;
    public Camera mainCamera;
    private Animator _anim;
    public List<AnimationClip> animations = new List<AnimationClip>();

    private void Start()
    {
        test = "daniel";
        animationCamera.enabled = false;
        mainCamera.enabled = true;
        _anim = GetComponent<Animator>();       
    }

    private void Update()
    {
        _anim = GetComponent<Animator>();
        foreach (AnimationClip ac in _anim.runtimeAnimatorController.animationClips)
        {
            animations.Add(ac);
        }

        if (Input.GetKeyDown(KeyCode.C))
        {
            animationCamera.enabled = !animationCamera.enabled;
            mainCamera.enabled = !mainCamera.enabled;

            if (animationCamera.enabled)
            {
                _anim.CrossFade("Animation_Sign", 0);
            }
            else
            {
                _anim.CrossFade("Animation_Idle", 0);
            }
        }
    }

    public IEnumerator PlaySignAnimation()
    {
        animationCamera.enabled = true;
        _anim.CrossFade("Animation_Sign", 0);
        yield return null; //new WaitForSeconds(animations[0]);
        animationCamera.enabled = false;
        mainCamera.enabled = true;

    }
}

现在的方式是,它会一直更新动画列表,并不断将相同的项目添加到编辑器中的列表中。 因为在编辑器中我会更新 Animator window 我希望它在每次我添加或删除动画剪辑时自动更新动画列表 from/to Animator window.

The way it is now it will update the animations List all the time and will keep adding the same item to the List in the editor.

简单的解决方法是将 ac 添加到动画 List 中,仅当它不存在于动画 List.

中时

变化:

foreach (AnimationClip ac in _anim.runtimeAnimatorController.animationClips)
{
    animations.Add(ac);
}

foreach (AnimationClip ac in _anim.runtimeAnimatorController.animationClips)
{
    if (!animations.Contains(ac))
    {
        animations.Add(ac);
    }
}

可能还有其他方法,但这看起来很简单。

编辑:

关于检查动画剪辑何时被修改,可以订阅AnimationUtility.OnCurveWasModified委托函数