【Salvation】——关卡功能&数据库基础实现

写在前面:项目的关卡功能和数据库基础实现是小组其他成员实现的部分,这里作为学习总结。关卡功能块使用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);
}

 



版权声明:本文原创,非本人允许不得转载

原文地址:https://www.cnblogs.com/ljq66/p/7777223.html