首页 > 解决方案 > 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,0 之外,所有值都会发生变化,即使在移动它之后也是如此。

是行星刚体的问题吗?有什么设置吗?我有点失落。

有没有办法解决这个问题?

非常感谢您,并原谅任何公然错误!

标签: c#unity3d2dgame-physicsgame-development

解决方案


因为小行星是从预制件动态生成的,所以它们不是游戏对象,在脚本的游戏对象变量上选择的行星是预制件,而不是场景中的真实游戏对象。我必须将此行添加到我的生成器脚本中

如果(间隔>随机){

GameObject newAsteroid = Instantiate(asteroidPrefab, GetRandomPosition(), Quaternion.identity);

newAsteroid.GetComponent().planet = 行星;

}

并在变量的顶部添加

公共游戏对象星球;

在编辑器的生成器脚本中,拖放你的星球游戏对象

这解决了这个问题。


推荐阅读