iT邦幫忙

2024 iThome 鐵人賽

DAY 13
0
Software Development

初心者限定!設計師帶你學 Unity 3D 遊戲程式設計系列 第 13

Day13 / Unity C# 語法練習開始!躲避子彈小遊戲 (二) 靈活的子彈攻擊

  • 分享至 

  • xImage
  •  

Day13

STEP 8

製作子彈發射器


建立一個 Cube 並移至牆外,作為子彈發射器

再建立一個 Sphere 移至牆外,作為子彈

01

STEP 9

建立子彈腳本,控制子彈的移動


對 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);
	}
}

02
03
04

STEP 10

將子彈製作成預載物件( Prefab )


對 Assets 資料夾 點擊右鍵 選擇 Create 點選 Folder 將資料夾命名為 Prefab

將 子彈物件 拖曳至 Prefab 的資料夾中,看到子彈物件的 icon變為藍色方塊 即可

建立好子彈的 Prefab 後,便可將 原先的子彈物件 改為 Inactive

05
06
07

STEP 11

建立發射器腳本,控制發射器發射子彈


對 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 資料夾中的 子彈物件 拖曳至此欄位中即可

08
09
10
11

STEP 12

修改發射器腳本,使子彈發射位置與發射器位置重合


開啟 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);
	}
}

12

STEP 13

修改發射器腳本,使發射器得以自動發射子彈


開啟 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);
}

13

上圖第 11 行程式碼表示 在 0 秒時呼叫名為 Fire 的方法區塊,且每間隔 2 秒重新呼叫一次

STEP 14

修改發射器腳本,使發射器可以朝任意方向發射子彈


開啟 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;
}

14

STEP 15

將四周佈滿發射器,並調整各個發射器的發射方向與速度


回到 Unity 視窗 複製出多個發射器

調整發射器腳本中的 Direction、isFront、speed 與 gunSpeed 參數

15
16

STEP 16

修改子彈腳本,使子彈發射過後間隔一段時間便自動消滅


開啟 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);
}

17

STEP 17

新增子彈樣式,使其發出白光


將 子彈物件 變回 Active 狀態 點擊 子彈物件旁的小箭頭,進入 預載物件的編輯模式

進入編輯模式後,對子彈 點擊右鍵 新增一個 Point Light 將 Intensity 改為 1.5

點擊左上角的箭頭結束編輯模式 將此修改後的物件重新命名為 子彈 ( 白光 )

將 子彈 ( 白光 ) 物件 拖曳至 Prefab 資料夾中

點選 Original Prefab 新增一個名為子彈 ( 白光 ) 的預載物件

18
19
20
21
22

將 Directional Light 關閉可以更好地查看子彈的發光效果喔!

23

STEP 18

將剛新增的子彈樣式,套用到發射器上


選擇發射器、發射器(1)、發射器(2)

將 Prefab 資料夾中的 子彈 ( 白光 ) 物件 拖曳至 bullet Prefab 的欄位當中

點擊播放即可查看效果

24
25

STEP 19

新增材質,使四周環境變黑色


對 Assets 資料夾 點擊右鍵 選擇 Create 點選 Folder 命名為 Mat

對 Mat 資料夾 點擊右鍵 選擇 Create 點選 Material 命名為 Black

點擊 Black 材質球 並將其 Albedo 顏色改為黑色

將 Black 材質球 拖曳至地板與牆壁等物件上即可

26
27
28

STEP 20

重複上述動作,並加入自己的想法到場景中


可以透過更改子彈發光顏色與環境材質等等,讓你的場景變得更豐富!

29


上一篇
Day12 / Unity C# 語法練習開始!躲避子彈小遊戲 (一) 玩家控制
下一篇
Day14 / Unity 可愛的 NewJeans 2D 遊戲 - 建立場景
系列文
初心者限定!設計師帶你學 Unity 3D 遊戲程式設計31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言