[Unity3D]Unity4新的动画系统Mecanim

简介:

Unity4.X中添加的新的动画系统取代了原来3.X的旧的动画系统,新动画系统Mecanim也是官方推荐的,使得我们写较少的代码来实现连续的动画效果。

效果图


Unity3.X中动画系统播放动画

使用播放play()或淡入淡出播放CrossFade()

例如:


animation.Play("name");

animation.CrossFade("name");

也可以做成队列动画,然后播放,例如:

animation.PlayQueued("name");

animation.CrossFade("name1");

代码实现倒序播放

animation.Play(clip1); 

animation[clip1].speed = animationspeed * -1.0; 

老的动画系统要实现一个连续的队列动画,是要通过代码来进行逻辑控制,而在新的动画系统中,要实现这一功能将非常方便。例如要根据玩家连续点击按钮的次数来实现一系列动作的组合动画。


例如:

站立动画->攻击1。。。攻击N->站立动画

这之间可以有N个连续动画的组合,可以根据用户点击按钮的频率来判断执行到第几个连续的动画。

如图,一般导入的动画模型都是原始模型没有动画,然后是动画模型,每一个动画模型都依赖原始模型,命名后面+@name,对应的状态动画。


unity4.X版本还保留了原始动画系统,将模型拖放到Hierarchy视图中没有Animation组件而是Animator组件。如果你还想用老的动画系统,就要切换动画的类型Rig->Animation Type->Legacy




Unity4.X中动画系统播放动画

如果我们要让模型改成新动画系统的类型,我们最好用工具,让程序来批量改变模型的类型,建议放在Editor下。

using UnityEditor;


public class MyEditor : AssetPostprocessor {


public void OnPreprocessModel()

    {

        ModelImporter modelImporter = (ModelImporter)assetImporter;

        modelImporter.animationType = ModelImporterAnimationType.Human;

    }

}

然后将模型拖放Project下,会发现模型的类型会自动修改成Humanoid格式,这种格式一般是人物模型选择该格式。

创建模型的匹配骨骼文件,点击Configure可以预览骨骼。


节约资源起见,其他模型就由这个avatar copy一下即可。



创建动画控制器AnimatorController

Project->Create->AnimatiorController,然后讲模型的Animator下的Controller属性赋值这个动画控制器


然后打开菜单栏的Window->Animator,将动画文件拖放到Animator中,***箭头代表根动画,右击选择Set As Default可以设置为根动画,选择Make Transition可以连接下一个动画节点。

每一条连接线都是一个状态,可以通过左下角的Parameters面板添加Bool变量来控制连接线是否连通,从而来改变模型的动画。


设置连接线的连通条件,点击某一条线,然后在Inspector->Conditions选择Parameters里面的Bool值,并且设置它的默认连通状态是ture还是false。


代码实现人物从等到状态、跑步状态、行走状态的两两状态切换:

using UnityEngine;

using System.Collections;

//Created By Aladdin    http://blog.csdn.net/dingxiaowei2013/article/details/36911203



public class AladdinScript : MonoBehaviour {


    public Transform transform;

    //GUILabel

    public GUIContent[] GUIContents;

    //动画控制器

    private Animator animator;

    //当前状态

    private string currentState = "";


    //获取动画控制器

void Start () {

        animator = transform.GetComponent<Animator>();

}

void OnGUI()

    {

        GUILayout.BeginVertical("box");

        for(int i = 0;i<GUIContents.Length;i++)

        {

            //如果点击了某个状态的按钮

            if (GUILayout.Button(GUIContents[i]))

            {

                currentState = GUIContents[i].text;

            }


            AnimatorStateInfo stateInfo = animator.GetCurrentAnimatorStateInfo(0);

            //从Wait->Walk

            if (stateInfo.IsName("Base Layer.wait") && currentState.Equals("Walk"))

            {

                animator.SetBool("WaitToWalk", true);

            }

            //从Walk->Wait

            else if (stateInfo.IsName("Base Layer.walk") && currentState.Equals("Wait"))

            {

                animator.SetBool("WaitToWalk", false);

            }

            //从Wait->Run

            else if (stateInfo.IsName("Base Layer.wait") && currentState.Equals("Run"))

            {

                animator.SetBool("WaitToRun", true);

            }

            //从Run->Wait

            else if (stateInfo.IsName("Base Layer.run") && currentState.Equals("Wait"))

            {

                animator.SetBool("WaitToRun", false);

            }

            //从Walk->Run

            else if (stateInfo.IsName("Base Layer.walk") && currentState.Equals("Run"))

            {

                animator.SetBool("WalkToRun", true);

            }

            //从Run->Walk

            else if (stateInfo.IsName("Base Layer.run") && currentState.Equals("Walk"))

            {

                animator.SetBool("WalkToRun", false);

            }

        }

    }

}

运行效果图如上图所示。

欢迎关注我的微博  

点击下载工程


















本文转蓬莱仙羽 51CTO博客,原文链接:http://blog.51cto.com/dingxiaowei/1434682,如需转载请自行联系原作者
相关文章
|
7月前
|
存储 API 图形学
Unity 给Animator动画添加事件(动态的)
在 Unity 中,通过动画事件系统可在动画播放的特定时间点触发自定义函数。动态添加事件的步骤包括获取 `AnimationClip` 对象,创建并添加 `AnimationEvent`,最后调用 `Rebind()` 更新动画控制器。示例代码展示了如何在动画开始、中间和结束时触发事件,实现与游戏逻辑的交互。
|
图形学 C#
超实用!深度解析Unity引擎,手把手教你从零开始构建精美的2D平面冒险游戏,涵盖资源导入、角色控制与动画、碰撞检测等核心技巧,打造沉浸式游戏体验完全指南
【8月更文挑战第31天】本文是 Unity 2D 游戏开发的全面指南,手把手教你从零开始构建精美的平面冒险游戏。首先,通过 Unity Hub 创建 2D 项目并导入游戏资源。接着,编写 `PlayerController` 脚本来实现角色移动,并添加动画以增强视觉效果。最后,通过 Collider 2D 组件实现碰撞检测等游戏机制。每一步均展示 Unity 在 2D 游戏开发中的强大功能。
795 6
|
前端开发 图形学 开发者
【独家揭秘】那些让你的游戏瞬间鲜活起来的Unity UI动画技巧:从零开始打造动态按钮,提升玩家交互体验的绝招大公开!
【9月更文挑战第1天】在游戏开发领域,Unity 是最受欢迎的游戏引擎之一,其强大的跨平台发布能力和丰富的功能集让开发者能够迅速打造出高质量的游戏。优秀的 UI 设计对于游戏至关重要,尤其是在手游市场,出色的 UI 能给玩家留下深刻的第一印象。Unity 的 UGUI 系统提供了一整套解决方案,包括 Canvas、Image 和 Button 等组件,支持添加各种动画效果。
762 3
|
图形学 开发者 UED
Unity游戏开发必备技巧:深度解析事件系统运用之道,从生命周期回调到自定义事件,打造高效逻辑与流畅交互的全方位指南
【8月更文挑战第31天】在游戏开发中,事件系统是连接游戏逻辑与用户交互的关键。Unity提供了多种机制处理事件,如MonoBehaviour生命周期回调、事件系统组件及自定义事件。本文介绍如何有效利用这些机制,包括创建自定义事件和使用Unity内置事件系统提升游戏体验。通过合理安排代码执行时机,如在Awake、Start等方法中初始化组件,以及使用委托和事件处理复杂逻辑,可以使游戏更加高效且逻辑清晰。掌握这些技巧有助于开发者更好地应对游戏开发挑战。
566 0
|
开发者 图形学 C#
深度解密:Unity游戏开发中的动画艺术——Mecanim状态机如何让游戏角色栩栩如生:从基础设置到高级状态切换的全面指南,助你打造流畅自然的游戏动画体验
【8月更文挑战第31天】Unity动画系统是游戏开发的关键部分,尤其适用于复杂角色动画。本文通过具体案例讲解Mecanim动画状态机的使用方法及原理。我们创建一个游戏角色并设计行走、奔跑和攻击动画,详细介绍动画状态机设置及脚本控制。首先导入动画资源并添加Animator组件,然后创建Animator Controller并设置状态间的转换条件。通过编写C#脚本(如PlayerMovement)控制动画状态切换,实现基于玩家输入的动画过渡。此方法不仅适用于游戏角色,还可用于任何需动态动画响应的对象,增强游戏的真实感与互动性。
447 0
|
图形学 C# 开发者
Unity粒子系统全解析:从基础设置到高级编程技巧,教你轻松玩转绚丽多彩的视觉特效,打造震撼游戏画面的终极指南
【8月更文挑战第31天】粒子系统是Unity引擎的强大功能,可创建动态视觉效果,如火焰、爆炸等。本文介绍如何在Unity中使用粒子系统,并提供示例代码。首先创建粒子系统,然后调整Emission、Shape、Color over Lifetime等模块参数,实现所需效果。此外,还可通过C#脚本实现更复杂的粒子效果,增强游戏视觉冲击力和沉浸感。
929 0
|
开发者 图形学 前端开发
绝招放送:彻底解锁Unity UI系统奥秘,五大步骤教你如何缔造令人惊叹的沉浸式游戏体验,从Canvas到动画,一步一个脚印走向大师级UI设计
【8月更文挑战第31天】随着游戏开发技术的进步,UI成为提升游戏体验的关键。本文探讨如何利用Unity的UI系统创建美观且功能丰富的界面,包括Canvas、UI元素及Event System的使用,并通过具体示例代码展示按钮点击事件及淡入淡出动画的实现过程,助力开发者打造沉浸式的游戏体验。
546 0
|
图形学 缓存 算法
掌握这五大绝招,让您的Unity游戏瞬间加载完毕,从此告别漫长等待,大幅提升玩家首次体验的满意度与留存率!
【8月更文挑战第31天】游戏的加载时间是影响玩家初次体验的关键因素,特别是在移动设备上。本文介绍了几种常见的Unity游戏加载优化方法,包括资源的预加载与异步加载、使用AssetBundles管理动态资源、纹理和模型优化、合理利用缓存系统以及脚本优化。通过具体示例代码展示了如何实现异步加载场景,并提出了针对不同资源的优化策略。综合运用这些技术可以显著缩短加载时间,提升玩家满意度。
1353 6
|
测试技术 C# 图形学
掌握Unity调试与测试的终极指南:从内置调试工具到自动化测试框架,全方位保障游戏品质不踩坑,打造流畅游戏体验的必备技能大揭秘!
【9月更文挑战第1天】在开发游戏时,Unity 引擎让创意变为现实。但软件开发中难免遇到 Bug,若不解决,将严重影响用户体验。调试与测试成为确保游戏质量的最后一道防线。本文介绍如何利用 Unity 的调试工具高效排查问题,并通过 Profiler 分析性能瓶颈。此外,Unity Test Framework 支持自动化测试,提高开发效率。结合单元测试与集成测试,确保游戏逻辑正确无误。对于在线游戏,还需进行压力测试以验证服务器稳定性。总之,调试与测试贯穿游戏开发全流程,确保最终作品既好玩又稳定。
794 4
|
设计模式 存储 人工智能
深度解析Unity游戏开发:从零构建可扩展与可维护的游戏架构,让你的游戏项目在模块化设计、脚本对象运用及状态模式处理中焕发新生,实现高效迭代与团队协作的完美平衡之路
【9月更文挑战第1天】游戏开发中的架构设计是项目成功的关键。良好的架构能提升开发效率并确保项目的长期可维护性和可扩展性。在使用Unity引擎时,合理的架构尤为重要。本文探讨了如何在Unity中实现可扩展且易维护的游戏架构,包括模块化设计、使用脚本对象管理数据、应用设计模式(如状态模式)及采用MVC/MVVM架构模式。通过这些方法,可以显著提高开发效率和游戏质量。例如,模块化设计将游戏拆分为独立模块。
706 3