2017-01-14 13 views
0

좋아, 그래서 나는 그냥 설정된 시간 도약한다 어차피 사용자의 도청 m의 의미에 의해 제어하지만이 사실 인 경우에 달려 있어야하는의 animationnthe 속도가 그것은 "stillOpening의 말에 topSkyBoxOpen에 동일합니다 의미Unity - 특정 애니메이션 상태가 켜져있는 동안 어떻게 깜박입니까? 말</p> <pre><code>cameraAnim.GetCurrentAnimatorStateInfo (0).IsName ("stillOpening") </code></pre> <p>:

skybox.SetFloat ("_Exponent1",Mathf.Lerp(skybox.GetFloat("_Exponent1"), topSkyBoxOpen, ratio)); 

: 내 물질이 떠 필요한이 애니메이션 (빠르게 또는 느리게이 소요 된 시간 상관없이) 최종 값에 lerped 것으로 ". 타이밍을 조정하는 방법을 모르겠습니다.

void openSkyLerp() 
    { 
     float ratio = 0; 
     float duration = 0.5f; // this is the one that will control how long it takes 
     // value is in second 
     float multiplier = 1/duration; 

     while (cameraAnim.GetCurrentAnimatorStateInfo (0).IsName ("stillOpening")) { 
      ratio += Time.deltaTime * multiplier; 
      skybox.SetFloat ("_Exponent1",Mathf.Lerp(skybox.GetFloat("_Exponent1"), topSkyBoxOpen, ratio)); 

     } 
    } 

을하지만 아무것도 전혀 일어나지 않는다 - 나는 그것의 1 개 프레임에 모든 LERP을하려고하기 때문에이 될 수 읽기 :

나는 업데이트()이 시도했다. 이것이 가능한가? 속도에 상관없이 애니메이션이 재생되는 동안 어떻게 저지 할 수 있습니까?

답변

0

의미는 "stillOpening"의 끝에서 topSkyBoxOpen과 동일해야합니다. 타이밍을 조정하는 방법을 모르겠습니다.

문제는 당신이 프레임을 기다리지 않고 있다는 것입니다. 따라서 방정식이 정확하더라도 모든 프레임이 단일 프레임에서 원활하게 이루어질 수 없습니다. yield return null;으로 프레임을 기다리면 코 루틴이 필요합니다.

몇 시간 전에 매우 비슷하지만 동일하지 않은 것으로 대답했습니다. question.

변수가 대상 값이면 _Exponent1 값을 while 루프로 보내기 전에 가져옵니다. 카운터가 topSkyBoxOpen보다 작 으면 각 프레임을 증가시키는 카운터 변수가 있어야합니다. 그런 다음 SetFloat 함수에서 Mathf.Lerp(currentVal, topSkyBoxOpen, counter/duration);을 사용할 수 있습니다. 그러나 때 사용자 탭 및 애니메이션 속도를 정상 속도 애니메이션 작동

bool running = false; 

void openSkyLerp() 
{ 
    if (running) 
    { 
     return; 
    } 
    running = true; 
    StartCoroutine(OpenSky(5)); 
} 

IEnumerator OpenSky(float duration) 
{ 
    float currentVal = skybox.GetFloat("_Exponent1"); 
    float counter = 0; 
    while (counter < topSkyBoxOpen) 
    { 
     //Exit if not still opening 
     if (!cameraAnim.GetCurrentAnimatorStateInfo(0).IsName("stillOpening")) 
     { 
      yield break; 
     } 
     counter = counter + Time.deltaTime; 

     float val = Mathf.Lerp(currentVal, topSkyBoxOpen, counter/duration); 

     skybox.SetFloat("_Exponent1", val); 
     yield return null; //Wait for a frame 
    } 
    running = false; 
} 
+0

좋아, 덕분에 (작품 값을 먹으 렴 때문에 BTW 어디? 5 기간 동안 거지), 유일한 얻는다 뛰어 약 6.28, 모든 방법이 아님 – skyguy

+0

** 어디서 5를 얻었습니까? ** 아무 곳. 원하는 번호를 사용할 수 있습니다. 이것은 단순히 현재의'_Exponent1' 상태에서 * 5 * 초 안에'topSkyBoxOpen'으로 점진적으로 갈 것이라는 것을 의미합니다. 원하는대로 변경할 수 있습니다. – Programmer

+0

** 도약은 모든 방법이 아닌 6.28 정도에 이릅니다 ** 이것은 '_Exponent1'의 cucrrent 값에서'topSkyBoxOpen' 값으로 갈 것입니다. 'topSkyBoxOpen'가 6.28이면 6.28에서 멈추게 될 것이므로'topSkyBoxOpen' 변수의 값을 확인하십시오. 'topSkyBoxOpen' 변수가 멈추는 변수와 다른 값인 경우'if (! cameraAnim.GetCurrentAnimatorStateInfo (0) .IsName ("stillOpening"))을 제거하십시오. { yield break; }'코드에서. 그게 당신의 문제를 해결하는지 알려주세요. – Programmer