Unity 2D:引力

Unity 2D: Gravitational Pull

我正在开发一个小游戏:我希望所有游戏对象都被拉到屏幕中间,在那里它们应该与另一个游戏对象发生碰撞。

我试过这个尝试:

using UnityEngine;
using System.Collections;
public class Planet : MonoBehaviour
{
    public Transform bird;
    private float gravitationalForce = 5;
    private Vector3 directionOfBirdFromPlanet;
 
    void Start ()
    {
        directionOfGameObjectFromMiddle = Vector3.zero;
    }
 
    void FixedUpdate ()
    {
        directionOfGameObjectFromMiddle = (transform.position-bird.position).normalized;
        bird.rigidbody2D.AddForce (directionOfGameObjectFromMiddle * gravitationalForce);    
    }
}

遗憾的是我无法让它工作。有人告诉我,我必须给 being 的对象拉另一个脚本,但是是否可以只用对象 上使用的一个脚本来做到这一点拉?

所以首先你有很多拼写错误/代码甚至无法编译。

您使用例如曾经 directionOfBirdFromPlanet 但后来称它为 directionOfGameObjectFromMiddle ;) 你的 Start 非常多余。

如前所述,bird.rigidbody2D 弃用 ,您应该使用 GetComponent<Rigidbody2D>() 或直接将您的字段设为

public Rigidbody2D bird;

对于拥有多个对象,您可以简单地将它们分配给一个列表并执行

public class Planet : MonoBehaviour
{
    // Directly use the correct field type
    public List<Rigidbody2D> birds;

    // Make this field adjustable via the Inspector for fine tuning
    [SerializeField] private float gravitationalForce = 5;

    // Your start was redundant    

    private void FixedUpdate()
    {
        // iterate through all birds
        foreach (var bird in birds)
        {
            // Since transform.position is a Vector3 but bird.position is a Vector2 you now have to cast
            var directionOfBirdFromPlanet = ((Vector2) transform.position - bird.position).normalized;

            // Adds the force towards the center
            bird.AddForce(directionOfBirdFromPlanet * gravitationalForce);
        }
    }
}

然后在这个星球上你引用所有 bird 对象

在鸟的 Rigidbody2D 组件上确保设置

Gravity Scale -> 0

你也可以玩 Linear Drag 所以简单来说,物体在移动时应该减慢多少速度

例如这就是 Linear Drag = 0 的样子,因此您的物体将继续以相同的“能量”

远离中心

这就是 Linear Drag = 0.3 发生的情况,所以你的物体会随着时间的推移失去“能量”