c# - 如何在随机方向上向rigidbody2d 游戏对象添加力
问题描述
如何向rigidbody2D 游戏对象添加力并使其以固定速度移动?游戏对象还附加了一个反弹材质。
private Rigidbody2D rb2D;
private float thrust = 10.0f;
void Start() {
}
void FixedUpdate() {
rb2D.AddForce(new Vector2(0, 1) * thrust);
}
这是我从 Unity 文档网站上得到的,但这似乎没有任何作用。
这是我最终使用的代码,它似乎运行正常。Vector2 的方向和速度可以根据质量/重力进行调整。
float topSpeed = 15;
private Rigidbody2D rb2D;
private float thrust = 0.1f;
void Start()
{
rb2D = gameObject.GetComponent<Rigidbody2D>();
rb2D.AddForce(new Vector2(0, 1) * thrust);
}
void Update()
{
if (rb2D.velocity.magnitude > topSpeed || rb2D.velocity.magnitude < topSpeed)
rb2D.velocity = rb2D.velocity.normalized * topSpeed;
}
解决方案
您编写的代码一旦工作,将无限加速刚体。您需要将速度限制在最大速度:http ://answers.unity.com/answers/330805/view.html
rigidbody.AddForce(new Vector2(0, 1) * thrust * Time.deltaTime);
if (rigidbody.velocity.magnitude > topSpeed)
rigidbody.velocity = rigidbody.velocity.normalized * topSpeed;
如果您希望它立即将速度设置为固定值,那么您可以在每一帧上设置速度:
https://docs.unity3d.com/ScriptReference/Rigidbody-velocity.html
void FixedUpdate()
{
if (Input.GetButtonDown("Jump"))
{
// the cube is going to move upwards in 10 units per second
rb2D.velocity = new Vector3(0, 10, 0);
moving = true;
Debug.Log("jump");
}
if (moving)
{
// when the cube has moved over 1 second report it's position
t = t + Time.deltaTime;
if (t > 1.0f)
{
Debug.Log(gameObject.transform.position.y + " : " + t);
t = 0.0f;
}
}
}
您的代码没有显示它,所以如果您还没有这样做,您需要确保它rb2D
实际上设置为您要操作的对象上的 Rigidbody2d。例如,通过在 start 方法中执行:
void Start()
{
rb2D = gameObject.GetComponent<Rigidbody2D>();
}
推荐阅读
- python - python 新手,在 while 和 ifs 上有问题
- android - 将整个布局转换为图像/位图
- regex - 我需要对此 RegEx 进行哪些修改以仅在字符串中有数字后才允许小写字母?
- python-3.x - 无法运行python文件
- c# - “您要实例化的对象为空”但我使用的是统一资产
- c++ - 如何在 omnett++ 模拟期间同时传输多条消息
- python - 如何使csv显示为数字而不是E(python)
- benchmarking - 大数据量情况下的 LevelDB 基准测试
- javascript - 如果特定用户是@,则说一个短语
- html - 如何定位引导导航栏 (v4.5) 的 HTML 元素以使用 CSS 自定义样式