C# 如何管理动画?

C# 如何管理动画?,c#,animation,unity3d,C#,Animation,Unity3d,我正在使用C#,目前正在构建一个第三人称视图游戏。我有一个3D角色模型,动画以帧为单位,所以我必须按帧剪切动画 问题是我目前有5个动画(空闲、跑步、行走、冲刺、跳跃),这是我的代码 void Update () { if (Input.GetAxis("Horizontal") != 0 || Input.GetAxis("Vertical") != 0){ //play run animation } else { if (motion.x !=

我正在使用C#,目前正在构建一个第三人称视图游戏。我有一个3D角色模型,动画以帧为单位,所以我必须按帧剪切动画

问题是我目前有5个动画(空闲、跑步、行走、冲刺、跳跃),这是我的代码

void Update () {
    if (Input.GetAxis("Horizontal") != 0 || Input.GetAxis("Vertical") != 0){
        //play run animation
    } else {
        if (motion.x != 0 || motion.z != 0){
            motion.x = 0;
            motion.z = 0;
        }
                    //play idle anim
    }

    if (Input.GetKeyDown(KeyCode.Space) && controller.isGrounded){
    //play jump anim
    }

    if (Input.GetKeyDown(KeyCode.P)){
        //play punch anim
    }

    if (!controller.isGrounded){
        //play jump anim
    }

    vertVelo -= gravity * Time.deltaTime;
    motion.y = vertVelo;
    this.controller.Move(motion * Time.deltaTime);
}
当我按p键进行字符打孔时,问题就出现了。似乎正在调用更新函数中的空闲动画,因此冲压动画没有时间播放


那么,解决方案是什么?是否有任何动画管理技术,或者我是否应该使用延迟?

尝试用谷歌搜索统一的动画层以及动画之间的混合

可以在图层上设置动画循环,使较高的图层编号覆盖较低的图层

这意味着您可以在第1层上进行空闲循环,这将持续播放。然后说你的跳转圈在第二层。当跳转逻辑触发跳转循环时,它播放一次,然后空闲循环继续


Unity中“AnimationState”上的这个文档也很有用>链接尝试用谷歌搜索Unity中的动画层以及动画之间的混合

可以在图层上设置动画循环,使较高的图层编号覆盖较低的图层

这意味着您可以在第1层上进行空闲循环,这将持续播放。然后说你的跳转圈在第二层。当跳转逻辑触发跳转循环时,它播放一次,然后空闲循环继续


Unity中“AnimationState”上的此文档也很有用>链接您可以在播放punch时阻止空闲动画(但可能不是最佳方法):


播放punch时,您可能会阻止空闲动画(但这可能不是最佳方法):


这个if语句没有任何用处:if(motion.x!=0 | | motion.z!=0)。您也可以始终将motion.x和motion.z设置为0。此if语句没有任何用处:if(motion.x!=0 | | motion.z!=0)。你也可以总是将motion.x和motion.z设置为0I,就像这样,它基本上是一个精简版的,在Unity 4中添加的。你也可以用它来达到类似的效果。我喜欢这个,它基本上是一个精简版的,在Unity 4中添加的。还有一些方法可以用来实现类似的结果。
bool isPunchPlaying = false;

void Update () {
    //... 
    if (!isPunchPlaying) {
        // Play idle anim
    }
    // ...
    if (Input.GetKeyDown(KeyCode.P)){
        //play punch anim
        isPunchPlaying = true;
        StartCoroutine(WaitThenDoPunch(animation["punch"].length));
    }
    // ...
}

IEnumerator WaitThenDoPunch(float time) {
    yield return new WaitForSeconds(time);
    isPunchPlaying = false;
}