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; }
它仍然无法控制地上下移动
我曾经为这种情况创建了四个剪辑
- Move_Down
- Idle_Down
- 提升
- 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()中覆盖动画师位置/旋转值。
希望这些信息对您有所帮助。