Unity Animator自动连线
先上图

上图为一个简单的怪物状态机,是通过代码自动生成连线的,但是里面的动画需要自己设置
那么如何做到
官方参考:https://docs.unity3d.com/ScriptReference/Animations.AnimatorController.html
民间参考:https://www.jianshu.com/p/cf1b54b78c23
我的代码:
using System;
using System.Collections;
using System.Collections.Generic;
using Framework;
using UnityEditor;
using UnityEditor.Animations;
using UnityEngine; /// <summary>
/// 状态机自动连线
/// 使用方法:选择Project视图里面的动画状态机文件,右键——>创建怪物动画状态机
/// </summary>
public class EditorAnimator
{
[MenuItem("Assets/创建怪物动画状态机", priority = 0)]
static void CreateUIView()
{
AnimatorController ac = (AnimatorController)Selection.objects[0];
AnimatorStateMachine stateMachine = ac.layers [0].stateMachine;
//添加动画容器
AddNewState(stateMachine, "Die", new Vector3(300, 20, 0));
AddNewState(stateMachine, "Idle", new Vector3(300, 120, 0));
AddNewState(stateMachine, "Run", new Vector3(300, 220, 0));
AddNewState(stateMachine, "Attack", new Vector3(600, 220, 0)); #region 添加状态
AddBoolBehaviour(stateMachine, "Idle", "IsIdle",true, SetParameter.Parameter.SetWhen.OnEnter);
AddBoolBehaviour(stateMachine, "Idle", "IsIdle",false, SetParameter.Parameter.SetWhen.OnExit);
AddBoolBehaviour(stateMachine, "Die", "IsDie",true, SetParameter.Parameter.SetWhen.OnEnter);
AddBoolBehaviour(stateMachine, "Die", "IsDie",false, SetParameter.Parameter.SetWhen.OnExit);
AddBoolBehaviour(stateMachine, "Run", "IsRun",true, SetParameter.Parameter.SetWhen.OnEnter);
AddBoolBehaviour(stateMachine, "Run", "IsRun",false, SetParameter.Parameter.SetWhen.OnExit);
AddBoolBehaviour(stateMachine, "Attack", "IsAttack",true, SetParameter.Parameter.SetWhen.OnEnter);
AddBoolBehaviour(stateMachine, "Attack", "IsAttack",false, SetParameter.Parameter.SetWhen.OnExit);
#endregion //连线,并且添加条件
var line = StateLine(stateMachine, "Idle", "Run");
line.AddCondition(AnimatorConditionMode.Greater, 0.01f, "speed");//数值大小式
var line2 = StateLine(stateMachine, "Run", "Idle");
line2.AddCondition(AnimatorConditionMode.Less, 0.01f, "speed");//数值大小式
var line3 = StateLine(stateMachine, "Run", "Attack");
line3.AddCondition(AnimatorConditionMode.If, 0, "attack");//Trigger触发式
var line4 = StateLine(stateMachine, "Idle", "Attack");
line4.AddCondition(AnimatorConditionMode.If, 0, "attack");//Trigger触发式
StateLine(stateMachine, "Attack", "Idle", true);
var line5 = StateLine(stateMachine, "Die", "Idle");
line5.AddCondition(AnimatorConditionMode.IfNot, 0, "die");//bool-false
//任意状态到死亡
var lineDie = stateMachine.AddAnyStateTransition(GetStateByName(stateMachine, "Die"));
lineDie.AddCondition(AnimatorConditionMode.If, 0, "die");//bool-true
lineDie.AddCondition(AnimatorConditionMode.IfNot, 0, "IsDie");//bool-false
} static void AddNewState(AnimatorStateMachine stateMachine, string name, Vector3 v3)
{
bool has = false;
foreach (var one in stateMachine.states)
{
//Debug.Log(one.state.name);
if (one.state.name.Equals(name))
{
has = true;
}
}
if (!has)
{
stateMachine.AddState(name, v3);
}
} static AnimatorState GetStateByName(AnimatorStateMachine stateMachine, string name)
{
foreach (var one in stateMachine.states)
{
if (one.state.name.Equals(name))
{
return one.state;
}
}
return null;
} //连线
static AnimatorStateTransition StateLine(AnimatorStateMachine stateMachine, string name1, string name2,bool defaultExitTime = false)
{
return GetStateByName(stateMachine, name1).AddTransition(GetStateByName(stateMachine, name2), defaultExitTime);
} //添加StateMachineBehaviour,并且设置
static void AddBoolBehaviour(AnimatorStateMachine stateMachine, string name,string paraName, bool v, SetParameter.Parameter.SetWhen when)
{
SetParameter.Parameter parameter = new SetParameter.Parameter();
parameter.Name = paraName;
parameter.Type = AnimatorControllerParameterType.Bool;
parameter.BoolValue = v;
parameter.When = when; SetParameter para;
if (GetStateByName(stateMachine, name).behaviours.Length == 0)
{
para = GetStateByName(stateMachine, name).AddStateMachineBehaviour<SetParameter>();
}
else
{
para = (SetParameter)GetStateByName(stateMachine, name).behaviours[0];
}
if (para.Parameters == null)
{
para.Parameters = new List<SetParameter.Parameter>();
}
para.Parameters.Add(parameter);
EditorUtility.SetDirty(para);
}
}
Unity Animator自动连线的更多相关文章
- DirectX:在graph自动连线中加入自定义filter(graph中遍历filter)
为客户提供的视频播放的filter的测试程序中,采用正向手动连接的方式(http://blog.csdn.net/mao0514/article/details/40535791),由于不同的视频压缩 ...
- Unity脚本自动添加注释脚本及排版格式
Unity脚本自动添加注释脚本及头部注释排版格式 公司开发项目,需要声明版权所有,,,,标注公司名,作者,时间,项目名称及描述等等. 自己总结实现的现成脚本及头部注释排版文本,添加到模版即可. 文件不 ...
- 【转】Unity Animator卡顿研究
Unity Animator卡顿研究 发表于2017-07-26 点赞3 评论3 分享 分享到 2.3k浏览 想免费获取内部独家PPT资料库?观看行业大牛直播?点击加入腾讯游戏学院游戏程序行业精英群 ...
- Unity编辑器 - 自动排版
Unity编辑器 - 自动排版 使用花括号提高可读性 //一组横向排列的控件 GUILayout.BeginHorizontal(); { GUILayout.BeginVertical(); { / ...
- 【转】unity Animator 怎么判断一个动画播放结束
关于unity Animator 怎么判断一个动画播放结束这里有几种方法.希望对大家有帮助.还有其他办法的可以分享一下 第一种方法:在动画结束帧后面加个动画事件,调用下含这个变量的函数接口不是可以了? ...
- [翻译]理解Unity的自动内存管理
当创建对象.字符串或数组时,存储它所需的内存将从称为堆的中央池中分配.当项目不再使用时,它曾经占用的内存可以被回收并用于别的东西.在过去,通常由程序员通过适当的函数调用明确地分配和释放这些堆内存块.如 ...
- Unity Animator动画状态机 深入理解(一)
接触Unity以来就已经有了Animator,Animation用的少,不过也大概理解他俩之间的一个区别于联系. 图中其实就是Animator和Animation之间的区别于联系了,啊!你肯定会告诉我 ...
- unity inspector 自动装载Commont和Prefab属性
在使用unity的过程中,经常遇到这样的问题:每次都需要手动为序列化属性拖拽赋值.像这样: 试着找了找,真的找到了一份代码,但是缺少自动装载Prefab的功能.之后我花了点时间添加这个功能. 使用方法 ...
- Unity Animator动画状态机 深入理解(二)IK控制
IK还是一个很神奇和实用的东西啊,起码可以用代码来控制人物骨骼位置还是很爽的.因为不是动画师~ 这篇可能跟Animator没啥关系了哈,都是代码层的. 看了一官方的案例,老的,有些问题,自己修改了一下 ...
- Unity之屏幕画线
using UnityEngine;using System.Collections; public class DrawRectangle : MonoBehaviour { public Colo ...
随机推荐
- 在鸿蒙NEXT开发中实现一个语音识别组件
鸿蒙系统发布以后都不知道叫它5.0版本还是NEXT版本了,哈哈,反正是最新版本就对了.对于语音转换文字,鸿蒙系统提供了离线语音识别模型speechRecognizer,语种目前支持中文,识别效果非常不 ...
- web框架实例
s5.py from wsgiref.simple_server import make_server def handle_index(): return [b'<h1>Hell ...
- vue3 基础-插件 plugin 案例演示
前篇有介绍关于插件 plugin 的无敌强大和基本使用流程后, 当时从俺的经验上看是没咋去使用它的, 即英雄无用武之地. 本篇也是从网上找个案例来为 plugin 的强大来小试牛刀啦. 假设我们要做一 ...
- 若依ruoyi项目学习(一)项目跑起来!
开个坑,记录自己学习若依的心得,感兴趣的小伙伴可以关注一波. 因为自己也比较菜,可能能为大家提供一个较低的视角去分析,希望大家能一起学习. 当然,即时视角很低,也不适合0基础的朋友~ 项目地址: 前置 ...
- E. Level Up
E. Level Up 题意 玩家初始等级为 \(1\), 有 \(n\) 只怪物,每个怪物有一个等级 \(a_i\), 如果怪物等级高于你,则你们会战斗,战斗后经验加1,否则怪物会逃跑,你不会获得经 ...
- 第9讲、深入理解Scaled Dot-Product Attention
Scaled Dot-Product Attention是Transformer架构的核心组件,也是现代深度学习中最重要的注意力机制之一.本文将从原理.实现和应用三个方面深入剖析这一机制. 1. 基本 ...
- 【转载】数论学习笔记(Blog of tyqtyq)
from a famous oier \(\texttt{tyqtyq}\)请点链接tyqtyq~! - 博客园 (cnblogs.com) 数论分块 \(\sum_{i=1}^{n} \lfloor ...
- 【Java并发编程】面试必备之线程池
什么是线程池 是一种基于池化思想管理线程的工具. 池化技术:池化技术简单点来说,就是提前保存大量的资源,以备不时之需.比如我们的对象池,数据库连接池等. 线程池好处 我们为什么要使用线程池,直接new ...
- F-47(copy 邓大顾)
*&---------------------------------------------------------------------* *& F-47过账 *&--- ...
- 三、FFmpeg学习笔记
FFmpeg是一个开源.跨平台的多媒体处理框架,能够实现音视频的录制.转换.剪辑.编码.解码.流媒体传输.过滤与后期处理等几乎所有常见的多媒体操作.其强大之处在于几乎支持所有的音视频格式.编解码器 ...