- 📢博客主頁:https://blog.csdn.net/zhangay1998
- 📢歡迎點贊 👍 收藏 ?留言 📝 如有錯誤敬請指正!
- 📢本文由 呆呆敲代碼的小Y 原創,首發于 CSDN🙉
- 📢未來很長,值得我們全力奔赴更美好的生活?
目錄
- 📢前言
- 🍓Unity做一個電腦和手機都可以直接用的【點名神器】,可匯入Excel檔案直接使用
- 🍋第一步,打開Unity新建一個專案
- 🍊第二步,怎樣讀取Excel檔案中的資料并使用
- 🍇第三步,將學生名單匯入到List串列中 并隨機顯示某個名字
- 🍈第四步,打開檔案夾并選擇Excel檔案
- 🍉最后一步,打包成PC端可用的exe檔案
- 🎁資源下載
- 💬總結
- 🚀往期優質文章分享

📢前言
好久沒有做一些小案例玩了,今天突發奇想要做一個 點名神器 玩一下!
其實點名這個功能做出來很簡單,不過就是在一個名單庫里面隨機一個數值顯示出來就好啦!
下面一起看一下這個小案例是怎樣做出來的吧!
🍓Unity做一個電腦和手機都可以直接用的【點名神器】,可匯入Excel檔案直接使用
大家應該都Unity可以打包成電腦直接運行的exe檔案,也可以打包成手機直接運行的APP檔案
所以我就想著做一個功能稍微多一點點的點名神器吧
那就是加入一個可選擇的Excel檔案,我們可以事先在Excel檔案中加入所有需要被點名的名單即可
下面我就一步一步來做給大家看一下吧!博主使用的Unity版本為:2020.3.8 f1c1
🍋第一步,打開Unity新建一個專案
打開UnityHub新建一個專案,新版本的Unity都需要使用UnityHub來運行程式,還沒下載UnityHub的推薦下載哦~
設定一下專案名稱和路徑,然后點擊創建即可!

然后等待新創建的Unity加載完畢即可~
🍊第二步,怎樣讀取Excel檔案中的資料并使用
-
做這個點名器的思路很簡單,就是從一個
名字庫里面隨機讀取一個名字顯示到UI上即可! -
這個 名字庫 的實作方法有很多種,可以直接創建一個
List串列,將所有的名字資料錄入,然后讀取即可~ -
我們可以實作把學生名單放到
Json或者Excel等等方式存取,然后在腳本中直接錄入List就可以用了 -
但是我覺得Excel在實際情況中可能用起來更方便,畢竟
使用電腦的人都會用Excel,但是卻不一定會使用Json等等方式! -
說了一堆廢話,只是表達一下使用Excel檔案的意義~ 下面一起來看看怎樣讀取Excel檔案吧!
首先,在unity中想讀取Excel檔案要先匯入庫檔案 Excel.dll 和 ICSharpCode.SharpZipLib 庫檔案
官方鏈接: http://exceldatareader.codeplex.com/
Excel檔案示例:

匯入庫檔案 Excel.dll 和 ICSharpCode.SharpZipLib 之后,在Unity中創建一個腳本StudentDemo
示例代碼如下:
using System.IO;
using Excel;
using System.Data;
using UnityEngine;
public class StudentDemo : MonoBehaviour
{
void Start()
{
FindXLSX();
}
void FindXLSX()
{
FileStream stream = File.Open(Application.dataPath, FileMode.Open, FileAccess.Read);
IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
DataSet result = excelReader.AsDataSet();
int columns = result.Tables[0].Columns.Count;
int rows = result.Tables[0].Rows.Count;
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < columns; j++)
{
string nvalue = result.Tables[0].Rows[i][j].ToString();
Debug.Log(nvalue);
}
}
}
}
該腳本的作用就是通過 File.Open 讀取指定檔案路徑下的 Excel檔案
然后再通過庫檔案中的方法,將Excel中的資料保存成Unity可使用的string字串形式,然后通過遍歷就可以拿到資料使用了
比如上述腳本執行的結果為:

然后接下來就可以創建一個串列來呼叫這個名單啦!
🍇第三步,將學生名單匯入到List串列中 并隨機顯示某個名字
- 在上一步中我們通過
讀取Excel檔案拿到了學生姓名的資料 - 那接下就是將這個名單合理利用,達到我們想要的一個效果啦!
我們先在場景中搭建一個簡單的UI,待會用來顯示點名的功能
先在場景添加兩個Button按鈕 和 三個Text文本
Button分別用來隨機名單 和 開始點名,Text文本用來顯示標題、名單串列 和 點名
然后把相機的渲染模式設定為純色模式,簡單的選個顏色

簡略效果如下

然后需要繼續在腳本中添加代碼,完整代碼如下:
using System.IO;
using Excel;
using System.Data;
using UnityEngine;
using UnityEngine.UI;
using System.Collections.Generic;
public class StudentDemo : MonoBehaviour
{
public Button FindXLSXBtn;
public Button startNameBtn;
public Text NameText;
public Text NameSum;
private List<string> StudentNameList;
private int aName;
private bool ISrandom = true;
private bool IsOK = true;
private void Start()
{
StudentNameList = new List<string>();
FindXLSXBtn.onClick.AddListener(FindXLSX);
startNameBtn.onClick.AddListener(startName);
StudentNameList.Add("再來一次!");
}
private void Update()
{
if (!ISrandom)
{
NameText.text = StudentNameList[Random.Range(0, StudentNameList.Count)];
}
}
void FindXLSX()
{
ISrandom = false;
if (IsOK)
{
IsOK = false;
FileStream stream = File.Open(Application.dataPath + "/StudentName.xlsx", FileMode.Open, FileAccess.Read);
IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
DataSet result = excelReader.AsDataSet();
int columns = result.Tables[0].Columns.Count;
int rows = result.Tables[0].Rows.Count;
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < columns; j++)
{
string nvalue = result.Tables[0].Rows[i][j].ToString();
StudentNameList.Add(nvalue);
// Debug.Log(nvalue);
NameSum.text += nvalue + "\n";
}
}
}
}
/// <summary>
/// 點名開始
/// </summary>
void startName()
{
ISrandom = !ISrandom;
aName = Random.Range(0, StudentNameList.Count);
NameText.text = StudentNameList[aName];
}
}
代碼決議:
在代碼中添加了對應的Button的點擊事件,創建了一個List串列用來存盤從Excel檔案中讀取的名單,在遍歷的時候將名單添加進List中
然后讓Text文本通過 Random.Range方法 制造一個亂數,最小值為0,最大值為List串列的最大索引
然后在Update中通過Random.Range隨機顯示名單
然后再寫一個點名的方法,隨機讀取一個串列中的數值顯示到我們的點名名單中即可
其中通過兩個bool值 ISrandom 和 IsOK 用于控制不用二次讀取名單 和Update中的隨機顯示
掛載腳本后的實際效果如下:

OK,那我們現在只要能拿到Excel檔案就可以正常的讀取學生名單并隨機讀取了!
但是現在還有個問題,我們的Excel檔案路徑是寫死的,現在讀取的Excel檔案是我在工程中實作放好的!
那這樣的話就只能用我自己的Excel中的學生名單了,并沒有什么卵用嘛~
那下一步就是添加一個可以自己讀取Excel的方法,一起往下看吧!
🍈第四步,打開檔案夾并選擇Excel檔案
我們現在讀取Excel檔案并隨機顯示名字的方法已經實作了,還差最后一步
那就是怎樣讓Unity打開檔案夾并選擇Excel檔案!
這個功能我并沒有找到一個 官方的API 可直呼叫的方法,所以就使用了一個其他的打開檔案夾的方案
新建一個腳本OpenFileName,代碼如下:
using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public class OpenFileName
{
public int structSize = 0;
public IntPtr dlgOwner = IntPtr.Zero;
public IntPtr instance = IntPtr.Zero;
public String filter = null;
public String customFilter = null;
public int maxCustFilter = 0;
public int filterIndex = 0;
public String file = null;
public int maxFile = 0;
public String fileTitle = null;
public int maxFileTitle = 0;
public String initialDir = null;
public String title = null;
public int flags = 0;
public short fileOffset = 0;
public short fileExtension = 0;
public String defExt = null;
public IntPtr custData = IntPtr.Zero;
public IntPtr hook = IntPtr.Zero;
public String templateName = null;
public IntPtr reservedPtr = IntPtr.Zero;
public int reservedInt = 0;
public int flagsEx = 0;
}
public class WindowDll
{
[DllImport("Comdlg32.dll", SetLastError = true, ThrowOnUnmappableChar = true, CharSet = CharSet.Auto)]
public static extern bool GetOpenFileName([In, Out] OpenFileName ofn);
public static bool GetOpenFileName1([In, Out] OpenFileName ofn)
{
return GetOpenFileName(ofn);
}
}
只需要知道這個腳本是用來呼叫系統介面的就好啦~ 不需要理解太多(大神請便)
然后繼續在我們的StudentDemo 腳本中添加代碼,添加一個新方法,代碼如下:
public void OpenFileWin()
{
ofn.structSize = Marshal.SizeOf(ofn);
ofn.filter = "All Files\0*.*\0\0";
ofn.file = new string(new char[256]);
ofn.maxFile = ofn.file.Length;
ofn.fileTitle = new string(new char[64]);
ofn.maxFileTitle = ofn.fileTitle.Length;
string path = Application.dataPath;
path = path.Replace('/', '\\');
//默認路徑
ofn.initialDir = path;
//ofn.initialDir = "D:\\MyProject\\UnityOpenCV\\Assets";
ofn.title = "Open Project";
ofn.defExt = "xlsx";//顯示檔案的型別
//注意 一下專案不一定要全選 但是0x00000008項不要缺少
ofn.flags = 0x00080000 | 0x00001000 | 0x00000800 | 0x00000200 | 0x00000008;//OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST| OFN_ALLOWMULTISELECT|OFN_NOCHANGEDIR
if (WindowDll.GetOpenFileName(ofn))
{
Debug.Log("Selected file with full path: {0}" + ofn.file);
}
}
這個方法就是用來啟動系統視窗的,放在Button點擊事件上直接呼叫該方法就可以呼叫打開檔案夾的功能了!
然后我們在腳本中新加一個Button,加上點擊事件執行上面我們剛添加的方法即可!
該腳本完整代碼如下:
using System.IO;
using Excel;
using System.Data;
using UnityEngine;
using UnityEngine.UI;
using System.Collections.Generic;
using System.Runtime.InteropServices;
public class StudentDemo : MonoBehaviour
{
public Button OpenFileWinBtn;
public Button FindXLSXBtn;
public Button startNameBtn;
public Text NameText;
public Text NameSum;
private List<string> StudentNameList;
private int aName;
private bool ISrandom = true;
private bool IsOK = true;
private OpenFileName ofn;
private void Start()
{
ofn = new OpenFileName();
StudentNameList = new List<string>();
OpenFileWinBtn.onClick.AddListener(OpenFileWin);
FindXLSXBtn.onClick.AddListener(FindXLSX);
startNameBtn.onClick.AddListener(startName);
StudentNameList.Add("再來一次!");
}
private void Update()
{
if (!ISrandom)
{
NameText.text = StudentNameList[Random.Range(0, StudentNameList.Count)];
}
}
void FindXLSX()
{
ISrandom = false;
if (IsOK)
{
IsOK = false;
FileStream stream = File.Open(ofn.file, FileMode.Open, FileAccess.Read);
IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
DataSet result = excelReader.AsDataSet();
int columns = result.Tables[0].Columns.Count;
int rows = result.Tables[0].Rows.Count;
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < columns; j++)
{
string nvalue = result.Tables[0].Rows[i][j].ToString();
StudentNameList.Add(nvalue);
// Debug.Log(nvalue);
NameSum.text += nvalue + "\n";
}
}
}
}
/// <summary>
/// 點名開始
/// </summary>
void startName()
{
ISrandom = !ISrandom;
aName = Random.Range(0, StudentNameList.Count);
NameText.text = StudentNameList[aName];
}
public void OpenFileWin()
{
ofn.structSize = Marshal.SizeOf(ofn);
ofn.filter = "All Files\0*.*\0\0";
ofn.file = new string(new char[256]);
ofn.maxFile = ofn.file.Length;
ofn.fileTitle = new string(new char[64]);
ofn.maxFileTitle = ofn.fileTitle.Length;
string path = Application.dataPath;
path = path.Replace('/', '\\');
//默認路徑
ofn.initialDir = path;
//ofn.initialDir = "D:\\MyProject\\UnityOpenCV\\Assets";
ofn.title = "Open Project";
ofn.defExt = "xlsx";//顯示檔案的型別
//注意 一下專案不一定要全選 但是0x00000008項不要缺少
ofn.flags = 0x00080000 | 0x00001000 | 0x00000800 | 0x00000200 | 0x00000008;//OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST| OFN_ALLOWMULTISELECT|OFN_NOCHANGEDIR
if (WindowDll.GetOpenFileName(ofn))
{
Debug.Log("Selected file with full path: {0}" + ofn.file);
}
}
}
這個案例其實只用到了兩個腳本,一個是OpenFileName,另一個是StudentDemo,直接掛載到場景中就可以啦!
效果演示如下:

🍉最后一步,打包成PC端可用的exe檔案
一個基本的點名小案例我們就已經差不多做完啦,還差最后一步,打包成可直接用的exe檔案
這一步很簡單,一般都會做啦,
點擊選單鍵:File -> Build Setting ,然后將場景添加到Build之后,點擊Player Setting,在面板上改一下Produce Name和 Company Name
老版本的Unity還需要自己去下面的屬性面板自己改一下 PakecageName ,新版本就不需要啦!
最后點擊Build,然后選擇一個檔案夾保存就好啦!
打包好的程式如下:

然后我們點擊這個exe檔案就可以運行了,運行效果如下:

提示:我在打包完成之后發現Excel檔案并不能被讀取資料,這算是一個嚴重的問題,導致我們的名單庫不能正常使用從而導致無法隨機選取一個名單,我在網上查了下發現是因為打包之后的exe檔案是不能呼叫Excel的DLL檔案,所以我這里是匯入了其他的dll檔案才使得打包好的exe檔案也可以正常使用!下面的原始碼工程中都有,可自行體驗!
🎁資源下載
本文中提到的excel相關的DLL檔案、案例原始碼和打包好的exe檔案 全部都放到這個資源里啦
有需求的小伙伴可以下載自己體驗一下哦!尤其是需要用到點名的老師們
可以打開該exe檔案然后上傳學生名單的Excel檔案就可以直接點名了哦!!
點擊資源下載
💬總結
- 本文使用
Unity詳細的介紹 了怎樣制作一款【點名神器】的教程,還可以匯入Excel檔案直接使用哦! - 一不小心就寫了一萬字,從一個
新手角度寫了這篇教程 - 喜歡的小伙伴可以自行下載資源體驗哦!
- 因為時間有限,沒有搭建一個好看的UI,有時間會出一個
2.0版本,功能更完善更好看的哦! - 覺得文章有用記得點一下
三連哦!關注我帶你學習更多的Unity知識!

🚀往期優質文章分享
- ??Unity零基礎到入門 | 游戲引擎 Unity 從0到1的 系統學習 路線【全面總結-建議收藏】!
- 🧡花一天時間做一個高質量飛機大戰游戲,過萬字Unity完整教程!漂亮學妹看了直呼666!
- 💛重回童年的經典系列??|【炸彈人小游戲】制作程序+決議 | 收藏起來跟曾經的小伙伴一起夢回童年!
- 💚通宵一晚做出來的一款類似CS的第一人稱射擊游戲Demo!原來做游戲也不是很難
- 🤍爆肝整整一個周末寫一款類似 皇室戰爭 的 即時戰斗類 游戲Demo!兩萬多字游戲制作程序+決議!
- 💙一款類似“恐龍快打”的 橫版街機格斗游戲 該如何制作?| 一起來學習 順便送原始碼【碼文不易,建議收藏學習】
- 💜重回童年的經典系列??|【貪吃蛇小游戲】近兩萬字完整制作程序+決議+原始碼 【建議收藏學習】
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/332131.html
標籤:其他
上一篇:基于比較的七種常見排序演算法
