我正在使用Unity3D设计一个迷宫。迷宫有许多分叉,玩家将在每次分叉前停下来,只需选择左或右。然后一个自动动画会让玩家通过下一个分叉直到迷宫结束(或直到死路)。
为我在Unity项目中使用AniMate和C#的播放器设置动画。使用AniMate我只是为每个分叉创建一个点对点动画(例如下面的法师:从开始/红色箭头到第5点)
我的问题是我的动画脚本(与“第一人称控制器”相关联)无法正常工作,因为物理不受尊重(玩家穿过墙壁)。如果在同一个项目中我启用了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),只需沿着直线修复动画,我需要一些非常简单快速的动画。在脚本中实现。但是,如果某人有一个同样简单的解决方案,那将是受欢迎的。
提前感谢您的帮助
答案 0 :(得分:1)
使用像AniMate这样的补间引擎,您总是直接为对象的位置设置动画,忽略可能发生的任何物理碰撞。如果你想让一个物体正确碰撞或使用关节,你必须用力来移动它,不能直接改变它的位置。
您可以补间影响物理的对象,但补间对象不受其他物理对象的影响。你也应该让那些你正在补充运动的刚体。
AniMate中的物理选项并不意味着对象受物理影响的其他对象,它只是改变补间的应用方式(在FixedUpdate中而不是Update),以确保补间对象正确影响其他物理对象。 / p>
在您的示例中,两个补间同时启动,第二个补间覆盖第一个补间(这就是对象直接转到第二个点的原因)。在开始第二个补间之前,你必须等待第一个补间完成。
最简单的方法是使用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)avaialable,它有一个流畅的界面,可以在C#中使用得更好。