iT邦幫忙

2024 iThome 鐵人賽

DAY 15
0

Day15

STEP 6

控制 Block 不斷向遊戲畫面左側移動


建立一個名為 BlockManager 的腳本,並拖曳至 Block 群組物件 上

開啟 BlockManager 腳本,輸入以下程式碼並存檔

public float speed = 0.03f;

void Start()
{

}

void Update()
{
		float posX = gameObject.transform.position.x;
		float posY = gameObject.transform.position.y;
		float posZ = gameObject.transform.position.z;
		
    gameObject.transform.position = new Vector3(posX - speed, posY, posZ);

		if (posX <= -15f)
	  {
				Destroy(gameObject);
    }
}

01
02

STEP 7

為 Player 物件新增剛體與腳本,使其與物件接觸時能有碰撞反應


建立一個名為 PlayerController 的腳本,並拖曳至 Player 物件 上

為 Player 物件新增一個 Rigidbody,並 取消勾選 Use Gravity

開啟 PlayerController 腳本,將原本在 GameManager 腳本 中,除了

public GameObject player; 以外的程式碼剪貼至此腳本上

public float currentPosY = 0;
public float speed = 0;

void Start()
{
		currentPosY = 0.75f;
		speed = 0.1f;
}

void Update()
{
		// 玩家往上移動
		if (Input.GetKey(KeyCode.UpArrow) || Input.GetKey(KeyCode.W))
		{
				currentPosY = currentPosY + speed;

				if (currentPosY >= 5.3f)
				{
						currentPosY = 5.3f;
				}
		}

    // 玩家往下移動
    if (Input.GetKey(KeyCode.DownArrow) || Input.GetKey(KeyCode.S))
    {
				currentPosY = currentPosY - speed;

				if (currentPosY <= -3.3f)
				{
						currentPosY = -3.3f;
				}
    }
        gameObject.transform.position = new Vector3(-5.5f, currentPosY, 0f);
    }

03
04
05

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

06

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

STEP 8

偵測障礙物與得分物件的撞擊反應


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

public float currentPosY = 0;
public float speed = 0;

void Start()
{
		currentPosY = 0.75f;
		speed = 0.1f;
}

void Update()
{
		// 玩家往上移動
		if (Input.GetKey(KeyCode.UpArrow) || Input.GetKey(KeyCode.W))
		{
				currentPosY = currentPosY + speed;

				if (currentPosY >= 5.3f)
				{
						currentPosY = 5.3f;
				}
		}

    // 玩家往下移動
    if (Input.GetKey(KeyCode.DownArrow) || Input.GetKey(KeyCode.S))
    {
				currentPosY = currentPosY - speed;

				if (currentPosY <= -3.3f)
				{
						currentPosY = -3.3f;
				}
    }
        gameObject.transform.position = new Vector3(-5.5f, currentPosY, 0f);
}

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

		if (type == "floor")
    {
		    Debug.Log("hit floor");
    }

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

		if (type == "cookie")
    {
		    Debug.Log("hit cookie");
    }

		if (type == "enemy")
    {
		    Debug.Log("hit enemy");
    }

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

勾選 Player 物件中 Box Collider 的 Is Trigger 選項

在 Tag 的下拉式選單中點選 Add Tag 為每個障礙物與得分物件 加上相對應的 Tag

07

示意圖標記 PlayerController 腳本修改與新增之程式碼

08
09

點擊加號自行新增及命名標籤

STEP 9

使用 FixedUpdate 的方式修改程式碼,使物件能夠等速前進


開啟 BlockManager 腳本,將原本的 Update 中的程式碼剪貼至 FixedUpdate 區塊中

void Update()
{

}

private void FixedUpdate()
{
		float posX = gameObject.transform.position.x;
		float posY = gameObject.transform.position.y;
		float posZ = gameObject.transform.position.z;
		
    gameObject.transform.position = new Vector3(posX - speed, posY, posZ);

		if (posX <= -15f)
	  {
				Destroy(gameObject);
    }
}

開啟 PlayerController 腳本,將原本的 Update 中的程式碼剪貼至 FixedUpdate 區塊中

void Update()
{
	
}

private void FixedUpdate()
{
		// 玩家往上移動
		if (Input.GetKey(KeyCode.UpArrow) || Input.GetKey(KeyCode.W))
		{
				currentPosY = currentPosY + speed;

				if (currentPosY >= 5.3f)
				{
						currentPosY = 5.3f;
				}
		}

    // 玩家往下移動
    if (Input.GetKey(KeyCode.DownArrow) || Input.GetKey(KeyCode.S))
    {
				currentPosY = currentPosY - speed;

				if (currentPosY <= -3.3f)
				{
						currentPosY = -3.3f;
				}
    }
        gameObject.transform.position = new Vector3(-5.5f, currentPosY, 0f);
}

10

示意圖為 BlockManager 腳本修改後之程式碼

11

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

STEP 10

設定各項遊戲數值


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

public GameObject player;
public int score = 0;
public int hp = 3;
public int cookiePower = 0;

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

void Update()
{

}

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

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

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

12

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

STEP 11

設定偵測到撞擊障礙物時,生命值減少的情況


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

public GameManager gm;
public float currentPosY = 0;
public float speed = 0;

void Start()
{
		// 第一個GameManager代表GameManager物件,第二個代表GameManager腳本
		gm = GameObject.Find("GameManager").GetComponent<GameManager>();

		currentPosY = 0.75f;
		speed = 0.1f;
}

void Update()
{
	
}

private void FixedUpdate()
{
		// 玩家往上移動
		if (Input.GetKey(KeyCode.UpArrow) || Input.GetKey(KeyCode.W))
		{
				currentPosY = currentPosY + speed;

				if (currentPosY >= 5.3f)
				{
						currentPosY = 5.3f;
				}
		}

    // 玩家往下移動
    if (Input.GetKey(KeyCode.DownArrow) || Input.GetKey(KeyCode.S))
    {
				currentPosY = currentPosY - speed;

				if (currentPosY <= -3.3f)
				{
						currentPosY = -3.3f;
				}
    }
        gameObject.transform.position = new Vector3(-5.5f, currentPosY, 0f);
}

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

		if (type == "floor")
    {
		    Debug.Log("hit floor");
				gm.updateHP(-1); // 撞到地板扣一血
    }

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

		if (type == "cookie")
    {
		    Debug.Log("hit cookie");
    }

		if (type == "enemy")
    {
		    Debug.Log("hit enemy");
				gm.updateHP(-1); // 撞到敵人扣一血
    }

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

13

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

14

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


上一篇
Day14 / Unity 可愛的 NewJeans 2D 遊戲 - 建立場景
下一篇
Day16 / Unity 小聊一下專案管理
系列文
初心者限定!設計師帶你學 Unity 3D 遊戲程式設計31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言