Unity 2D,如何使轨道重力像愤怒的小鸟 Space?
Unity 2D, How To Make an Orbital Gravity Like at Angry Birds Space?
有人知道如何制作一个与《愤怒的小鸟》Space 行星引力完全一样的轨道引力行星吗?
我希望物体只有在进入田野时才会绕地球移动。
我还希望物体像愤怒的小鸟一样在几轮后降落在地面上 space。
脚本会帮助我。
*我使用c#和unity 2d。
编辑:在 Fredric Schön 的回答中给我发了一个脚本,但是当物体降落在行星上时,它不会停止围绕行星旋转。我怎样才能让物体像愤怒的小鸟一样缓慢下落到地球并保持在引力半径内space?
这是一种解决方案
[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);
}
}
}
基本上,您使用触发圆对撞机创建对象。当一个物体撞击对撞机时,它们将进入行星附近以施加重力(您也设置 force/planet )。你离得越近,引力就越大。如果你离开,所有重力都会被移除。
这是运行中的代码的 gif;你可以看到较小行星的引力:
有人知道如何制作一个与《愤怒的小鸟》Space 行星引力完全一样的轨道引力行星吗? 我希望物体只有在进入田野时才会绕地球移动。 我还希望物体像愤怒的小鸟一样在几轮后降落在地面上 space。 脚本会帮助我。
*我使用c#和unity 2d。
编辑:在 Fredric Schön 的回答中给我发了一个脚本,但是当物体降落在行星上时,它不会停止围绕行星旋转。我怎样才能让物体像愤怒的小鸟一样缓慢下落到地球并保持在引力半径内space?
这是一种解决方案
[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);
}
}
}
基本上,您使用触发圆对撞机创建对象。当一个物体撞击对撞机时,它们将进入行星附近以施加重力(您也设置 force/planet )。你离得越近,引力就越大。如果你离开,所有重力都会被移除。
这是运行中的代码的 gif;你可以看到较小行星的引力: