【Unity&DragonBones】使用DragonBones的函数不能放Update函数的问题

49 篇文章 0 订阅
31 篇文章 1 订阅

在调试的过程中,还遇到下列问题


所生成项目的处理器架构"MSIL"与引用"AmplifyMotionEditor"的处理器架构"x86"不匹配。


上述问题,重启Unity就行了。



Unity5.5.0p4

1.正常情况
当我在Unity的start函数里面使用
person_armature.animation.Play("standing");
是可以正常动画的,并且是可以通过Insperctor视图,改变动画的状态

2.错误的情况
然而一旦自定义了一个新的函数 TestKey(),在把 TestKey()函数放入Update函数里面,动画就无法正常使用了。脚都抬不起来了

void Update()
    {
TestKey();
}

 private void TestKey()
    {
        if (Input.GetKey(mKeyRight) || Input.GetKey(mKeyLeft) || Input.GetKey(mKeyBackward) || Input.GetKey(mKeyForward) || Input.GetKeyDown(mKeyRight) || Input.GetKeyDown(mKeyLeft) || Input.GetKeyDown(mKeyBackward) || Input.GetKeyDown(mKeyForward))
        {
            person_armature.animation.Play("Walking");
        }//
        else
        {
             person_armature.animation.Play("standing");
        }//
    }//


麻烦看下,为什么不行。谢谢


----------------------------------------------------------------------------官方回复

这是比较低级的错误,跟 db 没有太大关系,可以参考这个问题https://github.com/DragonBones/DragonBonesCSharp/issues/17

armature.animation.play("走"); // 这个意思就是从第一帧播放走路动画。

想想下面的情形会发生什么。
每帧执行()
{
    armature.animation.play("走");
}


使用player.animation.GetState("Walk").isPlaying;来判断某动画是否正在播放

如果不是,就使用player.animation.play("Walk")


--------------------------------------------------------------------------------------------------------------------------------------------------------

解决方法如下所示:

 private void TestKey()
    {
        if (Input.GetKey(mKeyRight) ||
            Input.GetKey(mKeyLeft) ||
            Input.GetKey(mKeyBackward) ||
            Input.GetKey(mKeyForward) ||
            Input.GetKeyDown(mKeyRight) ||
            Input.GetKeyDown(mKeyLeft) ||
            Input.GetKeyDown(mKeyBackward) ||
            Input.GetKeyDown(mKeyForward))//当按下按键的时候
        {
                      if (person_armature.animation.lastAnimationName == "Running")//当骨骼动画的上一个动画状态是“跑步”
            {
                if (person_armature.animation.GetState("Running").isPlaying)//当骨骼动画的上一个动画状态是“跑步” 正在播放
                {
                    Debug.Log("::::::::: == " + status_Person);
                }
                else//当骨骼动画的上一个动画状态是“跑步” 没有 正在播放                {
                    person_armature.animation.Play("Running");
                }
            }
            else//当骨骼动画的上一个动画状态 不是  是“跑步”            {
                person_armature.animation.Play("Running");
            }
         }//IF判断 按键按下语句
     else
     { 
                      if (person_armature.animation.lastAnimationName == "Walking")
            {
                if (person_armature.animation.GetState("Walking").isPlaying)
                {
                    Debug.Log("::::::::: == " + status_Person);
                }
                else
                {
                    person_armature.animation.Play("Walking");
                }
            }
            else
            {
                person_armature.animation.Play("Walking");
            }
     }//else语句结束
 }//TestKey函数结束
为什么要加上  
当骨骼动画的上一个动画状态是“跑步”
的判断呢,因为 现在播放 的状态 是“ 走路”的时候,动画为“跑步”的动画,没有实例化

其余状态没有实例化,就对其进行赋值操作,就会 报错 ,并且无法编译


代码如下所示:(草稿部分   代码没有删除)





代码部分结束

--------------------------------------------------------------------------------------------------------------------------------------------------------

总结

失败时候:

想到,如果 动画状态改变,就要 获得当前动画状态和 改变播放动画状态


查找资料http://developer.egret.com/cn/apidoc/index/name/dragonBones.Animation#play

找到相关资料,找到 player.animation.isPlaying;

并没有思考 ,判断不同动画状态 是否正在播放

player.animation.GetState("Walk").isPlaying;


究其原因:没有仔细思考总结问题 ,为什么会出现这样的问题,是什么导致了当前的问题,

怎样解决对应的问题


运行成功:

大图

最好在if (person_armature.animation.lastAnimationName == "Walking")语句前面

加上一个 IF 判断 if (person_armature)

--------------------------------------------------------------------------------------------------------------------------------------------------------

参考资料:(本文章 未使用下列文章)

1.

【Unity 3D】学习笔记四十六:输入与控制??键盘事件

2.

3.

4.

5.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Unity中,回调函数是一种常见的编程模式,用于在特定事件发生时执行特定的代码。回调函数通常用于处理异步操作、事件触发和消息传递等情况。 Unity中的回调函数可以通过以下几种方式来实现: 1. 事件委托和事件:Unity中的事件系统允许你定义和触发自定义事件,并将回调函数附加到这些事件上。你可以使用事件委托来定义事件的签名,然后使用事件关键字创建事件。当事件被触发时,附加的回调函数将被调用。 2. MonoBehaviour生命周期函数:MonoBehaviour是Unity中所有脚本的基类,它提供了一系列生命周期函数,如Start、Update、FixedUpdate等。你可以重写这些函数,并在特定的时间点执行你的代码。例如,在Start函数中初始化游戏对象,在Update函数中更新游戏逻辑。 3. 委托和Lambda表达式:Unity也支持使用委托和Lambda表达式来实现回调函数。你可以定义一个委托类型,并将其作为参数传递给其他方法。然后,你可以使用Lambda表达式来创建匿名方法,并将其作为回调函数传递给委托。 4. UnityEvent:Unity还提供了UnityEvent类,它是一种可序列化的事件类型。你可以在脚本中声明一个UnityEvent类型的公共字段,并在Inspector面板中将回调函数附加到该事件上。当事件被触发时,附加的回调函数将被调用。 总结一下,Unity使用回调函数的方式包括事件委托和事件、MonoBehaviour生命周期函数、委托和Lambda表达式以及UnityEvent。这些方法可以帮助你在特定的事件发生时执行特定的代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值