记录:Unity脚本的编写10.0

目录

前言

之前内容的集大成者,一个游戏小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.连接数据库,实现增删改查等数据库对用户的操作

c# 复制代码
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在内的多种组件

  1. 实现点击Play按钮转换场景,点击Exit退出游戏的功能

首先run一下项目

输入用户名密码

点击登录并play按钮

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

发现退出了play模式

  1. 实现主界面添加音量滑动杆、静音等功能,添加背景音乐和音效音乐

偷偷修改了一下布局

在主页面就可以发现有一个滑动杆和一个toggle,这就是控制音量和可以静音的按钮

添加音乐的组件和音乐来进行控制

  1. 为UI界面单独设置一个场景,并设置编号为0

设置完毕

完整代码如下

c# 复制代码
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. 实现漫游功能,可以在场景中键盘控制前后左右移动,鼠标控制旋转,完成基本的场景漫游功能。(自行设计)

实现了上述的漫游功能

代码:

c# 复制代码
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. 使用射线,实现获取鼠标的点击功能。(自行设计)
    通过脚本控制射线,使得鼠标点击的时候实现功能

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

代码:

c# 复制代码
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. 制作内部动画,配合鼠标点击,实现播放动画。(自行设计)

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

代码:

c# 复制代码
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. 设置触发器,当漫游相机进到入触发器中时,执行动画的播放。(自行设计)

如图,在经过一个设置好的空物体时就会触发触发器,执行动画的播放

  1. 添加背景音乐和鼠标点击的音效(自行设计)

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

代码控制:背景音乐

c# 复制代码
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就会弹出返回主控界面的按钮,点击按钮就会返回之前的页面

代码:

c# 复制代码
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运行

以上。

相关推荐
林鸿群10 分钟前
C#子线程更新主线程UI及委托回调使用示例
开发语言·c#
o0向阳而生0o13 分钟前
63、.NET 异常处理
c#·.net·异常处理
Channing Lewis1 小时前
sql server如何创建表导入excel的数据
数据库·oracle·excel
秃头摸鱼侠1 小时前
MySQL安装与配置
数据库·mysql·adb
UGOTNOSHOT1 小时前
每日八股文6.3
数据库·sql
行云流水行云流水1 小时前
数据库、数据仓库、数据中台、数据湖相关概念
数据库·数据仓库
John Song2 小时前
Redis 集群批量删除key报错 CROSSSLOT Keys in request don‘t hash to the same slot
数据库·redis·哈希算法
IvanCodes2 小时前
七、Sqoop Job:简化与自动化数据迁移任务及免密执行
大数据·数据库·hadoop·sqoop
tonexuan2 小时前
MySQL 8.0 绿色版安装和配置过程
数据库·mysql
JohnYan2 小时前
工作笔记- 记一次MySQL数据移植表空间错误排除
数据库·后端·mysql