[英]Unity C# script rotation offset
我已经对此进行了一段时间的修补,但似乎无法使其正常工作,它有时可以工作,但有时却不能。
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 页上似乎也找不到这方面的帮助。
我相信,根据现有的少量信息,您想从枪 position 中“三次发射”子弹,并根据枪的旋转和旋转偏移使其向前移动 go? 如果是这样,那么这里是您的代码的问题和解决方案:
问题
我推荐使用tr.eulerAngles
,它使用 Vector3,它更容易理解和操作。 有了它,您可以简单地执行以下操作:
tr.eulerAngles = firePoint.transform.eulerAngles
这将使你的子弹复制枪的旋转。 现在,如果您想为子弹添加一些旋转以产生“三次射击”效果,您只需要添加一个 Vector3 来修改角度的y值。 例子:
tr.eulerAngles = firePoint.transform.eulerAngles + new Vector3(0, -15, 0);
这将解决您的旋转问题。
升级代码的提示
尽管这行简单的代码可以解决您的问题,但您的脚本在正确编码和视频游戏基本规则方面存在很多问题。
视频游戏的第一条规则是永远不要在运行时实例化 object。
为什么? 假设您以快速射速一次发射 10 发子弹,那么您的游戏将非常滞后,因为您正在实例化 memory 中的新对象(并随后擦除)。 这是一个非常初学者的问题,只需要使用Object 池。
另一个技巧是更好地命名变量并遵守命名约定。 不要使用 1-2 个字母变量,而是使用可理解的关键字:
tr -> 变换
a -> 旋转偏移量
BulletPrefab -> bulletPrefab
速度 -> 速度
您应该学习约定,这样您的代码对其他人和您自己来说都更加清晰。
最后一个提示,如果你的循环可以预测它的结束(在这种情况下它是一个三重镜头所以它是从 0 到 3 独占)那么你应该使用 for() 而不是 while() 循环。
我强烈建议您查看一些基本的编码课程/教程,它将避免您将来遇到很多问题。
这里有一些一般性建议
首先让您的 Inspector 立即暴露正确类型的字段
public Rigidbody2D bulletPrefab;
这样你就可以确保引用的 object 实际上有这样一个组件,以后不需要GetComponent
。
然后你每次拍摄时都创建一个数组..而不是让它持久
private static readonly float[] offsets = {-15f,0f,15f};
那么通常您会使用适当for
循环并迭代数组的实际大小,而不是使用while
for(var i = 0; i < offsets.Length; i++)
{
...
}
最后你不应该 go through transform
when using physics 但只有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);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.