我正在开发一个小的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。
这是地球刚体的问题吗?有什么设置吗?我有点迷路了。
有办法解决这个问题吗?
非常感谢您,并原谅任何公然的错误!
因为小行星是从预制件动态展开的,它们不是游戏对象,所以在脚本上的游戏对象变量上选择的行星是预制件,而不是场景中真正的游戏对象。我不得不将这一行添加到我的spawner脚本中
if (interval > random) {
GameObject newAsteroid = Instantiate(asteroidPrefab,
GetRandomPosition(), Quaternion.identity);
newAsteroid.GetComponent<Gravity>().planet = planet;
}
在变量的顶部添加
public GameObject planet;
在编辑器中添加您的spawner脚本,拖放您的星球游戏对象。
这解决了问题。