我已经修了一段时间,似乎不能让它正常工作,它有时工作,但其他时候没有。
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页的谷歌。
2条答案
按热度按时间hwazgwia1#
我相信,从目前的几个信息,你想"三次射击"你的子弹从你的枪的位置,并使它前进取决于你的枪旋转和旋转偏移?如果是这样,那么这里是你的代码的问题和解决方案:
我推荐使用
tr.eulerAngles
,它使用Vector3,更容易理解和操作。有了它,你可以简单地做:这将使你的子弹复制枪的旋转。现在,如果你想添加一些旋转到你的子弹,使"三重射击"的效果,你只需要添加一个向量3来修改你的Angular 的y值。* 示例:*
这将解决您的旋转问题。
尽管这一行简单的代码可以解决您的问题,但您的脚本在正确编码和视频游戏基本规则方面存在很多问题。
视频游戏的第一条规则,是永远不要在运行时示例化对象.
为什么?假设你以很快的射速一次发射10颗子弹,那么你的游戏将非常滞后,因为你在你的内存中示例化新的对象(然后擦除)。这是一个非常初学者的问题,只需要使用对象池。
另一个建议是更好地命名你的变量并尊重命名惯例。不要使用1 - 2个字母的变量,而要使用容易理解的关键词:
tr-〉变换
a-〉旋转偏移
子弹预制-〉子弹预制
速度-〉速度
你应该学习conventions,这样你的代码对别人和你自己来说都更清楚。
最后一个技巧,如果你的循环可以预测它的结束(在这个例子中,它是一个三重触发,所以它是从0到3不包括),那么你应该使用for()而不是while()循环。
我强烈建议你去看看一些基本的编码课程/教程,它会让你在未来免受很多问题的困扰。
esyap4oy2#
这里有一些一般性建议
首先,让您的检查器公开字段的正确类型了
这样就可以确保引用的对象实际上有这样的组件,并且以后不再需要
GetComponent
。然后你创建一个数组每次你拍摄..而不是让它持久
那么通常您将使用正确的
for
循环并迭代数组的实际大小,而不是使用while
最后,当你使用物理学时,你不应该通过
transform
,而应该只通过Rigidbody2D
,然后做。