记录:Unity脚本的编写10.0

目录

  • 前言
  • 实验1: 仿真系统的UI主界面设计
    • 1.实验目的
    • 2.实验内容
    • 3.实验步骤
  • 实验2:仿真系统功能实现
    • 1.实验目的
    • 2.实验内容
    • 3.实验步骤

前言

之前内容的集大成者,一个游戏小demo,虽然很简陋但是还是有一些东西的

实验1: 仿真系统的UI主界面设计

1.实验目的

(1)熟悉Unity中UI界面的设计与编写;
(2)熟悉UI界面中场景转换,UI与场景内容相互关联的方式。
(3)熟悉Unity中MySQL数据库的操作

2.实验内容

新建一个Unity场景,在此场景中实现如下功能:
(1)自行设计一个登录、注册UI界面;
(2)添加数据库的动态链接库文件,提前设计数据库表格(自行设计);
(3)连接数据库,实现增、删、改、查等数据库对用户的操作;
(4)UI界面中包括canvas、Image、RawImage、Button等多种UI元素;
(5)实现点击Play按钮转换场景,点击Exit退出游戏的功能;
(6)实现主界面添加音量滑动杆、静音等功能,添加背景音乐和音效音乐;
(7)为UI界面单独设置一个场景,并设置编号为0。

3.实验步骤

1.自行设计一个登录、注册UI界面
记录:Unity脚本的编写10.0_第1张图片

一个设计好的UI界面,包含背景图片,登录注册,文本输入等功能,这好像没啥好说的
2.添加数据库的动态连接库文件,提前设计数据库表格(自行设计)
首先添加文件
在这里插入图片描述
记录:Unity脚本的编写10.0_第2张图片

添加这些关于数据库连接的文件之后,设计数据库的表格
记录:Unity脚本的编写10.0_第3张图片

设计好的表格如上,虽然很简陋,但是够用,至于为什么叫qquser(难道我会说我是直接用的以前用过的数据库,懒得创建新的吗)
3.连接数据库,实现增删改查等数据库对用户的操作

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using MySql.Data.MySqlClient;//MySql连接器命名空间
using System;

public class mysql : MonoBehaviour
{
    //创建数据库
    //服务器名称,端口号,数据库,用户名,密码,数据格式,连接形式

    // Start is called before the first frame update
    string strConn = "server =localhost;port=3306;database=qqdb;user=root;password=12345678;Charset=utf8";

    //创建Mysql连接器
    MySqlConnection sqlConnection;
    void Start()
    {
        //操作数据库的第一步
        sqlConnection = new MySqlConnection(strConn);
        try
        {
            sqlConnection.Open();
            Debug.Log(sqlConnection.State);

            //1.增 insert
            //InsterData();
            //2.删 delet
            //DeletData();
            //3.改 update
            //UpdateData();
            //4.查 select
            SelectData();
        }
        catch(System.Exception) {
            throw;
        }
        finally{
            if(sqlConnection.State.ToString()=="open")
//操作数据库的最后一步
        
        sqlConnection.Close();
        Debug.Log(sqlConnection.State);
        }
        }

    private void SelectData()
    {
        //写sql语句
        string strSql = "select * from qquser where QQUserId= 5;";
        //使用MySqlCommand发送语句
        using(MySqlCommand mySqlCommand = new MySqlCommand(strSql, sqlConnection))
        {
             //执行ExecuteReader方法
             using(MySqlDataReader mySqlDataReader = mySqlCommand.ExecuteReader())
            {
                //通过MySqlDataReader读取数据
                while (mySqlDataReader.Read()){
                    //使用GetXXX获取不同类型的数据
                    Debug.Log(mySqlDataReader.GetString(0));
                    Debug.Log(mySqlDataReader.GetString(1));
                    //Debug.Log(mySqlDataReader.GetString(2));
                }
            }
        }
        

       
        //throw new NotImplementedException();
    }

    private void UpdateData()
    {
        throw new NotImplementedException();
    }

    private int DeletData()
    {
        string strSql = "delete from qquser where QQUserId=7;";
        using (MySqlCommand mySqlCommand = new MySqlCommand(strSql, sqlConnection))
        {
            //执行ExecuteNonQuery方法
            return mySqlCommand.ExecuteNonQuery();
            throw new NotImplementedException();
        }
    }

    private void InsterData()
    {
        //写sql语句
        //string strSql = "insert into student(name,age) values('虚竹',25);";
        string strSql = "insert into qquser(QQUserId,QQPassword) values(7,321);";
        //使用MySqlCommand发送语句
        using (MySqlCommand mySqlCommand = new MySqlCommand(strSql, sqlConnection))
        {
//执行ExecuteNonQuery方法
        mySqlCommand.ExecuteNonQuery();
        throw new NotImplementedException();
        }
        
    }


    // Update is called once per frame
    void Update()
    {
       
    }
}

以上是关于数据库连接及增删改查的代码,下面是表现
增加成功后
记录:Unity脚本的编写10.0_第4张图片

删除成功后
记录:Unity脚本的编写10.0_第5张图片

查询成功
记录:Unity脚本的编写10.0_第6张图片

  1. UI界面中包括canvas、Image、RawImage、Button等多种UI元素
    记录:Unity脚本的编写10.0_第7张图片

如图所示,ui界面中包含有包括canvas,image,rawimage,button在内的多种组件
5. 实现点击Play按钮转换场景,点击Exit退出游戏的功能
首先run一下项目
记录:Unity脚本的编写10.0_第8张图片

输入用户名密码
记录:Unity脚本的编写10.0_第9张图片

点击登录并play按钮
记录:Unity脚本的编写10.0_第10张图片

发现切换到了另一个场景中,点击exit

发现退出了play模式
6. 实现主界面添加音量滑动杆、静音等功能,添加背景音乐和音效音乐
记录:Unity脚本的编写10.0_第11张图片

偷偷修改了一下布局
在主页面就可以发现有一个滑动杆和一个toggle,这就是控制音量和可以静音的按钮
添加音乐的组件和音乐来进行控制
记录:Unity脚本的编写10.0_第12张图片
记录:Unity脚本的编写10.0_第13张图片

  1. 为UI界面单独设置一个场景,并设置编号为0
    记录:Unity脚本的编写10.0_第14张图片

设置完毕
完整代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using MySql.Data.MySqlClient;
using UnityEngine.UI;
using TMPro;
using System;
using Unity.VisualScripting;
using UnityEngine.UIElements;
using UnityEngine.SceneManagement;

public class Login1 : MonoBehaviour
{
    //创建GUI
    public TMP_InputField inputField1;
    public TMP_InputField inputField2;
    public UnityEngine.UI.Button button1;
    public UnityEngine.UI.Button button2;
    public UnityEngine.UI.Button button3;
    public UnityEngine.UI.Button button4;
    public Text tip;
    //创建数据库
    //服务器名称,端口号,数据库,用户名,密码,连接形式

    string strConn = "server =localhost;port=3306;database=qqdb;user=root;password=12345678;Charset=utf8";

    //创建Mysql连接器
    MySqlConnection sqlConnection;

    string username;
    string password;
    string usernameDB;
    string passwordDB;
    // Start is called before the first frame update
    void Start()
    {
        button1.onClick.AddListener(login);
        button2.onClick.AddListener(register);
        button3.onClick.AddListener(exit);
        button4.onClick.AddListener(delet);
    }

    private void delet()
    {
        username = inputField1.text;
        password = inputField2.text;
        //1.连接并打开数据库
        ConnectDB();
        //2.查找用户名和密码
        SelectDB(username);
        //3.删除用户名和密码
        DeletDB(username, password);
        //4.关闭数据库
        Close();
    }

    

    private void exit()
    {
        //判断是否在编辑器模式下运行
        #if UNITY_EDITOR
        //如果是,就停止播放
        UnityEditor.EditorApplication.isPlaying = false;
        #else
        //如果不是,就退出应用
        Application.Quit();
        #endif
    }

    public void login()
    {
        username = inputField1.text;
        password = inputField2.text;
        //1.连接并打开数据库
         ConnectDB();
        //2.查找用户名和密码
        SelectDB(username);
        //3.关闭数据库
        Close();
        //4.对比用户名和密码
       CompareDB();
    }
    public void register()
    {
        username = inputField1.text;
        password = inputField2.text;
        //1.连接并打开数据库
        ConnectDB();
        //2.查找用户名和密码
        SelectDB(username);
        //3.添加用户名和密码
        InsertDB(username,password);
        //4.关闭数据库
        Close ();
    }

    private int InsertDB(string n,string p)
    {
        //写sql语句
        string strSql = "insert into qquser(QQUserId,QQPassword) values('" + n +"','" + p + "');";
        //使用MySqlCommand发送语句
        using (MySqlCommand mySqlCommand = new MySqlCommand(strSql, sqlConnection))
        {
            //执行ExecuteNonQuery方法
            return mySqlCommand.ExecuteNonQuery();
        }
    }
    private int DeletDB(string n, string p)
    {
        //写出sql语句
        string strSql = "delete from qquser where QQUserId= '" + n + "';";
        using (MySqlCommand mySqlCommand = new MySqlCommand(strSql, sqlConnection))
        {
            //执行ExecuteNonQuery方法
            return mySqlCommand.ExecuteNonQuery();
            throw new NotImplementedException();
        }
    }

    private void ConnectDB()
    {
        sqlConnection = new MySqlConnection(strConn);
        try
        {           
            sqlConnection.Open();
            Debug.Log(sqlConnection.State);
        }catch (Exception)
        {
            
        }
    }

    private void Close()
    {
        if (sqlConnection.State.ToString() == "open")
        {
            //操作数据库的最后一步
            sqlConnection.Close();
        }
    }

    private void SelectDB(string n)
    {
        //写sql语句
        string strSql = "select * from qquser where QQUserId= '" + n + "';";
        //使用MySqlCommand发送语句
        using (MySqlCommand mySqlCommand = new MySqlCommand(strSql, sqlConnection))
        {
            //执行ExecuteReader方法
            using (MySqlDataReader mySqlDataReader = mySqlCommand.ExecuteReader())
            {
                //通过MySqlDataReader读取数据
                while (mySqlDataReader.Read())
                {
                    usernameDB= mySqlDataReader.GetString(0);
                    passwordDB= mySqlDataReader.GetString(1);
                }
            }
        }
    }

    private void CompareDB()
    {
        if(username == usernameDB && password == passwordDB)
        {
            SceneManager.LoadScene(1);
            //方法的重载

            //tip.text= "登录成功";
        }
        else
        {
            tip.text = "登录失败";
        }
    }
}

实验2:仿真系统功能实现

1.实验目的

(1)熟悉在Unity中设置仿真场景;
(2)熟悉在Unity中C#语言的使用;
(3)熟悉仿真功能的实现。

2.实验内容

新建一个仿真场景,完成下列功能:
(1)使用Unity的基本建模功能设置一些三维场景(自行发挥想象,进行建模设计)
(2)实现漫游功能,可以在场景中键盘控制前后左右移动,鼠标控制旋转,完成基本的场景漫游功能。(自行设计)
(3)使用射线,实现获取鼠标的点击功能。(自行设计)
(4)制作内部动画,配合鼠标点击,实现播放动画。(自行设计)
(5)设置触发器,当漫游相机进到入触发器中时,执行动画的播放。(自行设计)
(6)添加背景音乐和鼠标点击的音效(自行设计)
(7)添加UI按钮设计,要求可以返回主控界面。(自行设计)
(8)打包,生成可执行文件,要求可执行文件脱离Unity环境后,能够自行运行。

3.实验步骤

1.使用Unity的基本建模功能设置一些三维场景(自行发挥想象,进行建模设计)
进行一些三维场景的建设
记录:Unity脚本的编写10.0_第15张图片

  1. 实现漫游功能,可以在场景中键盘控制前后左右移动,鼠标控制旋转,完成基本的场景漫游功能。(自行设计)
    记录:Unity脚本的编写10.0_第16张图片
    记录:Unity脚本的编写10.0_第17张图片

实现了上述的漫游功能
代码:

protected void Move()
{
    float x = Input.GetAxis("Horizontal");
    float z = Input.GetAxis("Vertical");
    float y = Input.GetAxis("Jump");
transform.Translate(new Vector3(x, y, z) * floSpeed * Time.deltaTime);
}
  1. 使用射线,实现获取鼠标的点击功能。(自行设计)
    通过脚本控制射线,使得鼠标点击的时候实现功能
    记录:Unity脚本的编写10.0_第18张图片

如图,可以对点击的方向发射小球
代码:

private void learnRay()
{
    if (Input.GetMouseButtonDown(0))
    {
        //创建一道射线
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        //检测射线
        if (Physics.Raycast(ray,out RaycastHit hitInfo))
        {
            //hitInfo.transform.Translate(transform.up * 10);
            //Debug.Log(hitInfo.transform.name);
            //rb.AddForce(transform.up * 500);
            //Debug.Log(hitInfo.transform.name);
            //Debug.Log(hitInfo.point);
            //hitInfo.point;   //射线撞击点

            GameObject shell = Instantiate(Sphere,transform.position+transform.right*offset,transform.rotation);
            shell.GetComponent().velocity = Vector3.Normalize(hitInfo.point - transform.position) * 20;
            // 计算小球的动量
            //Vector3 ballMomentum = shell.GetComponent().velocity * shell.GetComponent().mass;
            // 给物体施加一个与小球相反方向的同等大小的力,抵消小球的反作用力
            //rb.AddForce(-ballMomentum, ForceMode.Impulse);
        }
            
    }
}
  1. 制作内部动画,配合鼠标点击,实现播放动画。(自行设计)
    记录:Unity脚本的编写10.0_第19张图片

如图,当在点击时,小人就会播放一段动画
代码:

public class triger : MonoBehaviour
{
    // 获取Animator组件
    private Animator animator;

    private void Start()
    {
        animator = GetComponent();
    }

    private void Update()
    {
        // 如果鼠标左键点击
        if (Input.GetMouseButtonDown(0))
        {
            // 激活触发器"Play"
            //animator.SetTrigger("Play");
            // animator.Play("idle.pickup",0, 0f);
            animator.Play(Animator.StringToHash("pickup"));
        }
    }
}
  1. 设置触发器,当漫游相机进到入触发器中时,执行动画的播放。(自行设计)
    记录:Unity脚本的编写10.0_第20张图片

如图,在经过一个设置好的空物体时就会触发触发器,执行动画的播放
6. 添加背景音乐和鼠标点击的音效(自行设计)
记录:Unity脚本的编写10.0_第21张图片
记录:Unity脚本的编写10.0_第22张图片

在进入游戏以及鼠标点击的时候(也就是发射小球),都会出发不同的音乐和音效
代码控制:背景音乐

public class newscript : MonoBehaviour
{
    // Start is called before the first frame update
    AudioSource ads;
    AudioClip ac;
    List acs = new List();
    int j = 0;
    void Start()
    {
        #region source
        //ads = GetComponent();
        //ads.Play();//播放
        // ads.Pause();//暂停
        // ads.UnPause();//继续播放
        // ads.PlayOneShot();//播放一次
        // ads.volume;//音量
        // ads.playOnAwake;//唤醒时播放
        // ads.mute;//静音
        //ads.loop;//循环
        // ads.isPlaying;//是否播放中
        // ads.clip;//声音片段 
        #endregion
        //加载音频设置
        ac = Resources.Load("Assets/resource/AudioClip/1.mp3") as AudioClip;
        ads = GetComponent();
        for(int i = 0;i < 3; i++){
            ac = Resources.Load("Assets/resource/AudioClip/1.mp3") as AudioClip;
            acs.Add(ac);
        } 
    }

    // Update is called once per frame
    void Update()
    {
        
        changeVolume();
        playMusic();
        changeMusic();
    }

    private void changeMusic()
    {
        if (Input.GetKey(KeyCode.Tab))
        {
            ads.clip = acs[j];
            ads.Play();
            if (j < acs.Count - 1)
            {
                j++;
            }
            else
            {
                j = 0;
            }
        }
    }

    private void playMusic()
    {
        if (Input.GetKey(KeyCode.B))
        {
            if (ads.isPlaying)
            {
                ads.Pause();
            }
            else
            {
                ads.UnPause();
            }
        }
        
    }

    private void changeVolume()
    {
        if (Input.GetKey(KeyCode.M))
        {
            ads.volume += 0.5f;
        }
        if (Input.GetKey(KeyCode.N))
        {
            ads.volume -= 0.5f;
        }
        
    }
}
点击音效
protected void shoot()
{
    if (Input.GetMouseButtonDown(0))
    {
        ads.Play();
    }
}
  1. 添加UI按钮设计,要求可以返回主控界面。(自行设计)
    记录:Unity脚本的编写10.0_第23张图片
    记录:Unity脚本的编写10.0_第24张图片

在场景中点击esc就会弹出返回主控界面的按钮,点击按钮就会返回之前的页面
代码:

public class TransScene : MonoBehaviour
{
    // 按钮的引用
    public UnityEngine.UI.Button button1;

    // Canvas Group 组件的引用
    private CanvasGroup canvasGroup;

    // 按钮的当前状态,true 表示可见,false 表示不可见
    private bool visible;

    // Start is called before the first frame update
    void Start()
    {
        // 获取 Canvas Group 组件
        canvasGroup = button1.GetComponent();

        // 初始时隐藏按钮
        HideButton();

        button1.onClick.AddListener(transScene);
    }

    // Update is called once per frame
    void Update()
    {
        // 检测用户是否按下 esc 键
        if (Input.GetKeyDown(KeyCode.Escape))
        {
            // 调用函数切换按钮状态
            ToggleButton();
        }
    }

    // 显示按钮的函数
    void ShowButton()
    {
        // 设置 Alpha 为 1
        canvasGroup.alpha = 1f;

        // 设置 Interactable 和 Blocks Raycasts 为 true
        canvasGroup.interactable = true;
        canvasGroup.blocksRaycasts = true;

        // 更新按钮状态
        visible = true;
    }

    // 隐藏按钮的函数
    void HideButton()
    {
        // 设置 Alpha 为 0
        canvasGroup.alpha = 0f;

        // 设置 Interactable 和 Blocks Raycasts 为 false
        canvasGroup.interactable = false;
        canvasGroup.blocksRaycasts = false;

        // 更新按钮状态
        visible = false;
    }

    // 切换按钮状态的函数
    void ToggleButton()
    {
        // 根据当前状态调用相应的函数
        if (visible)
        {
            HideButton();
        }
        else
        {
            ShowButton();
        }
    }

    private void transScene()
    {

                SceneManager.LoadScene("login");

        }
}
  1. 打包,生成可执行文件,要求可执行文件脱离Unity环境后,能够自行运行。
    记录:Unity脚本的编写10.0_第25张图片

使用unity自带的功能就可以打包生成出来了
记录:Unity脚本的编写10.0_第26张图片

经过尝试,可以脱离unity运行

以上。

你可能感兴趣的:(软件构造,unity,oracle,游戏引擎,数据库,c#)