iT邦幫忙

2024 iThome 鐵人賽

DAY 18
0

Day18

遊戲製作

此部分將接續第七週的遊戲製作進度,透過更改物件樣式與程式撰寫,使整體的遊戲畫面與各種遊戲機制變得更加完整豐富。

💡 古古的小提醒:
在開始之前,可以先把底下所列舉的課程素材都下載並導入至 Unity,再跟著接下來的步驟進行操作會更好喔~

Tube constructor kit

FROOD - Free food and drinks pack

Quirky Series - FREE Animals Pack

STEP 1

改變物件樣式


前往 Asset Store 下載適當的素材,或者也可以直接取用上面提供的課程素材

使用上述素材來代替原先用於示意的各個物件,並將其加上 Box Collider 來偵測碰撞

01

兔子可以透過多個 Cube 拼湊而成,Player 作法則可參照古古的課程補充。

02

要記得加上 Box Collider 才有辦法讓物件與 Player 碰撞時產生反應喔!

📝古古的課程補充:
若是要將 Player 物件改為一個外部輸入的圖片模樣,可以透過以下步驟達成。

➊ 取消勾選 Player 物件中的 Mesh Renderer

03

➋ 對 Player 物件點擊右鍵,新增一個 Plane,並將需要的圖片拖曳至 Plane 上

04

➌ 將 Plane 中 Shader 欄位的 Standard 改為 UI/Default 選項

05

➍ 調整圖片的角度、位置與大小就完成啦!

06

STEP 2

使餅乾與兔子在偵測到被碰撞時自動消滅


開啟 PlayerController 腳本,將 OnTriggerEnter 函式中的程式碼修改為以下版本並存檔

07

示意圖為 PlayerController 腳本下半部修改後之程式碼

private void OnTriggerEnter(Collider collision)
{
		string type = collision.gameObject.tag;
		GameObject targetObject = collision.gameObject;

		if (type == "floor")
    {
		    Debug.Log("hit floor");
				gm.updateHP(-1);
    }

		if (type == "rabbit")
    {
		    Debug.Log("hit rabbit");
				Destroy(targetObject); // 消滅被碰撞的兔子
    }

		if (type == "cookie")
    {
		    Debug.Log("hit cookie");
				Destroy(targetObject); // 消滅被碰撞的餅乾
    }

		if (type == "enemy")
    {
		    Debug.Log("hit enemy");
				gm.updateHP(-1);
    }

		if (type == "big-rabbit")
    {
		    Debug.Log("hit big-rabbit");
    }
}

STEP 3

設定吃到餅乾與兔子時的分數變化


開啟 GameManager 腳本,將原本程式碼修改為以下版本並存檔

public GameObject player;
public int score = 0;
public int hp = 3;
public int cookiePower = 0;
public int highScore = 0;
public int rabbitPoint = 0; // 補上rabbitPoint變數

public List<GameObject> steps = new List<GameObject>();

void Start()
{
		score = 0;
		hp = 3;
		cookiePower = 0;
		ChangeStepUI(0);
}

void Update()
{
		if(Input.GetKeyDown(KeyCode.Z))
		{
				GameOver();
		}
}

public void updateHP(int amount)
{
		hp = hp + amount;

		if(hp >= 3)
		{
				hp = 3;
		}

		if(hp <= 0)
		{
				Debug.Log("遊戲結束");
		}
}

// 計算cookiePower分數變化
public void updateCookiePower()
{
		cookiePower = cookiePower + 10;
}

// 計算rabbitPoint分數變化
public void updateRabbitPoint()
{
		rabbitPoint = rabbitPoint + 1;
}

public void ChangeStepUI(int step)
{
		for (int i = 0; i < 3; i++)
		{
				steps[i].SetActive(false);
		}

		steps[step].SetActive(true);
}

public void GameStart()
{
		ChangeStepUI(1);
}

public void Exit()
{
		ChangeStepUI(0);
}

public void GameOver()
{
		ChangeStepUI(2);
}

public void Restart()
{
		ChangeStepUI(0);
}

開啟 PlayerController 腳本,將 OnTriggerEnter 函式中的程式碼修改為以下版本並存檔

private void OnTriggerEnter(Collider collision)
{
		string type = collision.gameObject.tag;
		GameObject targetObject = collision.gameObject;

		if (type == "floor")
    {
		    Debug.Log("hit floor");
				gm.updateHP(-1);
    }

		if (type == "rabbit")
    {
		    Debug.Log("hit rabbit");
				gm.updateRabbitPoint(); // 碰到兔子加1分
				Destroy(targetObject);
    }

		if (type == "cookie")
    {
		    Debug.Log("hit cookie");
				gm.updateCookiePower(); // 碰到餅乾加10分
				Destroy(targetObject);
    }

		if (type == "enemy")
    {
		    Debug.Log("hit enemy");
				gm.updateHP(-1);
    }

		if (type == "big-rabbit")
    {
		    Debug.Log("hit big-rabbit");
    }
}

08

示意圖為 GameManager 腳本上半部修改後之程式碼

09

示意圖為 GameManager 腳本下半部修改後之程式碼

10

示意圖為 PlayerController 腳本下半部修改後之程式碼


上一篇
Day17 / Unity 可愛的 NewJeans 2D 遊戲 - UI 篇
下一篇
Day19 / Unity 動畫 Animation
系列文
初心者限定!設計師帶你學 Unity 3D 遊戲程式設計31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言