2017-04-10 1 views
0

장면을 걷는 모델 (플레이어가 아님)을 범프하지 않으면 스크립트가 정상적으로 작동합니다.
그러나 캐릭터 컨트롤러로 모델을 범프하면 모델은 대기 애니메이션 상태에 도달하면 계속 움직입니다.Unity transform.translate never stops

왜 그런가요? 어떻게 해결할 수 있습니까?

public class MoveMan2 : MonoBehaviour 
{ 

    public float speed = 0.85f; 
    public Animator anim; 
    void Start() 
    { 
     anim = GetComponent<Animator>(); 
     InvokeRepeating("SetWalkMode",5.0f,20.0f); 
    } 

    void SetWalkMode() 
    { 
     anim.Play("SkitsWalk", -1, 0f); 
    } 

    void Update() 
    { 
     if (anim.GetCurrentAnimatorStateInfo(0).IsName("SkitsWalk")) 
     { 
      Debug.Log("Skits walking"); 
      transform.Translate(0, 0, speed * Time.deltaTime); 
     } 
     if (anim.GetCurrentAnimatorStateInfo(0).IsName("Wait")) 
     { 
      Debug.Log("Waiting"); 
     } 
    } 
} 
+3

개체에 리지드 바디가 부착되어 있습니까? 물리적 상호 작용은 코드에서 객체를 움직이지 않아도 계속 적용됩니다. – Serlite

+0

시도해 보셨습니까? 'Translate'를'transform.Translate (0, 0, speed * Time.deltaTime, Camera.main.transform);'로 변경하십시오. – Hristo

+0

강체를 제거하고 올바르게 작동합니다. Serlite에게 감사드립니다! – CsharpBeginner

답변

1

InvokeRepeating의 세 번째 매개 변수는 지정한 메서드를 다시 호출하는 빈도입니다. 따라서 Unity는 매 20 초마다 SetWalkMode를 호출합니다. 모델이 "대기"상태가되면 20 초 안에이 방법으로 재설정됩니다.

충돌을 감지하고 해당 변수를 SetWalkMode 메서드에서 확인할 때 변수 (예 : bool)를 설정할 수 있습니다.

bool isObjectInCollision = false; 

void EnterCollision() 
{ 
    // do something 
    isObjectInCollision = true; 
} 

void LeaveCollision() 
{ 
    // do something 
    isObjectInCollision = false; 
} 

void SetWalkMode() 
{ 
    if (isObjectInCollision) 
     return; 
    anim.Play("SkitsWalk", -1, 0f); 
}