c# - Unity3d:CharacterController 不接地;无法连续播放脚步声

标签 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之间波动code>,所以当我使用 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 ();
}

最佳答案

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

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

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

  1. 移动 dX = V · dt + U,其中 U 是常数向量 (0,-u,0)
  2. 如果角色在第 1 步后不是isGrounded,它会向后(向上)移动(0,u,0)

使用 u 的常量值,我发现它在小于或等于楼梯高度时提供合理的行为。

要解释此解决方法,有必要明确角色 Controller 不是人体。即使使用像速度积分这样复杂的方法,你仍然使用实体,而人体是复杂的机制,你现在,它由腿、脚等组成。

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

我的故事到此结束:)

附言。我找到了相应的代码:

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

关于c# - Unity3d:CharacterController 不接地;无法连续播放脚步声,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25461105/

相关文章:

c# - 如何显示数据网格中文本框中的所有数据?

c# - 将自定义对象添加到 C# 中的选中列表框

c# - 在 C# 中反转 char 数组

c# - 如何使用 C#(在 unity3d 中)访问另一个类?

c# - 如何在Unity中制作登录窗口

android - Unity 应用程序停止背景音乐

javascript - 值(value)串联问题

c# - IEnumerable 有效但找不到类型或命名空间 IQueryable - MVC 5

c# - Unity - SendMessage 但用于变量而不是函数/方法

unity3d - 在 Unity3D 中将 alpha 添加到着色器