微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何实时跟踪transform.position?

如何解决如何实时跟踪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),它不会随着行星的运动而实时更新。因此,如果我将行星移动到屏幕的角落,小行星仍然会被吸引到它的中心。

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

非常感谢,请原谅任何明显的错误

解决方法

有两种方法可以快速到达物体:

  1. 将对象交给玩家,并在每次更新时使用 planet.transform.position

  2. 首先使用看向植物旋转,然后使用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);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。