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

时间:2016-06-23 20:58:18

标签: c# unity3d

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

我创建了我的上下动画,并将它们设置为使用动画窗口播放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;唐博尔是假的。

enter image description here

以下是我实施的代码:

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;
    }

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

1 个答案:

答案 0 :(得分:0)

我过去常常为这种情况创建四个剪辑

  1. Move_Down
  2. Idle_Down
  3. Move_Up
  4. Idle_Up
  5. 我告诉动画师播放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()中的动画师位置/旋转值。

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