目录
- 前言
- 实验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界面
一个设计好的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()
{
}
}
以上是关于数据库连接及增删改查的代码,下面是表现
增加成功后
删除成功后
查询成功
- UI界面中包括canvas、Image、RawImage、Button等多种UI元素
如图所示,ui界面中包含有包括canvas,image,rawimage,button在内的多种组件
5. 实现点击Play按钮转换场景,点击Exit退出游戏的功能
首先run一下项目
输入用户名密码
点击登录并play按钮
发现切换到了另一个场景中,点击exit
发现退出了play模式
6. 实现主界面添加音量滑动杆、静音等功能,添加背景音乐和音效音乐
偷偷修改了一下布局
在主页面就可以发现有一个滑动杆和一个toggle,这就是控制音量和可以静音的按钮
添加音乐的组件和音乐来进行控制
- 为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的基本建模功能设置一些三维场景(自行发挥想象,进行建模设计)
进行一些三维场景的建设
- 实现漫游功能,可以在场景中键盘控制前后左右移动,鼠标控制旋转,完成基本的场景漫游功能。(自行设计)
实现了上述的漫游功能
代码:
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);
}
- 使用射线,实现获取鼠标的点击功能。(自行设计)
通过脚本控制射线,使得鼠标点击的时候实现功能
如图,可以对点击的方向发射小球
代码:
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);
}
}
}
- 制作内部动画,配合鼠标点击,实现播放动画。(自行设计)
如图,当在点击时,小人就会播放一段动画
代码:
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"));
}
}
}
- 设置触发器,当漫游相机进到入触发器中时,执行动画的播放。(自行设计)
如图,在经过一个设置好的空物体时就会触发触发器,执行动画的播放
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();
}
}
- 添加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");
}
}
- 打包,生成可执行文件,要求可执行文件脱离Unity环境后,能够自行运行。
使用unity自带的功能就可以打包生成出来了
经过尝试,可以脱离unity运行
以上。