C# 在射击子弹时,为什么子弹落得太快,而且在射击后离得很近?

C# 在射击子弹时,为什么子弹落得太快,而且在射击后离得很近?,c#,unity3d,C#,Unity3d,我在枪的3个孔中手动添加了3颗没有刚体的子弹,这样我就可以从子弹出来的地方得到开始位置。这3颗子弹也是枪管不停旋转的产物 我创造了一个公牛预制,预制有一个刚体。 剧本附在枪管上 这是一个屏幕截图,显示了孔中的3颗子弹,只是为了能够从中获得起始位置。它在层次结构中显示带枪的无人机,在inspector中显示脚本: 这个屏幕截图显示了当我快速点击鼠标左键并射出一些子弹时发生的情况。 它看起来更像爆米花机,而不是子弹: 子弹从枪管的3个孔中射出,但落得太快,射程很短。我想做的是,子弹将根据枪管朝向

我在枪的3个孔中手动添加了3颗没有刚体的子弹,这样我就可以从子弹出来的地方得到开始位置。这3颗子弹也是枪管不停旋转的产物

我创造了一个公牛预制,预制有一个刚体。 剧本附在枪管上

这是一个屏幕截图,显示了孔中的3颗子弹,只是为了能够从中获得起始位置。它在层次结构中显示带枪的无人机,在inspector中显示脚本:

这个屏幕截图显示了当我快速点击鼠标左键并射出一些子弹时发生的情况。 它看起来更像爆米花机,而不是子弹:

子弹从枪管的3个孔中射出,但落得太快,射程很短。我想做的是,子弹将根据枪管朝向的位置向前射出,子弹将击中物体的墙壁和其他物体,然后使用光线投射对被击中的物体造成伤害。但是现在我不能让子弹像子弹应该的那样被射中

using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;

public class ShootBullets : MonoBehaviour
{
    public GameObject bulletPrefab;
    public float bulletSpeed = 100f;
    public bool automaticFire = false;

    private List<GameObject> startPositions;

    // Start is called before the first frame update
    void Start()
    {
        startPositions = GameObject.FindGameObjectsWithTag("Bullet").ToList();
    }

    // Update is called once per frame
    void Update()
    {
        if (automaticFire == false)
        {
            if (Input.GetMouseButtonDown(0))
            {
                for (int i = 0; i < startPositions.Count; i++)
                {
                    GameObject bullet = Instantiate(bulletPrefab, startPositions[i].transform.position, Quaternion.identity) as GameObject;
                    Rigidbody bulletRB = bullet.GetComponent<Rigidbody>();
                    bulletRB.AddForce(Vector3.forward * bulletSpeed);
                    bulletRB.velocity = bullet.transform.forward * 40;
                    Destroy(bullet, 0.5f);
                }
            }
        }
        else
        {
            for (int i = 0; i < startPositions.Count; i++)
            {
                GameObject bullet = Instantiate(bulletPrefab, startPositions[i].transform.position, Quaternion.identity) as GameObject;
                Rigidbody bulletRB = bullet.GetComponent<Rigidbody>();
                bulletRB.AddForce(Vector3.forward * bulletSpeed);
                bulletRB.velocity = bullet.transform.forward * 40;
                Destroy(bullet, 0.5f);
            }
        }
    }
}
使用系统集合;
使用System.Collections.Generic;
使用System.Linq;
使用UnityEngine;
公共类子弹:单一行为
{
公共游戏对象公告;
公众浮标速度=100f;
公共布尔自动点火=假;
私有列表起始位置;
//在第一帧更新之前调用Start
void Start()
{
startPositions=GameObject.FindGameObjectsWithTag(“Bullet”).ToList();
}
//每帧调用一次更新
无效更新()
{
如果(自动点火==假)
{
if(Input.GetMouseButtonDown(0))
{
对于(int i=0;i
我试着先用加力,然后用速度,然后两者都用,但结果没有多大变化

  • 将bullet刚体上的“drag”参数设置为零。拖动会持续减慢刚体的速度

  • 在这一行:

    bulletRB.AddForce(矢量3.forward*bulletSpeed)

  • 无论枪管瞄准何处,子弹都将沿Z轴方向飞行

    您可以在此处设置正确的向量:

    bulletRB.velocity = bullet.transform.forward * 40;
    
    好的,几乎正确:该向量指向子弹的局部Z轴方向,但在实例化时,将旋转设置为Quaternion.identity,这意味着零旋转。 所以,这些都不允许你控制子弹的方向

    你们需要的是,使用枪管的forwad向量作为子弹力。最好使用AddForce,使用适当的脉冲模式,如评论中所述。 像这样:

    bulletRB.AddForce(barrelTransform.forward * bulletSpeed, ForceMode.Impulse);
    

    类似于
    yourRigidBody.useGravity=false为了清楚起见,Vector3.forward表示枪所面对的方向?请阅读
    AddForce
    及其
    ForceMode
    参数。要解决问题,您可以使用
    ForceMode.pulse
    (瞬时力)而不是默认的
    ForceMode.force
    (持续力)。