我想做一个乒乓球比赛,但是我的球没有像我想要的那样飞。我的球正受到重力的影响。我知道我需要将身体类型从dynamic
设置为kinematic
,但是如果我使用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;
}
}
}
答案 0 :(得分:3)
useGravity
中没有RigidBody2D
,但您可以简单地将IsKinematic
保留为禁用,而将其gravityScale
禁用
private void Start()
{
rbBall.gravityScale = 0;
}
与在useGravity
上禁用RigidBody
具有相同的效果。特别是在您提出问题的情况下,我真的很喜欢笔记
通过关闭飞行器重力而不是模拟使其保持高空飞行的力来实现飞行器可能更容易。
;)
private void Start()
{
Physics2D.gravity = Vector2.zero;
}
对问题本身
如果我想使用运动学,是否有addforce的替代品?
否,是的...
该刚体是否应脱离物理控制?
如果将此属性设置为true,则刚体将停止对碰撞和施加的力做出反应。当通常应“以运动学方式”(即非物理性)控制某个对象,但有时又需要物理学来实现现实时,这可能会很有用。例如,人的性格通常不使用物理学来实现,但有时由于撞击或爆炸而被抛向空中并与物体碰撞。
如果启用
isKinematic
,则力,碰撞或关节将不再影响刚体。通过更改transform.position
,刚体将完全处于动画或脚本控制之下。
因此只需使用
transform.position = ...
照常。
对于具有类似于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;
}
但是,在您的情况下,您不想增加每帧的速度,而可能仅在开始和碰撞时设置一次特定速度。