unity动画机_unity 获取动画机状态 - CSDN
精华内容
参与话题
  • Unity动画状态Animator使用

    万次阅读 多人点赞 2020-09-30 19:54:38
    unity可以用两种方式控制动画 1 Animations,这种方式简单,直接 Play(“Idle”) 或者 CorssFade(“Idle”) 就可以播放动画 2 Animator,5.x之后推荐使用这种方式,因为里面可以加上混合动画,让动画切换更加平滑 ...

    一、前言

    Unity可以用两种方式控制动画
    1 Animation,这种方式简单,直接 Play(“Idle”)或者CorssFade(“Idle”)就可以播放动画;
    2 AnimatorUnity5.x之后推荐使用这种方式,因为里面可以加上混合动画,让动画切换更加平滑。

    二、Animator组件

    你通过Animation窗口(快捷键是Ctrl+6)中的Create New Clip创建Animation时,一个 Animator已经悄无声息地出现在了对应的GameObject
    在这里插入图片描述

    三、Animator Controller文件

    在第一步中生成的Animator组件上, 第一个Controller参数在创建Animator时已经被赋值了,可以点击该值,并切换到Project窗口下,会发现这个 Controller对应的文件是一个.controller文件。
    Animator Controller就是动画控制器,负责在不同的动画间切换,属于制作动画效果的必备原件。

    在这里插入图片描述

    注意,你也可以通过GameObject上的 Add Component添加一个崭新的 Animator组件,但是这种情况下 AnimatorController参数默认为空,所以需要我们手动将事先准备好的.controller文件拖拽到该参数位置,动画控制器才能正常工作。

    四、Animation Clip文件

    双击 .controller"文件,会弹出一个 Animator窗口,该窗口中显示的就是动画控制器文件中的所有内容(也可以在顶部的工具栏通过 Window - Animator打开这个界面)
    在这里插入图片描述
    Project窗口右键单击,选择Create->Animation创建Animation Clip.anim文件)
    在这里插入图片描述
    在这里插入图片描述
    再把.anim文件拖拽进Animator窗口,作为Animator Controller的一个状态(State
    在这里插入图片描述
    通过Animator创建出来的Animation Clip无法直接通过挂Animation组件进行播放,如果强行播放,Console会报一条警告信息:

    The AnimationClip 'XXX' used by the Animation component 'XXX' must be marked as Legacy.
    

    以及一条提示信息

    Default clip could not be found in attached animations list
    

    如下
    在这里插入图片描述
    为什么呢?
    如果我们把Inspector切换为Debug模式
    在这里插入图片描述
    可以看到Animation Clip有个Legacy勾选框
    在这里插入图片描述
    Legacy是遗产的意思,也就是传统的通过Animation组件来播放Animation Clip的做法,如果使用Animation组件来播放Animation Clip,则必须把Legacy勾选上,不过这种方式已经是过时的做法,推荐使用Animator来播放Animation Clip

    五、 状态机的状态(State)

    每个Animator Controller都会自带三个状态:Any State, EntryExit
    在这里插入图片描述

    1、Any State状态

    表示任意状态的特殊状态。例如我们如果希望角色在任何状态下都有可能切换到死亡状态,那么Any State就可以帮我们做到。当你发现某个状态可以从任何状态以相同的条件跳转到时,那么你就可以用Any State来简化过渡关系。

    2、Entry状态

    表示状态机的入口状态。当我们为某个GameObject添加上Animator组件时,这个组件就会开始发挥它的作用。
    如果Animator Controller控制多个Animation的播放,那么默认情况下Animator组件会播放哪个动画呢? 由Entry来决定的。
    但是Entry本身并不包含动画,而是指向某个带有动画的状态,并设置其为默认状态。被设置为默认状态的状态会显示为 橘黄色。
    在这里插入图片描述
    当然,你可以随时在任意一个状态上通过 鼠标右键->Set as Layer Default State更改默认状态。
    在这里插入图片描述

    记住, EntryAnimator组件被激活后 无条件 跳转到默认状态,并且每个Layer有且仅有一个默认状态。

    3、Exit状态

    表示状态机的出口状态,以红色标识。如果你的动画控制器只有一层,那么这个状态可能并没有什么卵用。但是当你需要从子状态机中返回到上一层(Layer)时,把状态指向Exit就可以了。
    在这里插入图片描述

    六、动画状态的属性

    我们可以选中某个自定义状态,并在Inspector窗口下观察它具有的属性
    在这里插入图片描述

    属性名 描述
    Motion 状态对应的动画。每个状态的基本属性,直接选择已定义好的动画(Animation Clip)即可
    Speed 动画播放的速度。默认值为1,表示速度为原动画的1.0倍。
    Mutiplier 勾选右侧的Parameter后可用,即在计算Speed的时考虑 区域1 中定义的某个参数。若选择的参数为smooth, 则动画播放速度的计算公式为 smooth * speed * fps(animation clip中指定)
    Mirror 仅适用于humanoid animation(人型机动画)
    Cycle Offset 周期偏移,取值范围为0-1.0,用于控制动画起始的偏移量。把它和正弦函数的offset进行对比就能够理解了,只会影响起始动画的播放位置。
    Foot IK 仅适用于humanoid animation(人型机动画)
    Write Default 最好保持默认,感兴趣可以参考官方手册
    Transitions 该状态向其他状态发起的过渡列表,包含了Solo和Mute两个参数,在预览状态机的效果时起作用
    Add Behaviour 用于向状态添加“行为”

    七、状态间的过渡关系(Transitions)

    直观上说它们就是连接不同状态的有向箭头
    在这里插入图片描述

    要创建一个从状态A状态B的过渡,直接在状态A上 鼠标右键 - Make Transition并把出现的箭头拖拽到状态B上点击鼠标左边即可。
    在这里插入图片描述

    八、添加状态控制参数

    参数有FloatIntBoolTrigger
    在这里插入图片描述
    FloatInt用来控制一个动画状态的参数,比如速度方向等可以用数值量化的东西,
    Bool用来控制动画状态的转变,比如从走路转变到跑步,
    Trigger本质上也是bool类型,但它默认为false,且当程序设置为true后,它会自动变回false

    如下这里创建一个Int类型的参数AnimState
    在这里插入图片描述

    九、编辑切换状态的条件

    点击连线,在Inspecter窗口中可以进行设置,在Conditions栏下可以添加条件,如下图表示当参数
    AnimState0时会执行这个动画Any StateNew Animation2的过渡

    必须在Parameters面板中添加了参数才可以在这里查看到,其次添加的条件为&&”与”关系,即必须同时满足。

    在这里插入图片描述

    十、代码中控制状态

    我们可以通过代码来设置条件状态,达到动画切换的目的

    Animator ator = go1.GetComponent<Animator>();
    ator.SetInteger("AnimState", 0);
    

    上面的代码,让AnimState这个参数值为0,满足了从Any StateNew Animation2的过渡条件,从而实现New Animation2动画的过渡。

    十一、检查动画状态

    方法1、AnimatorStateInfo

    在脚本中添加代码

    //检查是否正在播放jump动画.
    AnimatorStateInfo stateinfo = anim.GetCurrentAnimatorStateInfo(0);   
    bool playingJump = stateinfo.IsName("jump");
    if(playingJump)
    {
    	if(stateinfo.normalizedTime < 1.0f)
    	{
    		//正在播放
    	}
    	else
    	{
    		//播放结束
    	}
    	
    }
    

    当处于状态jump,则stateinfo.IsName("jump")返回true

    方法2、继承StateMachineBehaviour

    Animator的每个状态都可以挂载脚本,创建脚本,继承于StateMachineBehaviour类,用于检测状态机中动画切片(Anamation)的运行状态。
    官方示例:https://docs.unity3d.com/ScriptReference/StateMachineBehaviour.html
    将脚本挂载在对应的状态上即可。代码如下

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class JumpState : StateMachineBehaviour
    {
        private GameObject player;
    
    
        override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
        {
            // 正在played的状态的第一帧被调用
            Debug.Log("------OnStateEnter------------");
        }
    
        // OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks
        override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
        {
            
        }
    
        // OnStateExit is called when a transition ends and the state machine finishes evaluating this state
        override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
        {
            // 转换到另一个状态的最后一帧 被调用
            Debug.Log("-------------OnStateExit-----------------");
        }
    
        // OnStateMove is called right after Animator.OnAnimatorMove()
        override public void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
        {
        	// 在OnAnimatorMove之前被调用 
            
        }
    
        // OnStateIK is called right after Animator.OnAnimatorIK()
        override public void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
        {
            // 在OnAnimatorIK之后调用,用于在播放状态时的每一帧的monobehavior。
            // 需要注意的是,OnStateIK只有在状态位于具有IK pass的层上时才会被调用。
            // 默认情况下,图层没有IK通道,所以这个函数不会被调用
            // 关于IK的使用,可以看看这篇文章《Animator使用IK实现头部及身体跟随》
            // https://www.jianshu.com/p/ae6d65563efa
        }
    }
    

    十二、控制播放速度

    Animator ator = go1.GetComponent<Animator>();
    var stateinfo = ator.GetCurrentAnimatorStateInfo(0);
    if(stateinfo.IsName("Jump"))
    {
    	ator.speed = 2;
    }
    

    十三、注意事项

    1 取消勾选 Can Transition To Self,不然动画会出现抖动
    在这里插入图片描述

    2 动作循环。不然如果没有下个状态切换,直接停止动作
    在这里插入图片描述

    3 Has Exit Time,如果勾选了,则表示在该动作完成后才允许切换,但是一般我们要的都是立即切换,所以这里 不要勾选
    在这里插入图片描述

    十四、补充

    1、Mirror

    镜像,可以反转当前动画,减少动画师工作量
    在这里插入图片描述

    2、Solo与Mute

    Mute相当于把目标过渡禁用掉。Solo表示只生效这一条过渡
    可以多选,当选中后会出现箭头提示
    条件满足优先于Solo/Mute,当条件没有满足时依然不会过渡
    在这里插入图片描述

    展开全文
  • Unity动画状态Animator使用解析

    千次阅读 2018-06-27 00:13:54
    Animator,5.x之后推荐使用这种方式,因为里面可以加上混合动画,让动画切换更加平滑下面就和大家介绍下动画状态Animator的使用。1、导入模型及动作,做成预制件(perfab)直接把整个模型文件夹拷入对应位置,...
    Unity可以用两种方式控制动画
    1. Animations,这种方式简单,直接 Play(“Idle”) 或者 CorssFade(“Idle”) 就可以播放动画
    2. Animator,5.x之后推荐使用这种方式,因为里面可以加上混合动画,让动画切换更加平滑

    下面就和大家介绍下动画状态机Animator的使用。

    1、导入模型及动作,做成预制件(perfab)

    直接把整个模型文件夹拷入对应位置,unity会自动import进来

    • 把模型拖进场景
    • 然后报贴图拖到模型的身上

    • 将 Hierarchy 中,新建一个 空对象xiaoGO,把模型丢到xiaoGO作为子节点,然后把xiaoGO拖入 Project 中做成预制件

    2、将模型骨骼转换成unity中的 Humanoid


    • 第4步点击之后,有个弹窗,点 Save 即可。
    • 如果转换成功 Configure 前面显示 v ,失败则显示 x
    • 第5步则更新相关的动画

    3、添加状态机控制器

    添加控制器脚本 animCtrl2

    为模型aisake(aisakeGO对象下的aisake节点)添加 Animator 组件,拖入 animCtrl2 到 Controller ,选择人物镜像Avatar(转换为Humanoid之后才会出现在选择列表中)

    4、编辑状态机控制器

    编辑状态机控制器
    • 双击 animCtrl2,会出来一个 Animator 面板,拖入三个动作作为状态(第一个拖入的作为默认状态,不过可以右键 Default State 设置其他状态为默认状态)
    • 右键 AnyState,Make Transition 连接到三个状态
    • 添加状态控制参数 AnimState,是个整形(一般来说用枚举,不过这里没枚举类型,但可以强转成int)

    编辑切换状态的条件

    点击连线,添加个条件,这个条件只会显示刚才添加的状态控制参数 AnimState,设置等于0是切到这个状态

    取消勾选 Can Transition To Self,不然动画会出现抖动

    其他两个一样,设置不同的条件即可

    关于 AnyState中的Transitions,看这里 http://blog.csdn.net/yangxuan0261/article/details/52334359

    4、代码中控制状态

    加个按钮去控制,按钮脚本
    AخA
     
    1
    public class btnCtrl : MonoBehaviour 
    2
        private int mAnimIndex = 0;
    3
        private int mAnimTotal = 3;
    4
        void Start () 
    5
            OnClicked1();
    6
        
    7
        public void OnClicked1()
    8
        
    9
            GameObject go1 = GameObject.Find("aisakeGO");
    10
            GameObject go2 = GameObject.Find("xiaoGO");
    11
            Animator ator1 = go1.GetComponentInChildren&lt;Animator&gt;();
    12
            Animator ator2 = go2.GetComponentInChildren&lt;Animator&gt;();
    13
            if(ator1 &amp;&amp; ator2)
    14
            
    15
                //Debug.LogFormat("--- has ator1 &amp;&amp; ator2, animIndex:{0}", mAnimIndex % mAnimTotal);
    16
                ator1.SetInteger("AnimState", mAnimIndex % mAnimTotal); //设置状态控制参数值,用来切状态
    17
                ator2.SetInteger("AnimState", mAnimIndex % mAnimTotal);
    18
            
    19
            mAnimIndex++;
    20
        
    21

    5、完成


    注意事项

    动作循环。不然如果没有下个状态切换,直接停止动作

    Animator 中的 Avater 没有对应模型,那是因为没有模型没有转换成unity中的 Humanoid,参照第二步

    使用 Animator组件 后就不需要 Animation组件

    Has Exit Time,如果勾选了,则表示在该动作完成后才允许切换,但是一般我们要的都是立即切换,所以这里 不要勾选

    取消勾选 Can Transition To Self,不然动画会出现抖动。
    www.nainaitea.com


    展开全文
  • 今天做红白坦克大战项目,吃到五角星坦克会升级,这就涉及到Animator的动画切换。我看了Unity的官方文档。AnimatorOverrideController官方API说明,里面讲解的更加细致。我刚开始看不懂,慢慢琢磨才看懂一些皮毛。...

    本博客内容确实非常浅显,也就是说很适合像我这样的初学者,日后会根据我的学习不断更新此文章。

    今天做红白机坦克大战项目,吃到五角星坦克会升级,这就涉及到Animator的动画切换。我看了Unity的官方文档。AnimatorOverrideController官方API说明,里面讲解的更加细致。我刚开始看不懂,慢慢琢磨才看懂一些皮毛。简而言之,动画的切换(不是单纯的同一角色的动画切换。)是依靠状态机的重写来实现的。状态机的重写在这里不再赘述。在Project视图中Creat一个Animator Override Controller然后将你要重载的状态机控制器拖入Controller即可。

    然后我们开始实现吃到五角星Controller的切换,首先我们在脚本新建一个public AnimatorOverrideController[] tankatate;

    然后将你的重载控制器拖进来。

    然后我们在角色与五角星碰撞的脚本private void OnTriggerEnter2D(Collider2D collision)里面添加判定逻辑。

    这里的tankLevel是PlayerManager里的单例公有整型变量。Up是五角星的Tag。

    private void OnTriggerEnter2D(Collider2D collision)
        {
            switch (collision.tag)
            {
                case "Up":
                    Destroy(collision.gameObject);
                    if(PlayerManager.Instance.tankLevel<3)
                    {
                        PlayerManager.Instance.tankLevel++;
                    }
                    break;
                default:
                    break;
            }
        }

    然后我们在Update()里写上

    if(PlayerManager.Instance.tankLevel>=0)
            {
                Animator animator = GetComponent<Animator>();
                animator.runtimeAnimatorController = tankatate[PlayerManager.Instance.tankLevel];
    
            }

    就可以实现简单的动画状态切换了。有不懂的或者有更好的实现方法的可以在下面留言,大家一起交流,一起进步。

     

    展开全文
  • unity 动画状态重复利用

    千次阅读 2018-10-16 14:25:18
    unity 动画状态重复利用 在unity 项目工程里,常有几十个NPC,几十个小怪的动画状态都是相同的,类似于这个情况,可以只需要制作一套状态,复制到每个动画的文件夹里面,然后就是拉入动画了。 这个的...

    unity 动画状态机重复利用

    在unity 项目工程里,常有几十个NPC,几十个小怪的动画状态机都是相同的,类似于这个情况,可以只需要制作一套状态机,复制到每个动画的文件夹里面,然后就是拉入动画了。这里写图片描述
    这里写图片描述
    这个的前提就是每个动画里面都是相同的,大家的状态机都是一样的。
    下面的工具就是方便来导入动画的,是相应的动画状态机保持着相应的动画。

    代码和介绍

    [MenuItem("Assets/替换为当前文件夹的动画")]
        public static void ReplaceAnimatorClips()
        {
            Object animObj = Selection.activeObject;
            AnimatorController animator = animObj as AnimatorController;
    
            string folderpath = Path.GetDirectoryName(AssetDatabase.GetAssetPath(animObj));
            GetAllFiles(folderpath);
    
            if (files.Count <= 0) return;
    
            animationClips.Clear();
            for (int i = 0; i < files.Count; i++)
            {
                string name = Path.GetFileNameWithoutExtension(files[i]);
                string[] names = name.Split('@');
                if (names.Length == 2)
                {
                    string clipname = names[1];
                    animationClips[clipname.ToLower()] = files[i];
                }
            }
    
            ChildAnimatorState[] childstates = animator.layers[0].stateMachine.states;
            foreach (var childstate in childstates)
            {
                AnimatorState state = childstate.state;
                Motion mo = state.motion;
                if (mo == null)
                {
                    Debug.LogError(state.name + "节点动作是空");
                    continue;
                }
                if (mo.GetType().Equals(typeof(BlendTree)))
                {
                    BlendTree tree = (BlendTree)mo;
                    ReplaceMotionInLocalFolder(tree);
                }
                else
                {
                    ReplaceMotionInLocalFolder(state);
                }
            }
            AssetDatabase.SaveAssets();
        }
    

    [MenuItem(“Assets/替换为当前文件夹的动画”)]
    这句代码我们选中所需要的状态机就可以鼠标右键来快捷方式调用这个方法了。

    在判断动画状态机里面不为空的时候,就可以去改变里面的动画片段了。
    在这里我们分为两种,一种是普通动画,一种是BlendTree。

     if (mo.GetType().Equals(typeof(BlendTree)))
                {
                    BlendTree tree = (BlendTree)mo;
                    //取代BlendTree里面的动画
                    ReplaceMotionInLocalFolder(tree);
                }
                else
                {
    	            //取代普通的动画
                    ReplaceMotionInLocalFolder(state);
                }
    

    普通的动画

     public static void ReplaceMotionInLocalFolder(AnimatorState state)
        {
            string name = state.motion.name;
            if (GetLocalMotionFile(name) != null)
            {
                state.motion = GetLocalMotionFile(name);
            }
        }
    

    这里是更换普通的动画片段,只需要把普通的名字传进去,更换一下就是可以的了。
    同时看下 GetLocalMotionFile 函数

    //animationClips 为动画片段
        static Dictionary<string, string> animationClips = new Dictionary<string, string>();
        public static Motion GetLocalMotionFile(string name)
        {
            if (animationClips.ContainsKey(name.ToLower()))
            {
                AnimationClip mo = AssetDatabase.LoadAssetAtPath(animationClips[name.ToLower()], typeof(AnimationClip)) as AnimationClip;
                if (mo != null)
                {
                    return mo;
                }
                else
                {
                    Debug.LogWarning("no this name clip in this folder" + name);
                }
            }
            else
            {
                Debug.LogWarning("no this name clip in this folder" + name);
            }
            return null;
        }
    
    展开全文
  • Unity动画知识之二:Animator动画状态

    万次阅读 多人点赞 2016-11-09 00:58:10
     上次我们讲过Unity游戏动画从入门到住院,今天我们来讲一下动画状态。  好了,现在我们已经成功的导入了动画。接下来要玩的东西就很装13啦。因为大部分动画师是用不到这家伙的,需要掌握这个技能的,至少也...
  • 直接选中多张动画拖拽到场景中,unity默认会创建一个动画,并创建出一个动画控制; 2.手动创建动画,首先拖拽一张精灵图片到场景中然后选中,再点击window-animation,弹出animation窗口,点击creat,随后可以...
  • Unity3D 之3D动画机设置

    2019-01-09 02:35:06
    新建一个动画机 然后创建一些动画的属性 每根线都是一个动画到下一个动画的转变,动画的转变是基于条件的。 1.通过建立Parameters设定动画的转换条件 2.右边的Conditions设定可以设定是在什么情况下进行抓换...
  • // 创建状态 void Start() { ani = this.GetComponent(); 获取物体上的animator组建 } void Update() { AnimatorStateInfo info =animator.GetCurrentAnimatorStateInfo(0); if
  • 本文将由Unity工程师Catherine Proulx,为大家深入讲解状态的转换和中断相关的细节。 最近处理了一个用户报告的很棘手的Bug,这个Bug涉及到空状态、覆盖层和转换中断的组合。当进一步深入研究这个Bug的时候,我...
  • Unity 控制动画状态

    千次阅读 2017-12-05 23:30:38
    unity控制动画的两种方式 (1) Animation 先在GameObject上添加一个Animation组件,在gameobject脚本中添加 transform.GetComponent().Play(“run”);控制动画播放,,在unity 5x中,动画必须为legency; (2...
  • unity动画无法运行

    2013-08-05 08:42:18
    unity4.0以上版本都会遇到一个问题,那就是在3dmax中做的模型的动画运行时不播放:  原因分析:在hierarchy窗口选中带动画的物体,发现在我们所熟知的inspector窗口没有animation这一组件,取而代之的是animator...
  • Unity 动画结束事件

    千次阅读 2017-07-04 20:31:24
    在用Unity开发游戏 动画播到某一帧就要干什么事情. 希望能得到回调.   函数名字记得在使用这个动画的物体的脚本里面写好,否则会报错。 用你的鼠标在时间上点一下就会有一条红线。 点击事件帧 能看到插入动画...
  • 最后发现一个无语的unity动画机bug,从另一个状态机拷贝过来(整个全部拷贝),anystate到其他状态的过渡就会失效(过渡线箭头还在),而且只要是连接在anystate上的过渡线还竟然取消不了。。。只能重新连接!!这...
  • 摘要:【长文预警,建议先收藏】有了模型和多个动画以后,在Unity中如何控制它们的播放和切换呢?本文带你一站式解析Unity的Animator模块。 洪流学堂,让你快人几步。你好,我是跟着大智学Unity的萌新,我叫小新,...
  • 我们的这个项目是2d横版手游,但是场景是3D的,动画是由2d骨骼动画结合unity的状态做的,但是我现在碰到一个问题就是,当我由移动(动画名)转向移动攻击时(动画名),人物本来是左腿在前变为了右腿在前,这就涉及到...
  • Unity 动画系统的使用

    千次阅读 2019-05-25 14:32:53
    Unity 动画系统采用状态,将每一个动画视为一个状态,根据用户的输入来改变状态中的条件,利用该特定的条件来控制状态的切换,从而实现动画的改变。下面将从四个步骤来展示动画系统的使用方法。 在Project中...
  • 自己做了一个动画,可总是节奏感不对,要不快了,要不慢了。没有想要的效果。一直也没找到原因。...废话少说,想用这个效果的可以在UNity状态里勾选hush exit time,不要的可以直接在状态里...
  • Unity Animator 动画没切换

    千次阅读 2016-04-12 11:58:50
    恶魔射手(Survival Shooter)项目,有两个动画,一个是静止时的Idle,一个是走路时候的Move,如下图↓设置好动画状态后发现按方向键后还是Idle,没反应,而一直按着方向键后呢又动起来了,最后找到了真相。...
  • Unity战斗框架 优化Animator动画机排线1.优化前后效果图2.优化方法3.优劣 1.优化前后效果图 优化前 优化后 2.优化方法 前后的布线差距非常大,简直是从一团乱麻变味了井井有条,这一切都得益于AnyState...
  • unity-动画中加入触发事件

    万次阅读 2016-08-27 16:01:20
    animator动画状态模式(传送门)和animation模式下加入事件 1、animator模式 首先在模型上挂个脚本 代码如下public class charEvents : MonoBehaviour {public void ActionEvent1(string _arg1) { Debug.LogFo
1 2 3 4 5 ... 20
收藏数 27,606
精华内容 11,042
关键字:

unity动画机