首页 > 解决方案 > Unity 2D:万有引力

问题描述

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

我试过这个尝试:

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);    
    }
}

可悲的是我无法让它工作。有人告诉我,我必须为正在拉动的对象提供另一个脚本,但是是否可以仅使用在拉动对象上使用的一个脚本来执行此操作?

标签: c#unity3dgame-physicsphysics

解决方案


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

你使用 eg 一次directionOfBirdFromPlanet,但后来调用它directionOfGameObjectFromMiddle;)你Start是相当多余的。

如前所述bird.rigidbody2D,您应该使用甚至GetComponent<Rigidbody2D>()更好地直接制作您的类型字段

public Rigidbody2D bird;

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

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所以你的物体会随着时间的推移失去“能量”

在此处输入图像描述


推荐阅读