Unity3d:CharacterController不会停留;不可能连续发挥脚步音效

时间:2014-08-23 10:48:35

标签: c# unity3d

我需要检查我的角色何时接地,这样当他跌落某些东西(或在空中跳跃)时我不会继续播放行走声音。

这是负责跳跃,跌落和重力的代码。此代码块中的cc是CharacterController组件。如果角色已经接地并且没有按下跳跃键,则垂直速度将保持为零;如果他没有接地,则在y方向上施加重力。

if (cc.isGrounded) {
    grounded = true;
    if (Input.GetButton ("Jump") == true) {
        ySpeed = jumpSpeed;
        jumpSound.audio.Play();
    } else {
        ySpeed = 0;
    }
} else {
    grounded = false;
    ySpeed += Physics.gravity.y * Time.deltaTime;
}
Debug.Log (cc.isGrounded == true ? "yes" : "no");

问题是isGrounded值不断波动,Debug.Log行在yesno之间波动,因此当我使用isGrounded条件时为了播放脚步声,声音会随机停止并重新开始,即使我一直只是在一个简单平滑的平面上行走。

有解决方法吗?

我并不担心isGrounded波动而且不正确的事实,因为在游戏玩法中并不明显。我只担心如何在角色走路时不断播放脚步声,而不是跳跃,而不是摔倒。就我的担忧而言,这可以通过实际修复波动或其他解决方法来解决;我也很高兴。

这是播放脚步声的条件:

if((Input.GetAxis("Vertical") != 0 || Input.GetAxis("Horizontal") != 0) && grounded == true) {
    if(this.audio.isPlaying != true) {
        this.audio.Play ();
    }
} else if (this.audio.isPlaying) {
    this.audio.Stop ();
}

3 个答案:

答案 0 :(得分:0)

您的方法可能有点过于复杂。我建议存储对所有字符声音的引用(通常在Start或作为公共属性),然后只是swap them out during the appropriate Input event

即。这应该消除了是否需要跟踪char。停火了。

伪码:

if ( walking ): audio.clip = audioWalk

if ( jump ): audio.clip = audioJump

修改

当完全静止在平坦地形上时,每次调用Update(或FixedUpdate)都会显示isGrounded被设置为false。 然而,虽然isGrounded在检测真实状态时不可靠,但我找到了它 可靠地检查错误状态。换句话说,当角色处于“空中”时 isGround可靠地仍然是假的。考虑到这一点,你可以这样计算你的播出时间:

// RequiredFallingTime  is a public class field which I set in the inspector to be a little
// bit higher than my jump time (0.7 seconds in my case)

void Update () {

    fallingCount = ( cc.isGrounded ) ? 0 : fallingCount + 1;

    Debug.Log("Update: fallingCount = " + fallingCount);



    fallTime = fallingCount * Time.deltaTime;
    Debug.Log("Update: falling Duration = " + fallTime );


    falling = ( fallTime >= RequiredFallingTime ) ? true : false;

    // Still Falling: None of my Controls should produce sound while falling so return:
    if( fallTime / 2 >= RequiredFallingTime )
        return;

    // If first time falling, play our fall sound:
    if( falling ){
        audioSource.PlayOneShot(audioClipsOneShot[(int)SoundOneShot.fall]);
    }


    // If we made it this far, we're not falling--although we could be jumping.
    // Do Input checking for approp. sounds




}

答案 1 :(得分:0)

我遇到过类似的情况,用PhysX引擎开发角色动作。更准确地说,我的角色无法下楼。而不是它,他总是试图跳过台阶并自由落体。他的 isGrounded 也在看似平坦的表面上波动。

我的动作代码也基于速度积分 dX = V·dt

最后,我添加了简单的解决方法:

  1. 移动 dX = V·dt + U 其中 U 是一个常量向量(0,-u,0)
  2. 如果在第1步之后字符不是 isGrounded ,则它会被(0,u,0)
  3. 向后移动(向上)

    使用 u 的恒定值我发现它在小于或等于楼梯高度的步骤时提供了合理的行为。

    为了解释这种解决方法,有必要明确角色控制器不是人体。即使使用速度积分等复杂的方法,你仍然可以使用坚固的身体,而人体是复杂的机制,你现在,它由腿,脚等组成。

    事实上,当我的角色开始下楼时,重力累积 dV = G·dt 稍微滞后,但这足以让角色在楼梯上自由落体。

    这就是我故事的结局:)

    PS。我找到了相应的代码:

            // move character
            NxU32 activeGroups = getCharacter()->getScene()->getActiveGroups( cg::protagonist );
            _character->_nxController->move( 
                ( _character->_vy + _character->_vxz ) * timeStep, 
                activeGroups, 0.001f, 
                _character->_collisionFlags, 0.01f 
            );
    
            // press character to floor
            if( pressDown )
            {
                // press character down on step offset distance
                _character->_nxController->move( 
                    NxVec3( 0, -_character->_stepOffset, 0 ),
                    activeGroups, 0.001f, 
                    _character->_collisionFlags, 0.01f 
                );
                // if press-down actions does not reveal floor under feets
                if( !( _character->_collisionFlags & NXCC_COLLISION_DOWN  ) ) 
                {
                    // return character to its presios position
                    _character->_nxController->move( 
                        NxVec3( 0, _character->_stepOffset, 0 ),
                        activeGroups, 0.001f, 
                        _character->_collisionFlags, 0.01f 
                    );
                }
            }
    

答案 2 :(得分:0)

如果y移动为0,则字符不会被压入地板,并且isGrounded将返回false。我建议接地时将y速度设置为任何负数。这样,玩家将与地板碰撞,isGrounded将返回true。我要做的就是接地时根本不改变y速度,我要做的就是停止施加重力。

对不起,如果我来晚了,这是给刚接触这篇文章的任何新手的,因为它出现在Google搜索的顶部,以寻求这种情况的帮助。