Unity 2D,如何使《愤怒的小鸟》太空中的轨道引力?

时间:2019-07-17 17:12:08

标签: c# unity3d game-physics

有人知道如何像《愤怒的小鸟》太空行星引力那样完全按照轨道引力制造行星吗? 我希望该物体仅在进入田野时才能绕行星移动。 我还希望物体在经过几轮飞行后像愤怒的小鸟一样降落在地面上。 脚本会帮助我。

*我使用c#和unity 2d。

编辑:在答案中,弗雷德里克·舍恩(FredricSchön)给我发送了一个脚本,但是当物体降落在行星上时,它并不会停止旋转而绕行星旋转。我又该如何使物体缓慢落到行星上并像在愤怒的小鸟空间那样停留在引力半径内?

1 个答案:

答案 0 :(得分:3)

这是一个解决方案

[RequireComponent(typeof(CircleCollider2D), typeof(CircleCollider2D))]
public class Planet : MonoBehaviour
{
    [Range(0.1f, 50f)]
    public float gravitation = 0.45f;
    [Range(4, 50)]
    public float gravitationRadius = 11f;
    [Range(0f, 10f)]
    public float rotationSpeed = 0.9f;

    private CircleCollider2D gravitationTrigger;

    void Start()
    {
        gravitationTrigger = GetComponents<CircleCollider2D>()[1];
        gravitationTrigger.isTrigger = true;
        gravitationTrigger.radius = gravitationRadius / transform.localScale.x;
    }

    void FixedUpdate()
    {
        transform.Rotate(Vector3.forward * rotationSpeed);

        foreach (var objectInVicinity in objectsInRange)
        {
            if (objectInVicinity == null) {
                objectsInRange.Remove(objectInVicinity);
                break;
            }

            float dist = Vector2.Distance(transform.position, objectInVicinity.transform.position);
            float gravitationFactor = 1 - dist / gravitationRadius;
            Vector2 force = (transform.position - objectInVicinity.transform.position).normalized * gravitation * gravitationFactor;
            objectInVicinity.AddForce(force);
        }
    }

    void OnDrawGizmos()
    {
        Gizmos.color = Color.red;
        Gizmos.DrawWireSphere(transform.position, gravitationRadius);
    }

    private List<Rigidbody2D> objectsInRange = new List<Rigidbody2D>();
    private void OnTriggerEnter2D(Collider2D collider)
    {
        var rb = collider.GetComponent<Rigidbody2D>();
        if (rb != null)
        {
            objectsInRange.Add(rb);
        }
    }

    private void OnTriggerExit2D(Collider2D collider)
    {
        var rb = collider.GetComponent<Rigidbody2D>();
        if (rb != null)
        {
            objectsInRange.Remove(rb);
        }
    }
}

基本上,您可以使用触发圆对撞机创建对象。当物体撞击对撞机时,它们将进入行星附近以施加重力(也可以设置力/行星)。重力越大,您越近。如果您离开,则所有引力都将消除。

这是正在执行的代码的gif;您会看到较小行星的引力:

And link to the game