【Salvation】——關卡功能&數據庫基礎實現
寫在前面:項目的關卡功能和數據庫基礎實現是小組其他成員實現的部分,這裏作為學習總結。關卡功能塊使用C#語言編寫腳本,在Unity3D遊戲引擎的環境中實現,數據庫功能塊使用PHP作為服務端獲取MySQL中的數據。
按鍵決定碰撞盒的觸發 | 碰撞消除物體增減值 |
按鈕實現的場景切換 |
一、碰撞盒 |
- 按鍵決定碰撞盒的觸發。
- 物體有時障礙阻礙玩家前進,有時則是玩家通過一個懸崖的必須道具。
- 按鍵不同決定了這些物體的碰撞盒是否觸發,如按J鍵時星星的碰撞盒不觸發,按K鍵時星星的碰撞盒觸發,玩家可以利用星星來跳過障礙物。
- 關鍵類:↓
- private void OnCollisionEnter(Collision collision) 兩個物體的碰撞盒互相接觸所觸發的事件,如銷毀物體,切換場景等。
- Start,bird,duck 按鍵決定碰撞盒的觸發。如按J鍵時星星的碰撞盒不觸發,按K鍵時星星的碰撞盒觸發。
- tree 當樹碰到tag為Player的人物時,跳轉場景。或在第三關時人物碰到tag為tree的樹時跳轉到結局動畫。
- Animal 當人物碰到tag為animal的物體時,物體銷毀。
- 思路:偽代碼 ↓
if (按下J鍵) {
背景圖片切換到changeSprite01
} {
星星的碰撞盒被觸發tempCo.isTrigger = true,鳥和鴨子的碰撞盒不被觸發
} else if (按下K鍵) {
背景圖片切換到changeSprite02
} {
鳥的碰撞盒被觸發,星星和鴨子的碰撞盒不被觸發
} else if (按下L鍵) {
背景圖片切換到changeSprite03
} {
鴨子的碰撞盒被觸發,鳥和星星的碰撞盒不被觸發
}
//關鍵代碼片段 star.cs
using UnityEngine;
using System.Collections;
public class star : MonoBehaviour {
private Collider[] starColliders;
void Start () {
starColliders = GetComponents<Collider>();
}
void Update () {
if (Input.GetKeyDown(KeyCode.K))
{
foreach (Collider tempCo in starColliders)
{
tempCo.isTrigger = true;
}
}
else if (Input.GetKeyDown(KeyCode.J))
{
foreach (Collider tempCo in starColliders)
{
tempCo.isTrigger = false;
}
}
}
}
二、增減值 |
- 碰撞消除物體。
- 物體加上剛體和碰撞盒,觸發者加上Tag。
- 被消除物體根據接觸物體的Tag來判斷是否destroy自己。
- 每殺一只動物,玩家的生命值和殺戮值都上升一點。
- 當生命值掉到0點的時候,玩家死亡。
- 殺戮值不同遊戲的結局也不同。
- 關鍵類: ↓
-
DontDestroyOnLoad(transform.gameObject) 物體不可摧毀,加在人物上,人物死亡後銷毀人物。
-
kills 每殺一只動物,玩家的生命值和殺戮值都上升一點。當生命值掉到0點的時候,玩家死亡。
-
canvas Canvas成為人物的子物體,與人物一樣不可摧毀。從第一關開始攜帶的分數,只要人物不死亡就能一直攜帶到結局。
- void SetCountText() 將canvas上的text與生命,殺戮等數值聯系起來。
- 思路: 偽代碼 ↓
if (碰到的物體tag為animal) {
銷毀animal物體,生命值+1和殺戮值+1
} else if (碰到的物體tag為Dead) {
生命值-1
if (生命值= 0) {
跳轉到dead場景 銷毀人物
}
} if (殺戮值=0) {
跳轉到好結局;
} else if (殺戮值=1或者殺戮值=2) {
跳轉到正常結局 ;
} else if (殺戮值= 3) {
跳轉到壞結局;
}
//關鍵代碼片段 kills.cs → OnCollisionEnter
private void OnCollisionEnter(Collision mCollider)
{
//如果碰到的是動物,則動物消失,數目加1;
if (mCollider.gameObject.tag == "animal")
{
Destroy(mCollider.gameObject);
//Add one to the current value of our count variable.
count = count + 1;
count01 = count01 + 1;
//Update the currently displayed count by calling the SetCountText function.
SetCountText();
}
else if (mCollider.gameObject.tag == "Dead")
{
count01 = count01 - 1;
SetCountText();
if (count01 == 0)
{
Application.LoadLevel("dead");
Destroy(gameObject);
}
}
else if (mCollider.gameObject.tag == "tree")
{
Destroy(gameObject);
if (count == 0)
{
Application.LoadLevel("gd");
}
else if (count == 1 || count==2)
{
Application.LoadLevel("ne");
}
else if (count == 3)
{
Application.LoadLevel("be");
}
}
}
void SetCountText()
{
countText.text = "殺戮值: " + count.ToString();
countText01.text = "生命值: " + count01.ToString();
}
public void CreateScores(string id,int count,int count01){
WWWForm form = new WWWForm ();
form.AddField ("idPost", id);
form.AddField ("scorePost", count);
form.AddField ("lifePost", count01);
WWW www = new WWW (CreateScoresURL,form);
}
void Awake()
{
DontDestroyOnLoad(transform.gameObject);
}
}
三、場景 |
- 按鈕實現的場景切換。
- 給按鈕加上public void Click_test() { } 的代碼,將按鈕與代碼聯系在一起。
- 點擊按鈕觸發場景切換,或是通過碰撞盒實現場景的切換。
- 關鍵類:↓
-
public void Click_test() 點擊按鈕,切換遊戲場景
-
Application.LoadLevel("dead") 切換場景代碼
- OnCollisionEnter 碰撞切換場景
- 思路:偽代碼↓
public void點擊按鈕{
Application.LoadLevel(切換到另一場景);
}
Private void OnCollisionEnter(Collision collision) {
if(碰到了tag為Player的物體) {
Application.LoadLevel(“vi切換到另一場景");
}
}
//關鍵代碼片段 OnCollisionEnter
private void OnCollisionEnter(Collision collision)
{
if (collision.gameObject.tag == "Player")
{
Debug.Log("dead");
changeSpriteRenderer.sprite = changeSprite;
Destroy(gameObject, lifeTime);
}
}
四、Unity連接數據庫 |
- 思路:
- 用php語言獲取localhost的用戶名,密碼和數據庫 → $servername = "localhost"; $server_username = "root"; $server_password = ""; $dbName = "game";
- $_POST[] 獲取unity上數據進行存儲 → $id = $_POST["idPost"];
- 連接mysql → $conn = new mysqli($servername, $server_username, $server_password, $dbName);
- 然後用insert into 將數據插入到數據庫中 $result 用來檢測數據是否正常插入到數據庫中,正常顯示Everything ok. 否則 顯示 there was an error 如果與數據庫連接失敗則顯示Connection Failed. 並返回錯誤原因。
//關鍵代碼片段 InsertUser.php
<?php
$servername ="localhost";
$server_username ="root";
$server_password = "";
$dbName = "game";
$id = $_POST["idPost"];
$password = $_POST["passwordPost"];
//$score = $_POST["scorePost"];
//$life = $_POST["lifePost"];
//$schedule = $_POST["schedulePost"];
$conn = new mysqli($servername,$server_username,$server_password,$dbName);
if(!$conn){
die("Connection Failed." . mysqli_connect_error());
}
$sql = "INSERT INTO gamer (id , password)
VALUES(‘".$id."‘, ‘".$password."‘)";
$result = mysqli_query($conn,$sql);
if(!result) echo "there was an error";
else echo"Everything ok.";
?>
五、獲取Unity中的信息 |
- 思路:
-
在cs文件中,先用string CreateUserURL = “localhost/數據庫名/.php文件” 獲取本地數據庫位置。
-
用CreateUser(string ,sring) 函數獲取unity中,想要傳輸到數據庫的信息。
-
通過unity中內置的 WWWForm 類 和 WWW類,運用 WWWform.AddField (String,String) 方法 通過post的表單提交方式把表單參數傳遞給服務器端的邏輯業務層。
-
在每次數據更新後,記錄鍵盤輸入的信息,將它們傳送給CreateUser函數。
//關鍵代碼片段 dl.cs → CreateUser
public void CreateUser(string id,string password){
WWWForm form = new WWWForm ();
form.AddField ("idPost", id);
form.AddField ("passwordPost", password);
WWW www = new WWW (CreateUserURL,form);
}
版權聲明:非本人允許不得轉載
【Salvation】——關卡功能&數據庫基礎實現