控制 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);
}
}
為 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);
}
示意圖為 PlayerController 腳本修改後之程式碼
示意圖為 GameManager 腳本修改後之程式碼
偵測障礙物與得分物件的撞擊反應
開啟 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
示意圖標記 PlayerController 腳本修改與新增之程式碼
點擊加號自行新增及命名標籤
使用 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);
}
示意圖為 BlockManager 腳本修改後之程式碼
示意圖為 PlayerController 腳本修改後之程式碼
設定各項遊戲數值
開啟 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("遊戲結束");
}
}
示意圖為 GameManager 腳本修改後之程式碼
設定偵測到撞擊障礙物時,生命值減少的情況
開啟 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");
}
}
示意圖為 PlayerController 腳本上半部修改後之程式碼
示意圖為 PlayerController 腳本下半部修改後之程式碼