首页 文章

使用AniMate和Unity3D的动画不与物理对象交互

提问于
浏览
1

我正在用Unity3D设计一个迷宫 . 迷宫有许多分叉,玩家将在每次分叉前停下来,只需选择左或右 . 然后一个自动动画将让玩家通过下一个分叉直到迷宫结束(或直到死胡同) .

要为我在Unity项目中使用AniMate和C#的播放器设置动画 . 使用AniMate我只是为每个分叉创建一个点对点动画(例如下面的法师:从开始/红色箭头到第5点)
maze and animation with AniMate in Unity

我的问题是我的动画脚本(与“第一人称控制器”相关联)无法正常工作,因为物理不受尊重(玩家穿过墙壁) . 如果在同一个项目中我启用了Unity中的标准角色控件,那么我可以在迷宫中使用墙壁的物理限制等进行导航......(即我有碰撞器) .

这是我按左键从起点,从第1点到第2点时使用的代码示例:

void FixedUpdate () {
if (Input.GetKey(KeyCode.LeftArrow)) {
//To point 1
    Hashtable props = new Hashtable();
    props.Add("position", new Vector3(756f,112f,1124f));
    props.Add("physics", true);
    Ani.Mate.To(transform, 2, props);

//To point 2            
    Hashtable props2 = new Hashtable();
    props2.Add("position", new Vector3(731f,112f,1124f));
    props2.Add("physics", true);
    Ani.Mate.To(transform, 2, props2);
}
}

当我按下左箭头按钮时实际发生的事情是玩家使用穿过墙壁的直线直接移动到第2点 . 我试图传递给AniMate“Physics = true”,但它似乎没有帮助 .

有关如何解决这个问题的任何想法?

或者......任何关于如何获得更优化代码的提示,只需使用一系列vector3坐标(每个点一个)来获得我想要的简单动画,而不必声明新的Hashtable();等......每一次?我之所以选择AniMate只是因为1.我是Unity 2的初学者 . 我不需要复杂的动画(例如我不需要使用iTween),只需沿着直线修复动画,我需要一些非常简单快速的动画 . 在脚本中实现 . 但是,如果某人有一个同样简单的解决方案,那将是受欢迎的 .

预先感谢您的帮助

1 回答

  • 1

    使用像AniMate这样的补间引擎,您总是直接为对象的位置设置动画,忽略可能发生的任何物理碰撞 . 如果您希望对象正确碰撞或使用关节,则必须使用力来移动它并且不能直接改变其位置 .

    您可以补间影响物理的对象,但补间对象不受其他物理对象的影响 . 你也应该让你刚刚运动的刚体 .

    AniMate中的物理选项并不意味着对象受物理影响的其他对象,它只是改变补间的应用方式(在FixedUpdate而不是Update中),以确保补间对象正确影响其他物理对象 .

    在您的示例中,两个补间同时启动,第二个补间覆盖第一个补间(这就是对象直接转到第二个点的原因) . 在开始第二个补间之前,您必须等待第一个补间完成 .

    最简单的方法是使用Coroutine:

    void FixedUpdate () {
        if (Input.GetKey(KeyCode.LeftArrow)) {
            StartCoroutine(TweenCoroutine());
        }
    }
    
    IEnumerator TweenCoroutine() {
        // To point 1
        Hashtable props = new Hashtable();
        props.Add("position", new Vector3(756f,112f,1124f));
        props.Add("physics", true);
        // Start first tween and wait for it to finish
        yield return Ani.Mate.To(transform, 2, props);  
    
        // To point 2
        Hashtable props2 = new Hashtable();
        props2.Add("position", new Vector3(731f,112f,1124f));
        props2.Add("physics", true);
        // Start second tween and wait for it to finish
        yield return Ani.Mate.To(transform, 2, props2);
    
        // etc...
    }
    

    AniMate不支持运动路径 . HOTween确实并且允许您传递补间对象然后经过的点列表 .

    还有一个new version的AniMate(现在的Animate)可用,它具有流畅的界面,可以在C#中使用得更好 .

相关问题