问题描述
我正在开发一款小型 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),它不会随着行星的运动而实时更新。因此,如果我将行星移动到屏幕的角落,小行星仍然会被吸引到它的中心。
有没有办法解决这个问题?
非常感谢,请原谅任何明显的错误!
解决方法
有两种方法可以快速到达物体:
-
将对象交给玩家,并在每次更新时使用
planet.transform.position
-
首先使用看向植物旋转,然后使用
vector3.forword
作为移动方向。
第一个解决方案对您不起作用,因此您可能想尝试第二个。
无论如何,如果您的lookAt部分也不起作用,您可以使用
Vector3 dir = target.position - transform.position;
float angle = Mathf.Atan2(dir.y,dir.x) * Mathf.Rad2Deg;
transform.rotation = Quaternion.AngleAxis(angle,Vector3.forward);
或
Vector3 targetPos = target.transform.position;
Vector3 targetPosFlattened = new Vector3(targetPos.x,targetPos.y,0);
transform.LookAt(targetPosFlattened);