【问题标题】:Unity 2D, How To Make an Orbital Gravity Like at Angry Birds Space? [closed]Unity 2D,如何制作像愤怒的小鸟空间一样的轨道重力? [关闭]
【发布时间】:2019-07-17 17:12:08
【问题描述】:

有人知道如何制作一个轨道重力与愤怒的小鸟太空行星重力完全一样的行星吗? 我希望这个物体只有在它进入一个领域时才会在地球上移动。 我还希望该物体在经过一些回合后会像愤怒的小鸟太空一样降落在地面上。 一个脚本会帮助我。

*我使用c#和unity 2d。

编辑:在 Fredric Sc​​hön 的回答中给我发了一个脚本,但是当物体降落在行星上时,它不会停止围绕行星旋转。我怎样才能让物体像愤怒的小鸟一样缓慢地落到地球上并保持在引力半径内?

【问题讨论】:

  • “数学。”你用数学来做。
  • 嗨,欢迎来到堆栈溢出。查看How to Ask 链接。开始编写代码,如果遇到问题,请提出具体问题。

标签: c# unity3d game-physics


【解决方案1】:

这里有一个解决方案

[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

【讨论】:

  • 出于好奇,您为什么不使用经过对撞机修改的标准万有引力公式(G·M·m/r²)来触发它?我确信这是有充分理由的,我认为在游戏设计的权衡方面值得解释一下。
  • @Fredrik_Schön 你能帮我解决我的其他问题吗?
  • 对不起,我还没玩过愤怒的小鸟。
  • @Fredrik_Schön 这是游戏短视频的链接:youtu.be/L0twZbUF6Ic 你能回答我的问题吗?你会帮我很多。 :)
  • 你的问题是万有引力太大……?只需降低它。对不起,我不知道该帮什​​么忙。如果您遇到问题,它在撞击表面后继续滚动,只需添加一个检查并降低重力,或者在行星材料上增加大量摩擦力,这样它就不会滑行。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-18
  • 1970-01-01
相关资源
最近更新 更多