• 【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);
    }

     



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

  • 相关阅读:
    从技术走向管理
    一位大龄程序员所经历的面试的历炼和思考
    从技术谈到管理,把系统优化的技术用到企业管理
    Xamarin.iOS 开发 1通过“与 Mac 配对”进行 Xamarin.iOS 开发
    net 开源工作流比较及应用
    net core体系-UWP
    net 架构-5 ABP框架的Web API调用类在Winform项目中的使用
    net 架构-4ABP框架的Web API调用类的封装和使用
    MVC后台的几种跳转方法
    sqlserver存储过程杀掉数据库中死锁
  • 原文地址:https://www.cnblogs.com/ljq66/p/7777223.html
Copyright © 2020-2023  润新知