记录: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运行

以上。

相关推荐
日里安1 小时前
8. 基于 Redis 实现限流
数据库·redis·缓存
机器人天才一号1 小时前
C#从入门到放弃
开发语言·c#
吾与谁归in1 小时前
【C#设计模式(10)——装饰器模式(Decorator Pattern)】
设计模式·c#·装饰器模式
EasyCVR1 小时前
ISUP协议视频平台EasyCVR视频设备轨迹回放平台智慧农业视频远程监控管理方案
服务器·网络·数据库·音视频
Elastic 中国社区官方博客1 小时前
使用真实 Elasticsearch 进行更快的集成测试
大数据·运维·服务器·数据库·elasticsearch·搜索引擎·集成测试
明月与玄武2 小时前
关于性能测试:数据库的 SQL 性能优化实战
数据库·sql·性能优化
PGCCC3 小时前
【PGCCC】Postgresql 存储设计
数据库·postgresql
PcVue China5 小时前
PcVue + SQL Grid : 释放数据的无限潜力
大数据·服务器·数据库·sql·科技·安全·oracle
魔道不误砍柴功7 小时前
简单叙述 Spring Boot 启动过程
java·数据库·spring boot
锐策7 小时前
〔 MySQL 〕数据库基础
数据库·mysql