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
发生的情况,所以你的物体会随着时间的推移失去“能量”
我正在开发一个小游戏:我希望所有游戏对象都被拉到屏幕中间,在那里它们应该与另一个游戏对象发生碰撞。
我试过这个尝试:
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
发生的情况,所以你的物体会随着时间的推移失去“能量”