1. 程式人生 > >【Salvation】——關卡功能&數據庫基礎實現

【Salvation】——關卡功能&數據庫基礎實現

inpu username php語言 p s pre getc c#語言 int ext

寫在前面:項目的關卡功能和數據庫基礎實現是小組其他成員實現的部分,這裏作為學習總結。關卡功能塊使用C#語言編寫腳本,在Unity3D遊戲引擎的環境中實現,數據庫功能塊使用PHP作為服務端獲取MySQL中的數據。


技術分享 技術分享 技術分享
按鍵決定碰撞盒的觸發 碰撞消除物體增減值
按鈕實現的場景切換

一、碰撞盒

  • 按鍵決定碰撞盒的觸發。
  • 物體有時障礙阻礙玩家前進,有時則是玩家通過一個懸崖的必須道具。
  • 按鍵不同決定了這些物體的碰撞盒是否觸發,如按J鍵時星星的碰撞盒不觸發,按K鍵時星星的碰撞盒觸發,玩家可以利用星星來跳過障礙物。
  • 關鍵類:↓
  1. private void OnCollisionEnter(Collision collision) 兩個物體的碰撞盒互相接觸所觸發的事件,如銷毀物體,切換場景等。
  2. Start,bird,duck 按鍵決定碰撞盒的觸發。如按J鍵時星星的碰撞盒不觸發,按K鍵時星星的碰撞盒觸發。
  3. tree 當樹碰到tag為Player的人物時,跳轉場景。或在第三關時人物碰到tag為tree的樹時跳轉到結局動畫。
  4. 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點的時候,玩家死亡。
  • 殺戮值不同遊戲的結局也不同。
  • 關鍵類: ↓
  1. DontDestroyOnLoad(transform.gameObject) 物體不可摧毀,加在人物上,人物死亡後銷毀人物。

  2. kills 每殺一只動物,玩家的生命值和殺戮值都上升一點。當生命值掉到0點的時候,玩家死亡。

  3. canvas Canvas成為人物的子物體,與人物一樣不可摧毀。從第一關開始攜帶的分數,只要人物不死亡就能一直攜帶到結局。

  4. 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() { } 的代碼,將按鈕與代碼聯系在一起。
  • 點擊按鈕觸發場景切換,或是通過碰撞盒實現場景的切換。
  • 關鍵類:↓
  1. public void Click_test() 點擊按鈕,切換遊戲場景

  2. Application.LoadLevel("dead") 切換場景代碼

  3. 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連接數據庫

  • 思路:
  1. 用php語言獲取localhost的用戶名,密碼和數據庫 → $servername = "localhost"; $server_username = "root"; $server_password = ""; $dbName = "game";
  2. $_POST[] 獲取unity上數據進行存儲 → $id = $_POST["idPost"];
  3. 連接mysql → $conn = new mysqli($servername, $server_username, $server_password, $dbName);
  4. 然後用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中的信息

  • 思路:
  1. 在cs文件中,先用string CreateUserURL = “localhost/數據庫名/.php文件” 獲取本地數據庫位置。

  2. 用CreateUser(string ,sring) 函數獲取unity中,想要傳輸到數據庫的信息。

  3. 通過unity中內置的 WWWForm 類 WWW類,運用 WWWform.AddField (String,String) 方法 通過post的表單提交方式把表單參數傳遞給服務器端的邏輯業務層。

  4. 在每次數據更新後,記錄鍵盤輸入的信息,將它們傳送給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】——關卡功能&數據庫基礎實現