记录:Unity脚本的编写10.0

2023-12-13 04:39:13

前言

之前内容的集大成者,一个游戏小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界面
在这里插入图片描述

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

添加这些关于数据库连接的文件之后,设计数据库的表格
在这里插入图片描述

设计好的表格如上,虽然很简陋,但是够用,至于为什么叫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()
    {
       
    }
}

以上是关于数据库连接及增删改查的代码,下面是表现
增加成功后
在这里插入图片描述

删除成功后
在这里插入图片描述

查询成功
在这里插入图片描述

  1. UI界面中包括canvas、Image、RawImage、Button等多种UI元素
    在这里插入图片描述

如图所示,ui界面中包含有包括canvas,image,rawimage,button在内的多种组件
5. 实现点击Play按钮转换场景,点击Exit退出游戏的功能
首先run一下项目
在这里插入图片描述

输入用户名密码
在这里插入图片描述

点击登录并play按钮
在这里插入图片描述

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

发现退出了play模式
6. 实现主界面添加音量滑动杆、静音等功能,添加背景音乐和音效音乐
在这里插入图片描述

偷偷修改了一下布局
在主页面就可以发现有一个滑动杆和一个toggle,这就是控制音量和可以静音的按钮
添加音乐的组件和音乐来进行控制
在这里插入图片描述
在这里插入图片描述

  1. 为UI界面单独设置一个场景,并设置编号为0
    在这里插入图片描述

设置完毕
完整代码如下

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的基本建模功能设置一些三维场景(自行发挥想象,进行建模设计)
进行一些三维场景的建设
在这里插入图片描述

  1. 实现漫游功能,可以在场景中键盘控制前后左右移动,鼠标控制旋转,完成基本的场景漫游功能。(自行设计)
    在这里插入图片描述
    在这里插入图片描述

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

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. 使用射线,实现获取鼠标的点击功能。(自行设计)
    通过脚本控制射线,使得鼠标点击的时候实现功能
    在这里插入图片描述

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

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<Rigidbody>().velocity = Vector3.Normalize(hitInfo.point - transform.position) * 20;
            // 计算小球的动量
            //Vector3 ballMomentum = shell.GetComponent<Rigidbody>().velocity * shell.GetComponent<Rigidbody>().mass;
            // 给物体施加一个与小球相反方向的同等大小的力,抵消小球的反作用力
            //rb.AddForce(-ballMomentum, ForceMode.Impulse);
        }
            
    }
}
  1. 制作内部动画,配合鼠标点击,实现播放动画。(自行设计)
    在这里插入图片描述

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

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

    private void Start()
    {
        animator = GetComponent<Animator>();
    }

    private void Update()
    {
        // 如果鼠标左键点击
        if (Input.GetMouseButtonDown(0))
        {
            // 激活触发器"Play"
            //animator.SetTrigger("Play");
            // animator.Play("idle.pickup",0, 0f);
            animator.Play(Animator.StringToHash("pickup"));
        }
    }
}
  1. 设置触发器,当漫游相机进到入触发器中时,执行动画的播放。(自行设计)
    在这里插入图片描述

如图,在经过一个设置好的空物体时就会触发触发器,执行动画的播放
6. 添加背景音乐和鼠标点击的音效(自行设计)
在这里插入图片描述
在这里插入图片描述

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

public class newscript : MonoBehaviour
{
    // Start is called before the first frame update
    AudioSource ads;
    AudioClip ac;
    List<AudioClip> acs = new List<AudioClip>();
    int j = 0;
    void Start()
    {
        #region source
        //ads = GetComponent<AudioSource>();
        //ads.Play();//播放
        // ads.Pause();//暂停
        // ads.UnPause();//继续播放
        // ads.PlayOneShot();//播放一次
        // ads.volume;//音量
        // ads.playOnAwake;//唤醒时播放
        // ads.mute;//静音
        //ads.loop;//循环
        // ads.isPlaying;//是否播放中
        // ads.clip;//声音片段 
        #endregion
        //加载音频设置
        ac = Resources.Load<AudioClip>("Assets/resource/AudioClip/1.mp3") as AudioClip;
        ads = GetComponent<AudioSource>();
        for(int i = 0;i < 3; i++){
            ac = Resources.Load<AudioClip>("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按钮设计,要求可以返回主控界面。(自行设计)
    在这里插入图片描述
    在这里插入图片描述

在场景中点击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<CanvasGroup>();

        // 初始时隐藏按钮
        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自带的功能就可以打包生成出来了
在这里插入图片描述

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

以上。

文章来源:https://blog.csdn.net/m0_72471315/article/details/134860949
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。