Unity Animator 분할 재생 설정 방법

프로젝트 에 필요 한 것 이 있 습 니 다.아주 긴 Animator 애니메이션 을 하나의 재생 으로 나 누 었 습 니 다.우 리 는 해당 하 는 단 추 를 누 르 면 특정한 시간 대의 애니메이션 을 재생 합 니 다.쓸데없는 말 은 하지 않 습 니 다.
새 빈 물체 에 toggle group 을 추가 합 니 다.

다음은 toggle 한 무더기 와 Group 에 아버지 까지.

 private Animator myAnimator;
    public List<Toggle> myTogglesList;
    private float playTime;
    public void Awake()
    {
        myAnimator = GameObject.Find("XXX/xxx").GetComponent<Animator>();
        myTogglesList.AddRange(transform.GetComponentsInChildren<Toggle>());
    }
    public void Start()
    {
        base.Start();
        for (int i = 0; i < myTogglesList.Count; i++)
        {
            Toggle go = myTogglesList[i];
            myTogglesList[i].onValueChanged.AddListener((bool value) => OnClickBtn(go.gameObject, value));
        }
    }

void Update()
    {
     //playTime         
        playTime = myAnimator.GetCurrentAnimatorStateInfo(0).normalizedTime;
        Debug.Log(playTime);
        if (myTogglesList[0].isOn && playTime > 0.1f)
        {
         //Animator.Play("ANI1", 0, 0f)       ANI1         0, 0 ,      0f,     
            myAnimator.Play("ANI1", 0, 0f);
        }
        if (myTogglesList[1].isOn && playTime > 0.3f)
        {
            myAnimator.Play("ANI1", 0, 0.1f);
        }
        if (myTogglesList[2].isOn && playTime > 0.5f)
        {
            myAnimator.Play("ANI1", 0, 0.3f);
        }
        if (myTogglesList[3].isOn && playTime > 0.8f)
        {
            myAnimator.Play("ANI1", 0, 0.5f);
        }
  .........................
    }
    private void OnClickBtn(GameObject go, bool value)
    {
        switch (go.name)
        {
            case "btn01 (1)":
                myAnimator.Play("ANI1", 0, 0f);
                break;
            case "btn01 (2)":
                myAnimator.Play("ANI1", 0, 0.1f);
                break;
            case "btn01 (3)":
                myAnimator.Play("ANI1", 0, 0.3f);
                break;
            case "btn01 (3)":
                myAnimator.Play("ANI1", 0, 0.5f);
                break;
                .........................
        }
    }
보충:유 니 티 애 니 메 이 터 는 애니메이션 을 편집 하지 않 고 세그먼트 재생 애니메이션 을 실현 합 니 다.
긴 말 안 할 게 요.그냥 코드 보 세 요~

public Animator anim;
    private AnimatorStateInfo animInfo;    
    /// <summary>
    ///          
    /// </summary>
    int playSpeed = 0;
    void Update()
    { 
        animInfo = anim.GetCurrentAnimatorStateInfo(0);
        //      Take 001  
        if (animInfo.normalizedTime < 0.99f && animInfo.IsName("Take 001"))
        {
            //     
            if (animInfo.normalizedTime > 0.19 && animInfo.normalizedTime < 0.2)
            {
                //           
                print("    1");
                anim.speed = playSpeed; 
            }
            //     
            else if (animInfo.normalizedTime > 0.39 && animInfo.normalizedTime < 0.4)
            {
                print("    2");
                anim.speed = playSpeed;
            }
            else
            {
                //           
                playSpeed = 0;
            } 
        }
     }
 
    /// <summary>
    ///       
    /// </summary>
    private void PlayAnim()
    {
        //        
        playSpeed = 1;
    }
animInfo.normalized Time 애니메이션 상태 표준화 시간,애니메이션 값 은 0~1 입 니 다.애니메이션 재생 완료
animInfo.IsName("Take 001")현재 재생 중인 애니메이션 입 니 다.Take 001 은 애니메이션 이름 입 니 다.
원리:먼저 모든 애니메이션 의 끝 프레임 을 알 아야 합 니 다.그 다음 에 이 애니메이션 의 끝 프레임 은 전체 프레임 을 제외 하고 이 끝 프레임 은 animInfo.normalized Time 의 값 을 얻 을 수 있 습 니 다.마지막 으로 조건 으로 애니메이션 을 중단 하고 애니메이션 을 계속 재생 하면 다음 애니메이션 의 시작 을 실현 할 수 있 습 니 다.
예 를 들 어 애니메이션 100 프레임 이 있 는데 편집 하지 않 고 여러 단락 의 애니메이션 을 재생 해 야 합 니 다.
첫 번 째 단락 의 끝 프레임 이 20 프레임 이라는 것 을 알 게 되면 20/100=0.2,0.2 는 normalized Time 값 을 애니메이션 일시 정지 조건 으로 합 니 다(조건 을 쓸 때 범 위 를 설정 할 수 있 습 니 다).
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.만약 잘못 이 있 거나 완전히 고려 하지 않 은 부분 이 있다 면 아낌없이 가르침 을 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기