簡體   English   中英

如何在 Unity2D 中使 Rigidbody2D 子彈移動

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM