问题描述
我正在开发一款小型 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。
是行星刚体的问题吗?有什么设置吗?我有点失落。
有没有办法解决这个问题?
非常感谢,请原谅任何明显的错误!
解决方法
因为小行星是从预制件动态生成的,它们不是游戏对象,在脚本的游戏对象变量上选择的行星是预制件,而不是场景中的真实游戏对象。我必须将此行添加到我的生成器脚本中
如果(间隔>随机){
GameObject newAsteroid = Instantiate(asteroidPrefab,GetRandomPosition(),Quaternion.identity);
newAsteroid.GetComponent().planet = Planet;
}
并在变量的顶部添加
公共游戏对象星球;
在编辑器中的 spawner 脚本中,拖放您的星球 游戏对象
这解决了问题。