繁体   English   中英

如何实时跟踪transform.position?

[英]How to track transform.position in real time?

我正在开发一个小型 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),它不会随着行星的运动实时更新。 因此,如果我将行星移动到屏幕的一角,小行星仍然会被吸引到它的中心。

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

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

有两种方法可以快速获得 object:

  1. 将 object 发送给玩家,在每次更新中只需使用planet.transform.position

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM