相同的预制件以不同的速度实例化

本文关键字:速度 实例化 | 更新日期: 2023-09-27 18:24:55

我正在尝试设置一个对象,以便在发射时以4种方式实例化子弹。例如:

Assuming 'A' is the object:
    ^
    |
<-  A  ->
    |
    v

我正试着把它设置成按照上面指定的方向拍摄4种方式。当前设置工作正常,预制件按照指示正确实例化。问题不是所有的子弹都以相同的速度射出。右边和下面的射得正确,而上面和左边的射得慢得多。

所有方向的代码设置都是完全相同的,并且所有方向都使用相同的预制件和相同的速度,因此混淆了速度差异的原因。请提供建议。谢谢

到项目的Dropbox链接

    public Rigidbody bulletPrefab;
    //empty gameobjects to locate the positions
    public Transform bulletStartPosRight, bulletStartPosLeft, bulletStartPosTop, bulletStartPosBottom;
    private float bulletSpeed = 300;
    // Update is called once per frame
    void Update()
    {
        if (Input.GetButtonDown("Fire1"))
        {
            Rigidbody bulletInstance1, bulletInstance2, bulletInstance3, bulletInstance4;  
            bulletInstance1 = Instantiate(bulletPrefab, bulletStartPosRight.position, bulletStartPosRight.rotation) as Rigidbody;
            //the force is always forward. I rotated the empty gameobjects in Unity instead of changing the code here to forward,up,right and so on. 
            bulletInstance1.AddForce(bulletStartPosRight.forward * bulletSpeed);
            bulletInstance2 = Instantiate(bulletPrefab, bulletStartPosLeft.position, bulletStartPosLeft.rotation) as Rigidbody;
            bulletInstance2.AddForce(bulletStartPosLeft.forward * bulletSpeed);
            bulletInstance3 = Instantiate(bulletPrefab, bulletStartPosTop.position, bulletStartPosTop.rotation) as Rigidbody;
            bulletInstance3.AddForce(bulletStartPosTop.forward * bulletSpeed);
            bulletInstance4 = Instantiate(bulletPrefab, bulletStartPosBottom.position, bulletStartPosBottom.rotation) as Rigidbody;
            bulletInstance4.AddForce(bulletStartPosBottom.forward * bulletSpeed);
        }
    }

相同的预制件以不同的速度实例化

我下载了这个项目,并注意到顶部的&左侧产卵点旋转错误。

  • 向左旋转应为:270(或-90)
  • 顶部旋转应为:180

就我个人而言,我会失去所有的旋转,并使用transform.right等来避免混淆

这可能是因为您在更新方法中使用了AddForce。您应该尝试使用FixedUpdate方法。它在在线文档中说明:

http://docs.unity3d.com/ScriptReference/Rigidbody.html

在脚本中,建议将FixedUpdate函数用作施加力和更改刚体设置的位置(而不是用于大多数其他帧更新任务的Update)。原因是物理更新是在与帧更新不一致的测量时间步长中进行的。FixedUpdate在每次物理更新之前立即调用,因此在那里所做的任何更改都将直接处理。