unity3d Unity C#脚本旋转偏移

cld4siwp  于 2022-12-27  发布在  C#
关注(0)|答案(2)|浏览(186)

我已经修了一段时间,似乎不能让它正常工作,它有时工作,但其他时候没有。

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

public class gun: MonoBehaviour
{
    public Transform firePoint;
    public GameObject BulletPrefab;
    
    float Speed = 20f;
    
    void Update()
    {
        if(Input.GetButtonDown("Fire1"))
        {
            Shoot();
        }
    }
    
    void Shoot()
    {
        int a = 0;
        float[] b1 = {-15f,0f,15f};
    
        while (a != 3)
        {
            GameObject bullet = Instantiate(BulletPrefab, firePoint.position, firePoint.rotation);
    
            Rigidbody2D rb = bullet.GetComponent<Rigidbody2D>();
            Transform tr = bullet.GetComponent<Transform>();
            tr.rotation = firePoint.rotation;
            tr.Rotate(new Vector3(0f,0f,b1[a]),Space.Self);
            rb.AddForce(tr.up * Speed, ForceMode2D.Impulse);
  
            a++;
        }   
    }
}

它应该以15度角偏移投射物并发射它们,但有时它只是向内旋转并直接向前发射。
试图将其转换为向量和回来,但没有线索如何做到这一点,似乎无法找到帮助,甚至在第2页的谷歌。

hwazgwia

hwazgwia1#

我相信,从目前的几个信息,你想"三次射击"你的子弹从你的枪的位置,并使它前进取决于你的枪旋转和旋转偏移?如果是这样,那么这里是你的代码的问题和解决方案:

    • 问题是**

我推荐使用tr.eulerAngles,它使用Vector3,更容易理解和操作。有了它,你可以简单地做:

tr.eulerAngles = firePoint.transform.eulerAngles

这将使你的子弹复制枪的旋转。现在,如果你想添加一些旋转到你的子弹,使"三重射击"的效果,你只需要添加一个向量3来修改你的Angular 的y值。* 示例:*

tr.eulerAngles = firePoint.transform.eulerAngles + new Vector3(0, -15, 0);

这将解决您的旋转问题。

    • 升级代码的提示**

尽管这一行简单的代码可以解决您的问题,但您的脚本在正确编码和视频游戏基本规则方面存在很多问题。
视频游戏的第一条规则,是永远不要在运行时示例化对象.
为什么?假设你以很快的射速一次发射10颗子弹,那么你的游戏将非常滞后,因为你在你的内存中示例化新的对象(然后擦除)。这是一个非常初学者的问题,只需要使用对象池。
另一个建议是更好地命名你的变量并尊重命名惯例。不要使用1 - 2个字母的变量,而要使用容易理解的关键词:
tr-〉变换
a-〉旋转偏移
子弹预制-〉子弹预制
速度-〉速度
你应该学习conventions,这样你的代码对别人和你自己来说都更清楚。
最后一个技巧,如果你的循环可以预测它的结束(在这个例子中,它是一个三重触发,所以它是从0到3不包括),那么你应该使用for()而不是while()循环。
我强烈建议你去看看一些基本的编码课程/教程,它会让你在未来免受很多问题的困扰。

esyap4oy

esyap4oy2#

这里有一些一般性建议
首先,让您的检查器公开字段的正确类型了

public Rigidbody2D bulletPrefab;

这样就可以确保引用的对象实际上有这样的组件,并且以后不再需要GetComponent
然后你创建一个数组每次你拍摄..而不是让它持久

private static readonly float[] offsets = {-15f,0f,15f};

那么通常您将使用正确的for循环并迭代数组的实际大小,而不是使用while

for(var i = 0; i < offsets.Length; i++)
{
    ...
}

最后,当你使用物理学时,你不应该通过transform,而应该只通过Rigidbody2D,然后做。

void Shoot()
{

    for(var i = 0; i < offsets.Length; i++)
    {
        var bullet = Instantiate(bulletPrefab, firePoint.position, firePoint.rotation * Quaternion.Euler(0, 0, offsets[i]));
        rb.AddForce(Quaternion.Euler(0, 0, rb.rotation * Vector3.up * Speed, ForceMode2D.Impulse);
    }   
}

相关问题