如果我想使用运动学,是否有 addforce 的替代方案

Den*_*ell 0 c# unity-game-engine

我想做一场乒乓球比赛,但我的球没有像我想要的那样飞行。我的球受到重力的影响。我知道我需要将身体类型设置为dynamickinematic但如果我使用kinematic,我的球将不再移动,因为我的球会随着 一起飞行addforce。我可以使用哪种力量,以便我可以kinematic使用?

public class BallPhysics : MonoBehaviour {

public Rigidbody2D rbBall;
public float SpeedX = 10.0f;
public float SpeedY = 5.0f;

void FixedUpdate()
{
    rbBall.AddForce(new Vector2(SpeedX, SpeedY)); // my ball is flying
}

void OnCollisionEnter2D(Collision2D collisionInfo) // collision for the walls
{
    if (collisionInfo.collider.tag == "wall")
    {
        SpeedX = -SpeedX;
        SpeedY = -SpeedY;
    }
}
Run Code Online (Sandbox Code Playgroud)

}

der*_*ugo 5

没有useGravityRigidBody2D但您可以简单地保持IsKinematic禁用状态,也可以禁用它gravityScale

private void Start()
{
    rbBall.gravityScale = 0;
}
Run Code Online (Sandbox Code Playgroud)

这与useGravity禁用RigidBody. 特别是在你的问题的背景下,我真的很喜欢这张纸条

通过关闭其重力而不是模拟使其保持在空中的力来实现飞行角色可能更容易。

;)


或者使用以下方法禁用整个场景/项目的重力Physics2D.gravity

private void Start()
{
    Physics2D.gravity = Vector2.zero;
}
Run Code Online (Sandbox Code Playgroud)

对于问题本身

如果我想使用运动学,是否有 addforce 的替代方案?

不和是...

RigidBody2D.isKinematic

这个刚体是否应该脱离物理控制?

如果此属性设置为 true,则刚体将停止对碰撞和施加的力做出反应。当一个对象通常应该“运动学”(即非物理地)控制但有时需要物理来实现真实感时,这可能很有用。例如,人类角色通常不使用物理实现,但有时可能会因撞击或爆炸而被抛向空中并与物体相撞。

或者也来自Rigidbody.isKinematic

如果isKinematic启用,力、碰撞或关节将不再影响刚体。通过更改 ,刚体将受到动画或脚本控制的完全控制transform.position

所以只需使用

transform.position = ...
Run Code Online (Sandbox Code Playgroud)

照常。


对于类似的东西,AddForce您可以存储本地速度向量并添加更多速度,例如

// public so you can also configure 
// it in the inspector or set it from another script
public Vector2 speed;

public void AddForce(Vector2 force)
{
    speed += force;
}

private void Update()
{
    transform.position += speed * Time.deltaTime;
}
Run Code Online (Sandbox Code Playgroud)

然而,在您的情况下,您不想增加每帧的速度,但可能只在开始和碰撞时设置一定的速度。