[英]How to make a Rigidbody2D bullet move in Unity2D
幾天來我一直在嘗試各種修復程序,但我無法弄清楚。 我需要一顆子彈來生成並移動直到碰撞,但我什至無法讓它移動(它生成得很好)。 注意:這是一個 2D 游戲。 這是我的代碼:
public class Enemy : MonoBehaviour
{
public float timeBetweenFire = 2;
public Rigidbody2D bullet;
public Transform gunSpawn;
private float timer;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update() {
timer+=Time.deltaTime;
if (timer >= timeBetweenFire) {
Shoot();
timer = 0;
}
}
private void Shoot() {
Rigidbody2D bulletInstance;
bulletInstance = Instantiate(bullet, gunSpawn.position, gunSpawn.rotation) as Rigidbody2D;
//bulletInstance.AddForce(gunSpawn.forward * 1000f);
//bulletInstance.AddForce(Vector3.up * 10 * Time.deltaTime);
//bulletInstance.AddForce(transform.forward * 100);
bulletInstance.AddForce(Vector3.up * 1000);
}
}
注釋過的 bulletInstance 方法是我最近嘗試過的,我對子彈進行了一系列大規模的代碼更改(iirc 在剛體、游戲對象和變換之間進行了更改),但沒有任何幫助。 子彈的生成距離除了 gunSpawn 之外的任何東西都有很大的距離,它只是一個空的游戲對象,所以我認為碰撞不是問題。 我是一名新的 Unity 程序員,所以請原諒我的任何愚蠢錯誤。
更新:這是我為使其(主要)工作所做的。 當子彈相撞時它可以旋轉出來,但至少我取得了一些進展。
public class Deflect : MonoBehaviour
{
private Rigidbody2D bullet;
public float bulletSpeed = 0.1f;
Vector2 direction = new Vector3(0.7f,0.7f);
ContactPoint2D[] myContact = new ContactPoint2D[1];
Vector2 _velocity;
public void Update ()
{
}
// Start is called before the first frame update
void Start()
{
bullet = this.GetComponent<Rigidbody2D>();
_velocity = bullet.velocity;
}
void OnCollisionEnter2D(Collision2D collision)
{
foreach (ContactPoint2D contact in collision.contacts)
{
print(contact.collider.name + " hit " + contact.otherCollider.name);
// Visualize the contact point
Debug.DrawRay(contact.point, contact.normal, Color.white);
}
Vector2 inNormal = collision.contacts[0].normal;
_velocity = Vector3.Reflect(_velocity, inNormal);
bullet.velocity = _velocity;
}
}
確保子彈具有剛體組件並且未設置為運動學。
1 - 將您的子彈預制件創建為GameObject
2 - 添加一個RigidBody2D
到它
3 - 確保在 Rigibody2d 上未選中Rigibody2d
4 - 然后GameObject bulletInstance = Instantiate(bullet, gunSpawn.position,gunSpawn.rotation); bulletInstance.GetComponent<Rigidbody2D>().AddForce(Vector3.up * 1000);
IsKinematic 防止Rigidbody2D
受到力的影響。
https://docs.unity3d.com/ScriptReference/Rigidbody-isKinematic.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.