该文来自学习chutianbo老师的笔记,链接b站

关于帧动画的制作

关于一个角色的动画制作,我们要先为这个角色加上一个组件Animator(动画控制器).
之后在我们使用ctrl+6打开Animation面板,选中我们Prefabs下的角色,点击创建Animation Cilp,将新建文件动画放置我们在assets下创建的Animation文件夹中。
之后我们在Characters文件夹中找到不同形态的素材
如上图,robot动作分为idle,fixed,walk三个状态,其中walk中的动画分为四个方向。我们使用Shift按住选中其中归属down的四张照片拖入Animation面板中进行帧制作即可。

问题:
1.动作只有左没有右

使用Filp X进行反转即可
2.名字右边三个符号分别表示调到指定帧,加入关键帧,加入事件
3.制作的帧动画事件尽量不要低于0.10,不然后面混合树的tigger判定会出bug

使用混合树为角色加上动画

在制作完动画之后,我们就需要为角色加上行为流程。
在制作animation时,他会自动创建一个对应的animator点击进入
会发现我们之前做的每个动画都散落在其中,所以按照归类,我们使用右键创建create state➡New Blend tree。
因为机器人的动画有朝向问题,所以我们在左边的paramemters中加入参数判定 Move X,和Move Y,都是float类型

大概做完就是这个样子
这里要记得

将混合树类型改为两个控制参数,然后加入自己做的动画即可
这里上述的动画我是没有做参数控制的,下述主角动画

分别为四个状态 idle(站立),launch(射击),Moving(奔跑),hit(受击)
Speed>0.1时 idle➡Moving
Look X和Look Y来表示面向(下面会有代码计算当前面向)
Lanuch和Hit为tigger类型当条件触发进入,且回自动跳回上一状态;

//我的角色初始面向向下Vector2 lookDirection = new Vector2(0, -1);Vector2 move;void Update(){move = new Vector2(horizontal, vertical);//浮点数近似相等if (!Mathf.Approximately(move.x, 0.0f) || !Mathf.Approximately(move.y, 0.0f)){lookDirection.Set(move.x, move.y);//使数值归一为向量lookDirection.Normalize();}animator.SetFloat("Look X", lookDirection.x);animator.SetFloat("Look Y", lookDirection.y);animator.SetFloat("Speed", move.magnitude);}

做好了动画,使用参数控制动画

声明动画对象
Animator animator;
2.在start中获得动画实例
animator = GetComponent();
3.在FixedUpdate中加入判定

  if (vertical){position.y = position.y + speed * Time.deltaTime*direction;animator.SetFloat("Move X",0);animator.SetFloat("Move Y", direction);}else{position.x = position.x + speed * Time.deltaTime * direction;animator.SetFloat("Move X", direction);animator.SetFloat("Move Y", 0);}rigidbodyroot.MovePosition(position);```
# 关于主角攻击
动画制作同上不再赘述,这里我们讲述一下关于主角射击发出子弹的事情
1.在子弹预制件中加入刚体和碰撞体,同时为子弹projecttile预制件挂上脚本``Rigidbody2D rigidbodyproject;// Start is called before the first frame updatevoid start(){rigidbodyproject = GetComponent<Rigidbody2D>();}public void launch(Vector2 direction,float force){//给子弹一个发射的力rigidbodyproject.AddForce(direction*force);}private void OnCollisionEnter2D(Collision2D collision){Debug.Log($"碰到了{collision.gameObject}");//子弹撞见实体时消失Destroy(gameObject);//当子弹遇见机器人时,修复机器人EnemyController2 emenyController2 = collision.collider.GetComponent<EnemyController2>();if (emenyController2 != null){emenyController2.Fix();}}private void Update(){//如果没有碰到任何碰撞体,过远自动销毁if (transform.position.magnitude>100){Destroy(gameObject);}}

2在主角代码中加入
public GameObject projecttilePrefabs;//表示获取子弹预制件
3.为主角加入发射函数

   void Launch(){//在指定位置创建对象GameObject projecttileObject = Instantiate(projecttilePrefabs, rigidbody2dRuby.position + Vector2.up * 0.5f, Quaternion.identity);projecttile projecttile = projecttileObject.GetComponent<projecttile>();projecttile.launch(lookDirection, 300);}

上述Instantiate表示创建实体是unity的一个api参数第一个是对象,第二个是创建位置,第三个是旋转
,Quaternion.identity表示不旋转(这里我们可以回到最开始创建主角移动时,如果不勾选冰冻z轴的样子)
4.遇见bug 233
我们会发现第一件事,unity会报错表示子弹预制件的刚体获取为null,这是因为,下述为unity官方解释:
这是因为在你创建对象时 Unity 不会运行 Start,而是在下一帧才开始运行。因此,在飞弹上调用 Launch 时,只实例化 (Instantiate),不调用 Start,因此 Rigidbody2d 仍然为空。要解决此问题,请将 Projectile 脚本中的 void Start() 函数重命名为 void Awake()。
与 Start 刚好相反,在创建对象时(调用 Instantiate 时)就会立即调用 Awake,因此在调用 Launch 之前已正确初始化 Rigidbody2d。
关于这个问题深入可以去看看MonoBehavior的生命周期
5.修完这个bug,那么我们会继续遇到bug
我们发现飞弹创建了,但是瞬间遇到主角消失了,所以这里我们需要用到图层,将主角和预制件飞弹放在不同的图层,同时在 Edit➡Project Setting➡physical 2D中取消这两个图层的勾选(即为不碰撞)

这片文章所使用的素材来自unity商店Ruby’s adventure
链接unity官网

Unity初学4——帧动画以及主角攻击(2d)相关推荐

  1. 关于Unity中的帧动画组件的编写

    一.帧动画 1: 美术准备好一个连续动作的离散图片; 2: 程序在准确的时间来切换这个图片; 3: 优点: 简单,速度快; 缺点:资源占用相对过大; 二.frame_anim组件编写 1: 代码里面强 ...

  2. Unity制作Animation帧动画

    1,把9个头像的图片放入Asset 2,点击图片,右侧,Texture Type里改成Sprite(2D and UI) Sprite Mode里改成Multiple 3,点击Sprite Edito ...

  3. unity 2D游戏开发 制作帧动画的两种方法

    本小主在这里给大家分享一下unity 2D游戏开发中制作帧动画的两种方法. 比较简单,一学即会. 方法一: 是用代码控制: 先创建一个2D工程.导入图片资源,并设置texture的texture ty ...

  4. [Unity]代码控制在3D物体上播放帧动画

    不使用Unity自带的Animation,在3D物体上播放帧动画 图片必须是可以整齐排列的 可以分割的完整的图片. 像这样 不能像这样: 也不能像这样,过于紧凑,不能完整切割 空项目,空场景, 场景中 ...

  5. DragonBone的帧动画在Unity中的使用,以及更换Armature的方法

    龙骨的官方API只提供了播放animation的方法,然而若是采用龙骨的逐帧动画,则不存在切换animation的概念,那么就只能通过切换不同的骨架(Armature)来控制同一个帧动画龙骨文件的不同 ...

  6. Unity中的Animator动画详解

    Unity中的Animator动画详解 Animator动画导入 Animator动画详解 动画类型选择 Rig面板属性 Mode面板属性 Animation面板属性 动画片段 控制使用 Animat ...

  7. Unity学习日志_动画系统简介

    Unity学习日志_动画系统简介 Animation,Legacy动画系统 若要使用Animation,需要在创建Clip之前为物体手动添加Animation组件. Animation组件面板: 属性 ...

  8. UGUI 帧动画插件

    最近在开发一款功夫猫游戏,本来使用Unity Sprite制作,但是发现Sprite对各种分辨率不支持. 看着游戏很简单就使用UGUI制作,在中途发现有很多帧动画播放,使用了Animation调整使用 ...

  9. Unity中BVH骨骼动画驱动的可视化理论与实现

    前言 找了很久使用BVH到unity中驱动骨骼动画的代码,但是都不是特别好用,自己以前写过,原理很简单,这里记录一下. 理论 初始姿态 在BVH或者其它骨骼动画中,一般涉及到三种姿势:A-pose,T ...

最新文章

  1. Castle ActiveRecord学习实践(5):实现Many–Many关系的映射
  2. c 和java 内存,C分配和内存开销
  3. 【Matlab 控制】求左右特征向量
  4. BaaS(区块链即服务Blockchain as a Service)
  5. mysql 重装问题
  6. 全国python一级考试时间_2019年北京全国计算机一级考试时间
  7. 雷林鹏分享:C# 运算符
  8. [转载] 【数学问题】利用python求解表达式
  9. pgp 私钥需要什么样的保护措施_参与以太坊 2.0 存款合约前需要了解的相应风险...
  10. Java 异常处理的 20 个最佳实践,你知道几个?| CSDN 博文精选
  11. Java是块级作用域吗_javascirpt如何模仿块级作用域(js高程笔记)
  12. java往json里添加对象_将新数组元素添加到JSON对象
  13. 基于R语言的地理探测器实现与问题研究
  14. Linux开发必备技能
  15. addr2line的使用
  16. windows域与工作组概念
  17. JavaScript实现的手风琴图片切换,鼠标悬停任意图片html前端源码
  18. 兼容低功耗MCU和SoC、超低电流消耗 特瑞仕转换器家族再添一员
  19. 【系统集成项目管理工程师】信息系统集成及服务
  20. 比较两组数据的差异用什么图更直观_用Excel制作旋风图

热门文章

  1. java thread suspend_关于Thread对象的suspend,resume,stop方法
  2. lightgbm java_开源|LightGBM基本原理,以及调用形式
  3. oracle db中,某一种数据字典pct miss的计算公式
  4. 希捷银河企业级硬盘,智能高效首选 1
  5. 设备管理与维修杂志设备管理与维修杂志社设备管理与维修编辑部2023年第7期目录
  6. HTML简单页面页码的设计
  7. win10使用之高对比度
  8. Python内置工具(tools)总结
  9. hdu 小希的迷宫 一道不一样的解法 图 树
  10. 基于Python的互联网文本法律法条引用跟踪分析