我对动画遇到了令人沮丧的问题。我有一个产生平台的预制件,我附加了动画,并且当玩家对象落在它上面时,我想将平台从其原始位置移动移动平台,当玩家坐在上面时保持向下然后,当玩家退出碰撞(即跳下)时,然后移回原位。
我创建了我的上下动画,并将它们设置为使用动画窗口播放ONCE。然后我将平台拖到我的项目中,使其成为预制件并将其插回到我的spawn脚本中。
当玩家碰撞(落在平台上)时,我在这里调用向下动画:
void OnCollisionEnter (Collision col) {
GameObject platform = col.gameObject;
//platform.GetComponent<Animation> ().Play ("down1");
if (!playedAnim1) {
platform.GetComponent<Animation> ().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<Animation> ().Play ("up1");
touchingPlatform = false;
Debug.Log ("exiting platform");
}
为了让动画只播放一次,我设置了一个名为playedAnim1
的布尔标志。我认为这会使动画只播放一次,但当播放器落在平台上时,它会反复播放几次。就好像当玩家落在平台上时,尽管动画是正确的,但平台向上移动而不是向下移动。
我尝试过直接更改col.transform.position
,但这也不起作用。当玩家降落时,我怎样才能让平台向下移动并留在那里,当它离开时备份?
编辑:我已在此处连接转换,其中参数bool isDown
的Down-&gt; Idle down为true,Idle down-&gt; up bool isDown为false,Up - &gt;空闲参数bool isUp为true,Idle up-&gt;唐博尔是假的。
以下是我实施的代码:
void OnCollisionEnter (Collision col) {
Debug.Log ("enter");
col.gameObject.GetComponent<Animator> ().SetBool ("isUp", false);
animUpSwitch = false;
if (!animDownSwitch) {
animDownSwitch = true;
col.gameObject.GetComponent<Animator> ().SetBool ("isDown", true);
col.gameObject.GetComponent<Animator> ().Play ("down");
}
touchingPlatform = true;
}
void OnCollisionExit (Collision col) {
Debug.Log ("exit");
animDownSwitch = false;
col.gameObject.GetComponent<Animator> ().SetBool ("isDown", false);
if (!animUpSwitch) {
animUpSwitch = true;
col.gameObject.GetComponent<Animator> ().SetBool ("isUp", true);
col.gameObject.GetComponent<Animator> ().Play ("up");
}
touchingPlatform = false;
}
它仍然无法控制地上下移动
答案 0 :(得分:0)
我过去常常为这种情况创建四个剪辑
我告诉动画师播放Move_Down,剪辑完成后我将剪辑转换为Idle_down,所以除非剪辑被更改,否则基本上它会保持不变。 当用户从平台跳转时,我播放Move_Up,与之前剪辑结束后转换到动画中的Idle_Up状态之前相同。 Animator会继续播放相同的剪辑,除非您告诉它停止或更改代码。空闲剪辑是Extreme Y值。
我使用上面的步骤是因为它们很容易实现,而你可以只使用两个剪辑,但我更喜欢这种方法。
所以流程将是
anim.play(&#34; Move_Down&#34;) - &gt;过渡到&#34; Idle_Down&#34;
这将使它下降并留在那里 如果你想把它还回来
anim.play(&#34; Move_Up&#34;) - &gt;过渡到&#34; Idle_Up&#34;
如果玩家在达到平台的minY之前移动到下一个平台,你将不得不从转换中间开始剪辑恢复。
你必须注意的一件事是,如果你想要的话 修改变换的位置和旋转值,然后修改那些值 如果他们在剪辑中,那么你应该关闭动画师 动画师会消除位置/旋转值。虽然你可以 覆盖LateUpdate()中的动画师位置/旋转值。
希望这些信息对您有所帮助。