Unity,C# – 在碰撞输入时无法使对象从当前y位置向下移动?

我对动画有一个令人沮丧的问题。 我有一个产生平台的预制件,我附加了动画,并且当玩家物体落在它上面时,我想将平台从其原始位置向下移动,当玩家坐在它上面时保持向下,然后向后移动到当玩家退出碰撞(即跳出)时的原始位置。

我创建了我的上下动画,并将它们设置为使用动画窗口播放ONCE。 然后我将平台拖到我的项目中,使其成为预制件并将其插回到我的spawn脚本中。

当玩家碰撞(落在平台上)时,我在这里调用向下动画:

void OnCollisionEnter (Collision col) { GameObject platform = col.gameObject; //platform.GetComponent ().Play ("down1"); if (!playedAnim1) { platform.GetComponent ().Play ("down1"); playedAnim1 = true; } touchingPlatform = true; Debug.Log ("entering platform"); } void OnCollisionExit (Collision col) { playedAnim1 = false; GameObject platform = col.gameObject; //platform.SetActive (false); //platform.transform.position += new Vector3 (0f, -1f, 0f); //platform.GetComponent ().Play ("up1"); touchingPlatform = false; Debug.Log ("exiting platform"); } 

为了使动画只播放一次,我设置了一个名为playedAnim1的布尔标志。 我认为这会使动画只播放一次,但当玩家登陆平台时,它会反复播放几次。 就好像当玩家落在平台上时,尽管动画是正确的,但平台向上移动而不是向下移动。

我试过直接更改col.transform.position但这也不起作用。 当玩家落在平台上时,我怎样才能让平台向下移动并保持在那里,当它离开时备份?

编辑:我在这里连接了转换, isDown >空闲时参数bool isDown为true,空闲down-> up on bool isDown为false,Up – > Idle up参数bool isUp为true,Idle up-> Down bool isUp为false。

在此处输入图像描述

这是我实现的代码:

 void OnCollisionEnter (Collision col) { Debug.Log ("enter"); col.gameObject.GetComponent ().SetBool ("isUp", false); animUpSwitch = false; if (!animDownSwitch) { animDownSwitch = true; col.gameObject.GetComponent ().SetBool ("isDown", true); col.gameObject.GetComponent ().Play ("down"); } touchingPlatform = true; } void OnCollisionExit (Collision col) { Debug.Log ("exit"); animDownSwitch = false; col.gameObject.GetComponent ().SetBool ("isDown", false); if (!animUpSwitch) { animUpSwitch = true; col.gameObject.GetComponent ().SetBool ("isUp", true); col.gameObject.GetComponent ().Play ("up"); } touchingPlatform = false; } 

它仍然无法控制地上下移动

我曾经为这种情况创建了四个剪辑

  1. Move_Down
  2. Idle_Down
  3. 提升
  4. Idle_Up

我告诉动画师播放Move_Down,剪辑完成后我将剪辑转换为Idle_down,所以除非剪辑被更改,否则基本上它会保持不变。 当用户从平台跳转时,我播放Move_Up,与之前剪辑结束后在动画制作中转换为Idle_Up状态之前相同。 Animator会继续播放相同的剪辑,除非您告诉它停止或更改代码。 空闲剪辑是Extreme Y值。

我使用上面的步骤,因为它们很容易实现,而你只需要两个剪辑,但我更喜欢这种方法。

所以流程将是

anim.play(“Move_Down”) – >过渡到“Idle_Down”

如果你想把它还给它,它会让它停下来留在那里

anim.play(“Move_Up”) – >过渡到“Idle_Up”

此外,如果玩家在达到平台的minY之前移动到下一个平台,你将不得不从转换中间处理剪辑恢复。

这里要注意的一件重要事情是,如果你试图修改变换的位置和旋转值,那么如果它们在剪辑中那些值那么你应该关闭动画师,因为动画师将会移动位置/旋转值。 虽然您可以在LateUpdate()中覆盖动画师位置/旋转值。

希望这些信息对您有所帮助。