簡體   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