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 ...
随机推荐
- golang+gin实现api接口开发
一.简介: Gin是Go语言的一个微框架,也是是一个用 Go (Golang) 编写的 HTTP Web 框架,封装比较优雅,API相对友好.Gin具有性能优异和灵活快速等优点.它具有类似 Marti ...
- scikit-learn生成随机数据集
%matplotlib inline from sklearn import datasets import matplotlib.pyplot as plt import numpy as np s ...
- jdk8下载地址(附赠安装包)
jdk下载地址:https://jdk.java.net/ (文末已经为大家下好了,放在网盘里) 进去后点8,win. 安装好后,使用java -version命令如下: 成功安装jdk! 为大家提供 ...
- Web安全入门学习--攻防世界web安全新手区过关心得
这几天也是废了小小功夫,完成了这十道题目. 这十道题目说难不难,说简单对刚入门的同学来说也没有那么简单,但是做完可以对web有最初步的了解 下面开始解题 1.view_source 作为第一题,这题还 ...
- WindowsPE文件格式入门04.导入表
https://bpsend.net/thread-307-1-1.html PE 内部保存了导入的dll 和 api信息,这些信息保存到一个表里面.称为导入表, 导入表就是 记住一个可执行文件导入了 ...
- CV中常用Backbone-3:Clip/SAM原理以及代码操作
前面已经介绍了简单的视觉编码器,这里主要介绍多模态中使用比较多的两种backbone:1.Clip:2.SAM.对于这两个backbone简单介绍基本原理,主要是讨论使用这个backbone. 1.C ...
- Linux软件安装目录分类讲解
参考:https://blog.csdn.net/qq_22771739/article/details/83933473 /usr:系统级的目录,可以理解为C:/Windows/,/usr/lib理 ...
- 超实用!Dify快速接入本地MCP服务
Dify 可以通过插件实现 MCP 服务调用,而被调用的 MCP 服务基本可以分为以下两类: 通用 MCP 服务(非本地 MCP 服务). 本地 MCP 服务. 本地 MCP 服务指的是本地通过 Ja ...
- opencv检测黑色轮廓(矩形)
opencv检测黑色轮廓: import cv2 import numpy as np class ShapeDetector: def __init__(self, image_path): sel ...
- Docker Compose部署随机图API
Docker Compose部署随机图API 平时我们部署博客的时候,为了考虑美观会考虑使用随机图来作为文章的封面,现在有很多大佬愿意提供随机图API,通过API我们可以很方便地部署随机图,不必自己寻 ...