【游戏开发】[用代码创建unity5.X的动画状态机]

本文分享如何使用代码在Unity5.x中创建一个运行时可用的动画状态机,允许在游戏运行时动态调整动画行为,提供了一种不同于Unity编辑器内置功能的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

不废话 上代码

可能有的人 会质疑  这不是editor的功能吗

是的 但是这个允许在运行时候使用 你们跟一下代码看看继承于哪里就知道了

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEditor.Animations;
using System.IO;

public class test: MonoBehaviour
{
    // Use this for initialization
    void Start()
    {
        CreateAnimationcontroller();
    }
    private void CreateAnimationcontroller()
    {
        AnimatorController controller = AnimatorController.CreateAnimatorControllerAtPath("Assets/animation.controller");//here is input path
        AnimatorControllerLayer layer = controller.layers[0];                    // layer
        AnimatorStateMachine machine = layer.stateMachine;                       //取到baselayer下的状态机(PS 英语不够用了)
        
        CreatTransline("Assets/_SandBox/anime_xiaoguai_02_daiji.FBX", layer);<span style="white-space:pre">	</span>//creat the animationcontroller                                                                              
        this.AddCondition(controller);                                            //添加转换条件
    }

    private static void CreatTransline(string path, AnimatorControllerLayer layer)
    {
        AnimatorStateMachine machine = layer.stateMachine;                      //获取到当前状下的状态机
        AnimationClip newClip = AssetDatabase.LoadAssetAtPath(path, typeof(AnimationClip)) as AnimationClip;//加载动画剪辑

        AnimatorState state = machine.AddState("first");                         //可以以动画名字 创建状态
        AnimatorState one = machine.AddState("one");
        state.motion = newClip;                                                 //状态的动画 赋值为上面的动画剪辑
        one.motion = newClip;
        state.AddTransition(one);                                               //添加一个状态转移线(PS 这是第一个添加的状态 也就会被系统设为默认状态 有可能有很多状态转移线 
                                                                                //记住添加状态的顺序 或者用列表按顺序存起链接过的状态 方便知道 状态线的另一端是什么状态 以便调试)
        one.AddTransition(state);
        one.transitions[0].hasExitTime = false;                                 //transitions[0]当前状态线的列表  原理同上  这里设置是否有结束时间  默认有 我们设置没有
        one.transitions[0].AddCondition(AnimatorConditionMode.IfNot,0,"isrun"); //添加状态 3个参数 第一个 文档里说的是版本 其实是触发状态(如果状态是参数1即触发转换)
                                                                                //                  第二个 阀值(ps 不知道干啥的)
                                                                                //                  第三个 条件的名字 要和刚才做好的一样
        //one.transitions[1].hasExitTime = true;
       // AnimatorStateTransition trans = machine.AddAnyStateTransition(state);
    }

    private void AddCondition(AnimatorController control)
    {
        control.AddParameter("isrun", AnimatorControllerParameterType.Bool);    //建立一个状态 名字 类型
   //     controller.AddParameter("one->first", AnimatorControllerParameterType.Trigger);
    }

    // Update is called once per frame
}
</pre><pre name="code" class="csharp">
</pre><pre name="code" class="csharp">2016.7.28 更新 
不少朋友反映  看着吃力  建议大家 手动做一次状态机  然后对照代码 就能理解的很快了
</pre><pre name="code" class="csharp">
2016.10.19更新
我们做这个工能是为了动态创建出状态机并赋值给相应的模型,目的是达到一种 纯代码做出游戏的效果(吹个牛逼)


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值