繁体   English   中英

unity C# 脚本旋转偏移

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM