製作子彈發射器
建立一個 Cube 並移至牆外,作為子彈發射器
➔ 再建立一個 Sphere 移至牆外,作為子彈
建立子彈腳本,控制子彈的移動
對 Script 資料夾 點擊右鍵 ➔ 選擇 Create ➔ 點選 C# Script ➔ 命名為 Bullet
➔ 將 Bullet 腳本拖曳至子彈物件中 ➔ 開啟 Bullet 腳本,輸入以下程式碼並存檔
public string direction = "Z";
public bool isFront = true;
public float speed = 0.5f;
void Start()
{
}
void Update()
{
float posX = gameObject.transform.position.x;
float posY = gameObject.transform.position.y;
float posZ = gameObject.transform.position.z;
// 如果為X,則進行左右移動
if (direction == "X" && isFront == true)
{
gameObject.transform.position = new Vector3 (posX - speed, posY, posZ);
}
if (direction == "X" && isFront == false)
{
gameObject.transform.position = new Vector3 (posX + speed, posY, posZ);
}
// 如果為Y,則進行上下移動
if (direction == "Y" && isFront == true)
{
gameObject.transform.position = new Vector3 (posX, posY + speed, posZ);
}
if (direction == "Y" && isFront == false)
{
gameObject.transform.position = new Vector3 (posX, posY - speed, posZ);
}
// 如果為Z,則進行前後移動
if (direction == "Z" && isFront == true)
{
gameObject.transform.position = new Vector3 (posX, posY, posZ - speed);
}
if (direction == "Z" && isFront == false)
{
gameObject.transform.position = new Vector3 (posX, posY, posZ + speed);
}
}
將子彈製作成預載物件( Prefab )
對 Assets 資料夾 點擊右鍵 ➔ 選擇 Create ➔ 點選 Folder ➔ 將資料夾命名為 Prefab
➔ 將 子彈物件 拖曳至 Prefab 的資料夾中,看到子彈物件的 icon變為藍色方塊 即可
➔ 建立好子彈的 Prefab 後,便可將 原先的子彈物件 改為 Inactive
建立發射器腳本,控制發射器發射子彈
對 Script 資料夾 點擊右鍵 ➔ 選擇 Create ➔ 點選 C# Script ➔ 命名為 Gun
➔ 將 Gun 腳本拖曳至發射器物件中 ➔ 開啟 Gun 腳本,輸入以下程式碼並存檔
public GameObject bulletPrefab;
void Start()
{
}
void Update()
{
// 按下空白鍵發射子彈
if (Input.GetKeyDown(KeyCode.Space))
{
Instantiate(bulletPrefab);
}
}
➔ 回到 Unity 視窗中,查看 發射器 物件中的 Gun 腳本處,應增加了一個名為
Bullet Prefab 的欄位 ➔ 將 Prefab 資料夾中的 子彈物件 拖曳至此欄位中即可
修改發射器腳本,使子彈發射位置與發射器位置重合
開啟 Gun 腳本,將原本的程式碼修改為以下版本並存檔
public GameObject bulletPrefab;
void Start()
{
}
void Update()
{
// 按下空白鍵發射子彈
if (Input.GetKeyDown(KeyCode.Space))
{
float posX = gameObject.transform.position.x;
float posY = gameObject.transform.position.y;
float posZ = gameObject.transform.position.z;
GameObject temp = Instantiate(bulletPrefab);
temp.transform.position = new Vector3 (posX, posY, posZ);
}
}
修改發射器腳本,使發射器得以自動發射子彈
開啟 Gun 腳本,將原本的程式碼修改為以下版本並存檔
public GameObject bulletPrefab;
void Start()
{
// Method名稱,初次呼叫時間, 呼叫間隔時間
InvokeRepeating("Fire", 0f, 2f);
}
void Update()
{
}
void Fire()
{
float posX = gameObject.transform.position.x;
float posY = gameObject.transform.position.y;
float posZ = gameObject.transform.position.z;
GameObject temp = Instantiate(bulletPrefab);
temp.transform.position = new Vector3 (posX, posY, posZ);
}
上圖第 11 行程式碼表示 在 0 秒時呼叫名為 Fire 的方法區塊,且每間隔 2 秒重新呼叫一次
修改發射器腳本,使發射器可以朝任意方向發射子彈
開啟 Gun 腳本,將原本的程式碼修改為以下版本並存檔
public GameObject bulletPrefab;
public float gunSpeed = 2f;
// 子彈資訊
public string direction = "Z";
public bool isFront = true;
public float speed = 0.5f;
void Start()
{
// Method名稱,初次呼叫時間, 呼叫間隔時間
InvokeRepeating("Fire", 0f, gunSpeed);
}
void Update()
{
}
void Fire()
{
float posX = gameObject.transform.position.x;
float posY = gameObject.transform.position.y;
float posZ = gameObject.transform.position.z;
GameObject temp = Instantiate(bulletPrefab);
temp.transform.position = new Vector3 (posX, posY, posZ);
temp.GetComponent<Bullet>().direction = direction;
temp.GetComponent<Bullet>().isFront = isFront;
temp.GetComponent<Bullet>().speed = speed;
}
將四周佈滿發射器,並調整各個發射器的發射方向與速度
回到 Unity 視窗 ➔ 複製出多個發射器
➔ 調整發射器腳本中的 Direction、isFront、speed 與 gunSpeed 參數
修改子彈腳本,使子彈發射過後間隔一段時間便自動消滅
開啟 Bullet 腳本,將原本的程式碼修改為以下版本並存檔
public string direction = "Z";
public bool isFront = true;
public float speed = 0.5f;
void Start()
{
// 在第五秒時呼叫名為KillMe的Method
Invoke("KillMe", 5f);
}
void Update()
{
float posX = gameObject.transform.position.x;
float posY = gameObject.transform.position.y;
float posZ = gameObject.transform.position.z;
if (direction == "X" && isFront == true)
{
gameObject.transform.position = new Vector3(posX - speed, posY, posZ);
}
if (direction == "X" && isFront == false)
{
gameObject.transform.position = new Vector3(posX + speed, posY, posZ);
}
if (direction == "Y" && isFront == true)
{
gameObject.transform.position = new Vector3(posX, posY + speed, posZ);
}
if (direction == "Y" && isFront == false)
{
gameObject.transform.position = new Vector3(posX, posY - speed, posZ);
}
if (direction == "Z" && isFront == true)
{
gameObject.transform.position = new Vector3(posX, posY, posZ - speed);
}
if (direction == "Z" && isFront == false)
{
gameObject.transform.position = new Vector3(posX, posY, posZ + speed);
}
}
// 新增一個用來消滅子彈的Method
void KillMe()
{
Destroy(gameObject);
}
新增子彈樣式,使其發出白光
將 子彈物件 變回 Active 狀態 ➔ 點擊 子彈物件旁的小箭頭,進入 預載物件的編輯模式
➔ 進入編輯模式後,對子彈 點擊右鍵 ➔ 新增一個 Point Light ➔ 將 Intensity 改為 1.5
➔ 點擊左上角的箭頭結束編輯模式 ➔ 將此修改後的物件重新命名為 子彈 ( 白光 )
➔ 將 子彈 ( 白光 ) 物件 拖曳至 Prefab 資料夾中
➔ 點選 Original Prefab 新增一個名為子彈 ( 白光 ) 的預載物件
將 Directional Light 關閉可以更好地查看子彈的發光效果喔!
將剛新增的子彈樣式,套用到發射器上
選擇發射器、發射器(1)、發射器(2)
➔ 將 Prefab 資料夾中的 子彈 ( 白光 ) 物件 拖曳至 bullet Prefab 的欄位當中
➔ 點擊播放即可查看效果
新增材質,使四周環境變黑色
對 Assets 資料夾 點擊右鍵 ➔ 選擇 Create ➔ 點選 Folder ➔ 命名為 Mat
➔ 對 Mat 資料夾 點擊右鍵 ➔ 選擇 Create ➔ 點選 Material ➔ 命名為 Black
➔ 點擊 Black 材質球 並將其 Albedo 顏色改為黑色
➔ 將 Black 材質球 拖曳至地板與牆壁等物件上即可
重複上述動作,並加入自己的想法到場景中
可以透過更改子彈發光顏色與環境材質等等,讓你的場景變得更豐富!