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