新动画系统:
给模型选择动画类型
普通动画:Generic
人形动画:Humanoid

建立动画控制器 - 在Project右击 - 选择Create-AnimatorContorller
将对应动画控制器拖入到Animator的Contorller

双击动画控制器可以打开Animator窗口
将对应动画片段拖入生成新节点,就可以编辑了
橙色节点:相当于旧动画系统的默认片段
灰色节点:
Any State:代表所有动画状态

设置默认片段

建立基础连线

箭头代表两个动画的过渡
Transition Duration:代表融合

任何状态都可以连线到death,甚至包括自己到自己

取消death过渡到自己的选择
动画鬼畜问题,自己过渡到自己

建立过渡条件
添加参数,有4种
通过代码激活参数,实现动画切换

默认过渡条件:Has Exit Time,播放完当前动画才会进行到下一动画的过渡
有条件,取消勾选
无条件,默认勾选,跳跃,浮空

给游戏物体添加脚本,控制参数的激活
代码不能越权:越过动画状态机设置的逻辑(动画连线)的权限

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class HellephantAnimator : MonoBehaviour {
  5. public Animator anim;
  6. // Use this for initialization
  7. void Start () {
  8.  
  9. }
  10.  
  11. // Update is called once per frame
  12. void Update () {
  13. if (Input.GetKeyDown(KeyCode.Alpha1))
  14. {
  15. anim.SetBool("isMove", true);
  16. }
  17. if (Input.GetKeyDown(KeyCode.Alpha2))
  18. {
  19. anim.SetBool("isMove", false);
  20. }
  21. if (Input.GetKeyDown(KeyCode.Alpha3))
  22. {
  23. anim.SetTrigger("Death");
  24. }
  25. }
  26. }
用一个怪物管理器,管理两个怪物的父类
两种方法:
1、管理两个怪物的父类
2、把方法写成接口
父类:全部写成虚函数
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.AI;
  5. public enum EnemySta
  6. {
  7. Move,
  8. Idle,
  9. Death
  10. }
  11. public class NewMonsterBase : MonoBehaviour {
  12. public PlayerControl moveTarget;//设置目标点
  13. public MonsterManager manager;//怪物属于那个管理器
  14. public virtual void Action()
  15. {
  16. }
  17. public virtual void Move()
  18. {
  19. }
  20. public virtual void Idle()
  21. {
  22. }
  23. public virtual void Damage()
  24. {
  25. }
  26. public virtual void Death()
  27. {
  28. }
  29. public virtual void DeathEvent()
  30. {
  31. }
  32. }

这两个需要初始化,要放在父类里

  1. public PlayerControl moveTarget;//设置目标点
  2. public MonsterManager manager;//怪物属于那个管理器

子类:继承父类,并重写父类方法

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.AI;
  5. public class HellephantControl : NewMonsterBase
  6. {
  7. public Animator anim;
  8. public EnemySta enemySta;
  9. //因为我们需要经常用到目标的状态,所以把TransForm改成了PlayerControl
  10. public NavMeshAgent navMeshAgent;//引用寻路系统
  11. private int enemyHealth = ;//设置怪物生命值
  12. // Use this for initialization
  13. void Start()//子类添加新动画系统
  14. {
  15. enemySta = EnemySta.Move;
  16. anim.SetBool("isMove", true);
  17. }
  18. // Update is called once per frame
  19. void Update()
  20. {
  21. Action();
  22. }
  23. public override void Action()
  24. {
  25. switch (enemySta)
  26. {
  27. case EnemySta.Move:
  28. Move();
  29. break;
  30. case EnemySta.Idle:
  31. Idle();
  32. break;
  33. case EnemySta.Death:
  34. Death();
  35. break;
  36. }
  37. }
  38. public override void Move()
  39. {
  40. //anim.CrossFade("Move", 0.2f);
  41. navMeshAgent.SetDestination(moveTarget.transform.position);
  42. //如果怪物的目标死了
  43. if (moveTarget.playSta == PlaySta.Death)
  44. {
  45. //寻路停止
  46. navMeshAgent.isStopped = true;
  47. //状态切换到闲置
  48. enemySta = EnemySta.Idle;
  49. anim.SetBool("isMove", false);
  50. }
  51. }
  52. public override void Idle()
  53. {
  54. //anim.CrossFade("Idle", 0.2f);
  55. }
  56. public override void Damage()
  57. {
  58. //受伤减血
  59. enemyHealth -= ;
  60. //Debug.Log("怪物生命"+enemyHealth);
  61. //如果血到了0
  62. if (enemyHealth <= )
  63. {
  64. //状态变成死亡状态
  65. enemySta = EnemySta.Death;
  66. anim.SetTrigger("Death");
  67. navMeshAgent.isStopped = true;
  68. gameObject.GetComponent<SphereCollider>().enabled = false;
  69. //gameObject.tag = "Untagged";
  70. }
  71. }
  72. public override void Death()//子类关闭老动画系统
  73. {
  74. //anim.CrossFade("Death", 0.2f);
  75. }
  76. public override void DeathEvent()
  77. {
  78. //在管理器列表中移除自己
  79. manager.monsterList.Remove(this);
  80. //销毁自己
  81. Destroy(this.gameObject);
  82. }
  83. }
怪物管理器的怪物列表全部改成父类
怪物管理器的怪物生成
怪物预制体改成数组
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class MounsterManager : MonoBehaviour {
  5. List<Transform> birthPoint;
  6. public GameObject[] monsterPreGo;
  7. //最大怪物数
  8. public int MaxMonsterCount;
  9. public List<NewMonsterBase> monsterList;
  10. public NewPlayer player;
  11. // Use this for initialization
  12. void Start () {
  13. birthPoint = new List<Transform>();
  14. monsterList = new List<NewMonsterBase>();
  15. //遍历所有的子物体,将其加到出生点列表中
  16. for (int i = ; i < transform.childCount; i++)
  17. {
  18. birthPoint.Add(transform.GetChild(i));
  19. }
  20.  
  21. }
  22. void CreateMonster() {
  23. monsterCont++;
  24. GameObject go;
  25. if (monsterCont%==)
  26. {
  27. go = Instantiate<GameObject>(monsterPreGo[]);
  28. }
  29. else
  30. {
  31. //实例化一个怪物
  32. go = Instantiate<GameObject>(monsterPreGo[]);
  33. }
  34.  
  35. //怪物的位置设置任意出生点
  36. go.transform.position = birthPoint[Random.Range(, birthPoint.Count)].position;
  37. //取得怪物脚本
  38. NewMonsterBase monster = go.GetComponent<NewMonsterBase>();
  39. //把怪物放到管理器列表里
  40. monsterList.Add(monster);
  41. //指定怪物的目标
  42. monster.moveTarget = player;
  43. //指定怪物的管理者
  44. monster.manager = this;
  45. }
  46. int monsterCont = ;
  47. void CheckMonster() {
  48. if (monsterList.Count < MaxMonsterCount)
  49. {
  50. CreateMonster();
  51. }
  52. }
  53. // Update is called once per frame
  54. void Update () {
  55.  
  56. }
  57. private void FixedUpdate()
  58. {
  59. CheckMonster();
  60. }
  61. }

怪物动画添加死亡检测事件
骨骼动画锁定:只允许动画控制器修改
在动画状态机的设置里,取消骨骼动画锁定

怪物添加碰撞体

新动画系统的新功能
融合树功能:一个和多个参数,来决定播放哪个动画
更改动画类型

动画和模型分开

拖拽模型生成预制体

添加动画控制器

任意窗口最大化:shift+空格
中键拖动,滚轮缩放
动画本身带有位移动画,根据实际情况决定
好处:过渡自然
坏处:代码不可控,代码强拉,会显得不自然
勾选动画自带的位移动画

建立三个动画的融合树
添加参数,保存键值,保证参数正确传递

右键新建 融合树

双击融合树,打开融合树窗口,右键可以再添加融合树

添加motion

第一列:默认融合区间0到1 ,三个动画过渡0,0.5,1
第二列:动画速度
默认融合区间均等分开,取消勾选,可自行修改

旧动画系统修改动画片段的速度

添加脚本

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class DefaultAvatarAnimator : MonoBehaviour {
  5. public Animator anim;
  6. public int speedHashID;
  7. public int angleHashID;
  8. public int attackHashID;
  9. private float slowSpeed;//速度修正
  10. // Use this for initialization
  11. void Start () {
  12. speedHashID = Animator.StringToHash("Speed");//哈希Code,效能略高,不用每次调用都转换
  13. angleHashID = Animator.StringToHash("Angle");
  14. attackHashID = Animator.StringToHash("Attack");
  15. }
  16. // Update is called once per frame
  17. void Update () {
  18. if (Input.GetKey(KeyCode.LeftShift))
  19. {
  20. slowSpeed = 0.5F;
  21. }
  22. else
  23. {
  24. slowSpeed = 1.0F;
  25. }
  26. anim.SetFloat(speedHashID, Mathf.Clamp01(Input.GetAxis("Vertical")) * slowSpeed);//Mathf.Clamp01,剔除向后走的值
  27. anim.SetFloat(angleHashID, Input.GetAxis("Horizontal") * slowSpeed);
  28. if (Input.GetMouseButtonDown())
  29. {
  30. anim.SetTrigger(attackHashID);
  31. }
  32.  
  33. }
  34. }

给Walk和Run添加融合树

层级关系
两个动画融合,要和动画师沟通,融合动作容易变形,最后让动画师手动新建动画
边跑动,边射箭
添加Attack层,添加射箭节点,添加Attack参数

点击齿轮,修改层级权重为1

Blending融合模式
Override,两个动作折中,一般选则
Aaditive,两个动作叠加

添加Avatar Mask,阿凡达遮罩
如果动画类型是人形动画:Humanoid,可选择Humanoid的Mask
分配骨骼权重:点击区域激活失活
动画模型来自同一骨骼(同一Avatar)

添加代码

Unity3D学习笔记(十六):Animator新动画的更多相关文章

  1. python3.4学习笔记(十六) windows下面安装easy_install和pip教程

    python3.4学习笔记(十六) windows下面安装easy_install和pip教程 easy_install和pip都是用来下载安装Python一个公共资源库PyPI的相关资源包的 首先安 ...

  2. (C/C++学习笔记) 十六. 预处理

    十六. 预处理 ● 关键字typeof 作用: 为一个已有的数据类型起一个或多个别名(alias), 从而增加了代码的可读性. typedef known_type_name new_type_nam ...

  3. python 学习笔记十六 django深入学习一 路由系统,模板,admin,数据库操作

    django 请求流程图 django 路由系统 在django中我们可以通过定义urls,让不同的url路由到不同的处理函数 from . import views urlpatterns = [ ...

  4. SharpGL学习笔记(十六) 多重纹理映射

    多重纹理就把多张贴图隔和在一起.比如下面示例中,一个表现砖墙的纹理,配合一个表现聚光灯效果的灰度图,就形成了砖墙被一个聚光灯照亮的效果,这便是所谓的光照贴图技术. 多重纹理只在OpenGL扩展库中才提 ...

  5. yii2源码学习笔记(十六)

    Module类的最后代码 /** * Registers sub-modules in the current module. * 注册子模块到当前模块 * Each sub-module shoul ...

  6. Swift学习笔记十六:协议

    Protocol(协议)用于统一方法和属性的名称,而不实现不论什么功能. 协议可以被类.枚举.结构体实现.满足协议要求的类,枚举,结构体被称为协议的遵循者. 遵循者须要提供协议指定的成员,如属性,方法 ...

  7. PHP学习笔记十六【方法】

    <?php //给一个函数传递基本数据类型 $a=90; $b=90.8; $c=true; $d="hello world"; function test1($a,$b,$ ...

  8. Java基础学习笔记十六 集合框架(二)

    List List接口的特点: 它是一个元素存取有序的集合.例如,存元素的顺序是11.22.33.那么集合中,元素的存储就是按照11.22.33的顺序完成的. 它是一个带有索引的集合,通过索引就可以精 ...

  9. Java学习笔记十六:Java中的构造方法

    Java中的构造方法 1.使用new+构造方法 创建一个新的对象: 2.构造方法是定义在Java类中的一个用来初始化对象的方法: 3.构造方法与类同名且没有返回值: 4.语法格式: public 构造 ...

  10. JavaScript权威设计--CSS(简要学习笔记十六)

    1.Document的一些特殊属性 document.lastModified document.URL document.title document.referrer document.domai ...

随机推荐

  1. javaScript高级教程(八)-----正则表达式温故知新

    1.RegExp对象:五个属性二个方法 五个属性:global, ignoreCase,multiline,lastIndex,source 二个方法: exec()--模式匹配 test()--检测 ...

  2. elasticsearch 6.0java api的使用

    elasticsearch 6.0 中java api的使用 1:使用java api创建elasticsearch客户端 package com.search.elasticsearch; impo ...

  3. Spark性能优化(二)

    资源调优 调优概述 在开发完Spark作业之后,就该为作业配置合适的资源了.Spark的资源参数,基本都可以在spark-submit命令中作为参数设置.很多Spark初学者,通常不知道该设置哪些必要 ...

  4. oj2894(贝尔曼福特模板)

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2894 就因为粗心,一中午没A,题目说是2000 ...

  5. PAT 1024 Palindromic Number[难]

    A number that will be the same when it is written forwards or backwards is known as a Palindromic Nu ...

  6. Jquery each&forEach

    jQuery方法 语法 .each() 作用 用来遍历dom 用法 $(dom).each( function(index, Element) ) { do Something... } 参数 第一个 ...

  7. IDA 7.0在Mojava更新后打不开的问题

    Mac升级到mojava后,ida 7.0打不开了. 上述是两种典型的窗口,不过不论是出现什么样的弹窗,如果是在升级之后出现的,都要试一下下面的解决办法.因为IDA7.0版本流出的比较多,虽然这个已经 ...

  8. Qt 布局管理器

    在一个颜值当道的今天,无论买衣服,买车还是追星,颜值的高低已经变成了大家最看重的(不管男性女性都一样,千万别和我说你不是):而对于程序猿来说,开发一款软件,不再只注重逻辑和稳定性,美观和用户友好性也是 ...

  9. http协议基础(八)请求首部字段

    请求首部字段 定义:请求首部字段是从客户端到服务器发送请求报文中所使用的字段,里面包含了附加信息.客户端信息以及对响应内容相关的优先级等内容 1.Accept 通知服务器用户代理可处理的媒体类型及媒体 ...

  10. win10安装后耳机有声音而外放无声音

    安装win10后耳机声音正常,而外放没声音.检查了小喇叭.播放器和设备管理器一切正常,驱动也重装了好些次.喇叭音量设置.视频音量设置均正常.花费很多时间,结果发现是键盘上有个小喇叭+的键的问题.按fn ...