【发布时间】:2021-05-19 10:01:00
【问题描述】:
我正在开发一款小型 2d 游戏,您可以在其中控制一颗行星以躲避来袭的小行星。我正在通过以下方式实现重力:
public class Gravity : MonoBehaviour
{
Rigidbody2D rb;
Vector2 lookDirection;
float lookAngle;
[Header ("Gravity")]
// Distance where gravity works
[Range(0.0f, 1000.0f)]
public float maxGravDist = 150.0f;
// Gravity force
[Range(0.0f, 1000.0f)]
public float maxGravity = 150.0f;
// Your planet
public GameObject planet;
void Start()
{
rb = GetComponent<Rigidbody2D>();
}
void Update()
{
// Distance to the planet
float dist = Vector3.Distance(planet.transform.position, transform.position);
// Gravity
Vector3 v = planet.transform.position - transform.position;
rb.AddForce(v.normalized * (1.0f - dist / maxGravDist) * maxGravity);
// Rotating to the planet
lookDirection = planet.transform.position - transform.position;
lookAngle = Mathf.Atan2(lookDirection.y, lookDirection.x) * Mathf.Rad2Deg;
transform.rotation = Quaternion.Euler(0f, 0f, lookAngle);
}
}
问题是小行星被吸引到行星的初始生成点 (0,0),它不会随着行星的运动实时更新。因此,如果我将行星移动到屏幕的一角,小行星仍然会被吸引到它的中心。
当我对每个值使用 Debug.Log 时,除了planet.transform.position 保持在 0,0,0 之外,所有值都会发生变化,即使在移动它之后也是如此。
是行星刚体的问题吗?有什么设置吗?我有点迷茫。
有没有办法解决这个问题?
非常感谢,如有严重错误,敬请原谅!
【问题讨论】:
-
this
1.0f - dist / maxGravDist=1.0f - 150 / 150= 0 所以你可能不会增加任何力量? -
但是如果我不加任何力量,小行星怎么还在移动?
-
嘿,您可能想检查一下您分配给
planet字段的游戏对象。也许看看场景层次并检查行星本身是否是某个静止游戏对象的子对象。 -
@rustyBucketBay 实际上是
1 - dist / maxGravDist=1 - ? / 150!=0除了?正好是150;) -
是的,150 是默认值,所以如果编辑器中没有值,就会出现这种情况。那是我的观点。谢谢:)
标签: c# unity3d 2d game-physics game-development