Unity 不更新对象 transform.position

问题描述

我正在开发一款小型 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 脚本中,拖放您的星球 游戏对象

这解决了问题。