配色: 字号:
软件工程_基于Unity3d的多人合作游戏开发
2023-11-11 | 阅:  转:  |  分享 
  

17.
18. tionID> 方便面
19. 10 onTargetAmount>
20. 酱油
21. TargetAmount>1

22.
23. 报酬 ewardID>
24. 15
25.
26.
首先
新建任务脚本 Task.cs,用 Task()函数将 taskID 所指向的任务初始化:
利用 taskID 读取 XML 中的元
素并装入 XElement 中,创建 IEnumerable 可枚举
元素和 Ienumerator 枚举器迭代添加任务要求和任务
报酬。
1. public class Task :MonoBehaviour {
2. public TaskItem task
Item;// 对应的UI 面板
3. public string taskID;// 任务ID
4. public string
taskName;// 任务名字
5. public string caption;// 任务描述
6. public List
taskConditions = new List();
7. pu
blic List taskRewards = new List();
8. //
根据taskID 读取xml, 实现初始化
9. public Task( string taskID)
10. {
11
. this.taskID = taskID;
12. XElement xe = TaskManager.Inst
ance.rootElement.Element(taskID);
13. taskName = xe.Elemen
t("taskName").Value;
14. caption = xe.Element("caption").V
alue;
15.
16. IEnumerable a = xe.Elements("condi
tionID");
17. IEnumerator b = xe.Elements("condi
tionTargetAmount").GetEnumer
ator();
18. IEnumerable ent> c = xe.Elements("rewardID");
19. IEnumerator > d = xe.Elements("rewardAmount").GetEnumerator();
20.
21. foreac
h (var s in a)
22. {
13
23. b.MoveNext();
24.
TaskCondition tc = new TaskCondition(s.Value, 0, int.Pa
rse(b.Current
.Value));
25. taskConditions.Add(tc);
26
. }
27.
28. foreach (var s in c)
29. {
30.
d.MoveNext();
31. TaskReward tr = new TaskReward(s.
Value, int.Parse(d.Current.Value));
32. taskRewards.Ad
d(tr);
33. }
34. }
接下来需要更新任务进度,并判断任务条件是否满足。编写 Check ()函
数以实
现:
上文说到,玩家按 E 键即可获取商品,此时会调用 check()函数。
将玩家获取到的商品名称 e.id 传入函数中
, 用 for 循环检测目前的任务中是否
有目标商品,若匹配,则将目标商品进度 +1 ,并更新任务进度于 UI 面板中。当玩家

成了某一任务的目标进度,则调用 FinishTask ()提示 TaskManger.cs 玩家已经
完成某任务。
1. publ
ic void Check(TaskEventArgs e)
2. {
3. TaskCondition tc;
4. fo
r ( int i = 0; i < taskConditions.Count; i++)
5. {
6. t
c = taskConditions[i];
7. if (tc.id == e.id)
8. {
9.
tc.nowAmount += e.amount;
10. if(tc.nowAmount < 0) tc.nowAm
ount = 0;
11. if (tc.nowAmount >= tc.targetAmount)
12.
tc.isFinish = true;
13. else
14. tc.isFinish
= false;
15.
16. taskItem.Modify(e.id,tc.nowAmount);
1
7. }
18. }
19. for ( int i = 0; i < taskConditions.Coun
t; i++)
20. {
21. if (!taskConditions[i].isFinish)
22.
{
23. taskItem.Finish( false);
24. return;
25.
}
26. }
27. taskItem.Finish( true);
14
28. e.taskID = ta
skID;
29. TaskManager.Instance.FinishTask(e);
30. }
接下来新建 Task
Manager.cs 脚本,用于接收 Task.cs 的消息并分发到各个函数
中。
TaskManager 类 继 承 了 Mon
oSingletion 类 , MonoSingletion 类 是 继 承 了
MonoBehaviour 的单例类。这样做保证
了 TaskManager 类仅有一个实例,并在游戏
场景中提供一个访问它的全局访问点。
总结游戏中任务系统的设计思路:
1. 游
戏开始时在初始化脚本 GameManager.cs 中调用 TaskManager 类中的
GetTask()函数初始化所有任务。

2.当玩家获得了目标商品, Task 类更新任务进度并判断是否完成任务。
3.若某个任务达成, Task 类将信息传递到 Tas
kManger 类, 再由 TaskManager
进行消息分发。
1. public class TaskManager : M
onoSingletion {
2.
3. public Dictionary< string, Tas
k> dictionary = new Dictionary< string,Task>();
4. //id,task
5. p
ublic XElement rootElement;
6. public event EventHandler tArgs> getEvent;
7. // 接受任务时, 更新任务到任务面板等操作
8. public event EventH
andler finishEvent;
9. // 完成任务时, 提示完成任务等操作
10. pub
lic event EventHandler rewardEvent;
11. // 得到奖励时,
显示获取的物品等操作
12. public event EventHandler cancelEve
nt;
13. // 取消任务时, 显示提示信息等操作
14.
15. void Start()
16. {
17.
MesManager.Instance.checkEvent += CheckTask;
18. rootE
lement = XElement.Load(Application.dataPath + "/TestTask/Task.xml
")
;
19. // 得到Task 文件
20. }
21.
22. public void GetTask( strin
g taskID)
23. {
24. if (!dictionary.ContainsKey(taskID))
25.
{
26. Task t = new Task(taskID);
27.
dictionary.Add(taskID, t);
28.
29. TaskEventArgs e = n
ew TaskEventArgs();
30. e.taskID = taskID;
31.
getEvent( this, e);
32. }
33. }
34.
35. public void
CheckTask(System.Object sender, TaskEventArgs e)
36. {
37. fo
reach (KeyValuePair< string, Task> kv in dictionary)
38. {

15
39. kv.Value.Check(e);
40. }
41. }
42.
4
3. public void GetReward(TaskEventArgs e)
44. {
45. if (dictio
nary.ContainsKey(e.taskID))
46. {
47. Task t =
dictionary[e.taskID];
48. for ( int i = 0; i < t.taskRewards.Coun
t; i++)
49. {
50. TaskEventArgs a = new
TaskEventArgs();
51. a.id = t.taskRewards[i].id;

52. a.amount = t.taskRewards[i].amount;
53.
a.taskID = e.taskID;
54. rewardEvent( thi
s,a);
55. }
56. }
57. dictionary.Remove(
e.taskID);
3.5 添加游戏背景音乐
预先准备好游戏背景音乐的音频文件并导入项目中,在 hierarchy 面板右键→

Create Empty 新建空物体,命名为 GameManager ,用于添加游戏中的各种控制脚本。
然后新建 BgmContr
oller.cs 脚本,通过 UI 中的 Slider 组件控制音量大小。
1. public AudioClip music;

2. private AudioSource back;
3. public Slider slider;
4. void Sta
rt () {
5. back = this.GetComponent();
6.
back.loop = true; // 设置循环播放
7. back.volume = 0.5f;// 设
置音量最大,区间在0-1 之间
8. back.clip = music;
9. back.Play(
); // 播放背景音乐
10. }
11.
12. void Update()
13. {
14. b
ack.volume = slider.value;
15. }
16
第四章 游戏 UI 界面设计
4.1 菜单界面
新建
场景 1 菜单界面。菜单界面包括主菜单图片以及开始游戏,退出游戏按钮点
击按钮, UI 界面均使用 Unity3D 官方插件 UG
UI 制作。
4.1.1 菜单界面功能
开始游戏按钮:当鼠标点击该按钮,即跳转到场景 2 游戏主场景。
退出游戏按钮:点击按钮即可
关闭游戏程序。
背景图片:装饰菜单界面。
图 4-1 游戏开始菜单界面
17
4.1.2 菜单界面制作
在 project 面板中
点击右键→new Scene 新建场景,命名为 StartGame。双击打
开新建的场景,在 hierarchy 面板中右键→UI
→Canvas 新建画布,用于装载 UI 组
件。
在Canvas下新建两个 Button组件,命名为ConnectButton和
ExitButton,功能分
别为开始游戏和结束游戏,再新建一个 Image 组件,用于显示背景图片。
将游戏菜单的背景图片导入项
目中,在Project面板找到背景图,并在Inspector
面板将其Texture Type 选项更改为游戏中支持的 Sprit
e图,即可在 UI中使用。
由于场景并不复杂,故载入场景时用 Application.LoadLevel()函数载入场景。
最终效
果如图4-3所示。
1. public override void OnJoinedRoom()
2. {
3.
Application.LoadLevel("_Demo");
4. }
5.
6. public void ExitGame
()
7. {
8. Application.Quit();
9. }
图 4-3 游戏主菜单界面
18
4.
2 游戏界面 UI 制作
游戏模式采用了倒计时计分制度, 即玩家在规定时间内达到一定分数即可通关。
故在画面左上角设置计分和计时
UI, 并在画面右下角添加显示当前任务的 UI。 最后,
考虑玩家在游玩过程中需要暂停或者退出游戏。在右上角添加暂停按钮,在画面中

间设置暂停菜单, 添加 LeaveRoom 和 Resume 两个按钮用于退出游戏和返回游戏。 因
暂停菜单平时无需显示在画面上
,在 Inspector 面板中将选项框取消勾选,即可在
场景中默认为隐藏状态。游戏界面 UI 总体设计如图 4-4 所示。

4-4 游戏场景的 UI 设计
19
接下 来制 作 UI 的功能部 分 。 在 hierarchy 面板中新建 空物体,命名 为

GameManager ,新建 GameManager.cs 脚本,用于管理游戏中的全局变量和菜单 UI。
编写 GamePau
se ()函数,并在暂停按钮的 Inspector 面板中添加 OnClick ()点击
事件,当鼠标点击按钮时,暂停游戏,显示暂
停菜单并取消显示暂停按钮。同理,
编写 GameResume ()函数并绑定点击事件,重新开始游戏并隐藏暂停菜单栏,重新
显示暂停
按钮。左上角的计时器则用协程进行计时,每过一秒钟更新一次 UI 上的
时间,若游戏时间归零,则游戏结束。
1. public vo
id GamePause()
2. {
3. Time.timeScale = 0;
4. pause
Menu.SetActive( true);
5. pauseButton.SetActive( false);
6.
}
7.
8. public void GameResume()
9. {
10. Time.timeSca
le = 1f;
11. pauseMenu.SetActive( false);
12. pauseBu
tton.SetActive( true);
13. }
14.
15. public IEnumerator startCo
untDown() // 协程倒计时
16. {
17. while (sumTime >= 1)
18. {
1
9. sumTime--;
20. TimeLabel.text = "Time:" +
sumTime;
21.
22. if (sumTime == 0)
23. {
24. // 当游戏时间用完
则游戏结束
25. GameOver();
26. }
27. // 每隔一秒调用
一次
28. yield return new WaitForSeconds(1);
29. }

30. }
此外, GameManager 脚本还起到了初始化游戏的作用。 Start ()函数中,用
Random.Rang
e ()函数在 Z 轴的-1.87 到-12.87 区间随机生成玩家,并开始游戏倒
计时协程。 GameStart ()函数将所有
的任务初始化。
1. void Start()
2. {
3. // 随机位置生成玩家
4. PhotonNetwork.I
nstantiate( this.playerPrefab.name,
5. new Vector3(46 f,0.2f, Ran
dom.Range(-1.87f, -12.87f)), Quaternion.identity);
6. StartCor
outine(startCountDown());
7. }
8.
9. void FixedUpdate()
10. {
20

11. //初始化任务
12. GameStart();
13.
14. }
15.
16. public void Gam
eStart()
17. {
18. if (!condition)//只导入一次任务
19. {
20. for ( in
t i = 1; i < 11; i++)
21. {
22. //导入所有任务
23. Ta
skManager.Instance.GetTask("Task" + i);
24. }
25. c
ondition = true;
26. }
27. }
为了清楚的标识游戏中的货架名称,在每个货架上添加新的空物体作为子物
体,
并命名为 nameItem。点击 nameItem 并在 Inspector 面板添加 TextMesh 组件,在
Text
Mesh组件中的 text中输入每个货架的名称。如图 4-5所示。
图4-5 用 TextMesh组件标示货架名称
第五章 将游戏
更改为多人联网游戏
5.1 设置 Photon 引擎
5.1.1 注册并配置 Photo 服务器
首先访问Photon 引擎的官网
www.photonengine.com 注册账号, Photon支
持申请免费且最大连接数为 20 人的免费服务器,注册账号后登
录并新建一个
21
Application。Photon Type选择与Unity3D 相匹配的Photon PUN,然后填写项

目名称并提交即可。刷新等待系统分配到服务器后,Photon服务器注册完成。
5-1 Photon服务器项目注册
下一步是登陆 Ph
oton 引擎国内代理商官网,进行中国区服务器注册。这一
步有助于降低国内联机游玩的延迟。
注册国内 Photon 服务器需要上一
步所注册的国外服务器项目的 appID 和账
号。填写相应的表单后,等待通过即可激活中国区 Photon服务器。
5.1.2 在
Unity 上配置 PUN
下一步是在 Unity3D 的 Asset Store 中下载并导入免费服务器所使用的
PUN2-FR
EE插件。如图 5-2所示。
5-2 下载并导入PUN-FREE插件
22
导 入 插 件 后 , 根 据 官 方 教 程 , 在
Project 面 板 → Photon →
PhotonUnityNetWorking → Resources 中 找 到 P
hotonServerSettings , 并 在
Inspector 面板中填入之前注册的服务器所分配的 appID,并修改 F
ixed Region
项 内 的 值 为 cn , 如 图 5-3 所 示 。 然 后 在 Project 面 板 搜 索
Lo
adBalancingClient.cs 脚本, 打开并找到 NameServerHost 一项, 将它的原值
更改为“ ns.p
hotonengine.cn ” ,更改完毕后项目就可以顺利连接上中国区的
Photon 服务器。
5-3 配置 PhotonSe
rverSettings
5.2 游戏主菜单加入联网功能
回到 StartGame 场景,新建空物体并命名为 NetworkMan
ager,然后新建同名脚
本 NetworkManager.cs 用于管理主菜单界面的网络连接功能。
首先导入 Photon 联网
所需要的两个命名空间 Photon.PUN 和 Photon.Realtime ,
然后将脚本所继承的类为 MonoBehavio
urPunCallBacks 。
编写 Connect()函数,若玩家已连接到服务器,则将玩家分配到随机的房间。
如果未连接 Ph
otonCloud ,则取消离线模式并尝试连接。接着编写连接回调函数
OnConnectedToMaster () 和 OnDis
connected () , 在玩家成功连接后加入游戏房间,
连接失败时返回错误信息。
23
然后重写进入房间失败和进入房间成功的
函数。 若进入房间成功, 则在控制台输
出相应信息并跳转到游戏场景;若进入房间失败,则新建一个最大人数为 4 人的新
房间。
1.
// 导入photon 所需的命名空间
2. using Photon.Pun;
3. using Photon.Realtim
e;
4.
5. public class NetworkManager : MonoBehaviourPunCallbacks
// 改为PunCallbacks
6. {
7. //--------------------- 连接-------------
----------------
8. public void Connect()
9. {
10. if (PhotonN
etwork.IsConnected)
11. {
12.
13. PhotonNetwork
.JoinRandomRoom();
14. }
15. else
16. {
17.
PhotonNetwork.OfflineMode = false;
18.
19. PhotonN
etwork.ConnectUsingSettings();
20. }
21. }
22. //------
------------ 连接回调函数--------------------------
23. public override
void OnConnectedToMaster()
24. {
25. base.OnConnectedToMaster
();
26. Debug.Log(" 连接成功!");
27. // 加入随机房间
28. Phot
onNetwork.JoinRandomRoom();
29. }
30.
31. public override void
OnDisconnected(DisconnectCause cause)
32. {
33. base.OnDiscon
nected(cause);
34. Debug.Log(" 连接断开!");
35. }
36.
37. /
/----------------- 进入房间回调函数------------------------
38. public ov
erride void OnJoinRandomFailed( short returnCode, string message)

39. {
40. base.OnJoinRandomFailed(returnCode, message);
41.
Debug.Log(" 加入房间失败!");
42.
43. Debug.Log(" 开始建立新房间")
;
44.
45. PhotonNetwork.CreateRoom( null, new RoomOptions
{ MaxPlayers = 4});
46. }
47.
48. public override void OnJoine
dRoom()
49. {
50. base.OnJoinedRoom();
51. Debug.Log("
加入房间成功!");
52.
53. PhotonNetwork.LoadLevel("_Demo");
54.
}
24
5.3 同步游戏玩家的数据
5.3.1 同步人物的运动与旋转
在 Project 面板找到玩家的预制体,然后在 In
spector 面板中新增 PhotonView
组件和 PhotonTransformView 组件。在 PhotonView
组件的 Observed Comonents 中
点击“+”号新增同步列表,并将预制体的Transform 组件拖动到列表中。然后
勾选
PhotonTransformView 中的 Position 和 Rotation 选项。即可对人物的运动进行同
步,如图
5-4所示。
图5-4 新增相应组件使其同步
5.3.2 同步游戏中的其他数据
游戏中拥有任务系统,但每个玩家的人物都不应该是独立
的。故我们应该将游
戏中的任务进度也一并同步。在Photon服务器中同步数据有两种方式:使用Photon
PUN RPC和使用Ra
iseEvent 发送事件和接受事件。前者较为方便快捷,故我们使用
PhotonRPC来同步所需的函数,即可达到同步任务进度的效果

25
使用PUN RPC进行同步,首先需要在对象上添加 PhotonView组件和需要同步的
脚本。然后在需要同步的函数前面加
上[PunRPC]标签。
用玩家点击暂停按钮的函数 GamePause()举个例子,GamePause()函数写在
GameMan
ager 脚本中,而 GameManager 脚本挂载在 GameManager 对象上,并且对象
添加了PhotonView 脚
本,在函数上添加[PunRPC]标签,即可使函数在同一房间的多
个客户端中进行同步。
1. [PunRPC]
2. public
void GamePause()
3. {
4. Time.timeScale = 0;
5. pauseM
enu.SetActive( true);
6. pauseButton.SetActive( false);
7.
}
5.4 游戏的打包与导出
至此,游戏的制作与设计部分基本结束,最后的工作就是将游戏导出以及发布。
在Unity3D上方的工具栏
菜单选择 File→Build Setting选项,在Scenes In Build
选框内可以添加选择需要导出的场景。由于一开始
并未添加游戏开始菜单场景,故
将StartGame场景拖入选框中,场景切换功能就可以实现。其余的选项为默认,点
击Build按钮,
选择文件夹并等待游戏导出即可。
图 5-5 在BuildSetting中进行导出游戏前的设置
26
图 5-6 导出后的可执行游戏
文件
第六章 游戏测试
打开文件夹找到之前导出的游戏文件并点击 .exe 可执行文件即可打开游戏。
在 Graphics 窗口中可以调整开始游戏时的分辨率大小,选择是否窗口运行,游
戏的画面质量等参数。在 Input 窗口可以设置键位等。
27
图 6-1 Graphics窗口设置
6.1 游戏功能测试
程序编译测试:Unity3D 引擎控制台及编译无严重错误。(测试通过)
界面UI:开始游戏界面/任务系统UI/暂停及开始游戏界面均可正常显示并且功能正
常。 (测试通过)
玩家控制功能:玩家能够正常行走并拾取物品,能够在其他客户端正常更新。 (测试
通过)
28
游戏通关等逻辑测试:玩家能够正常通关游戏并重新开始,游戏分数及计时器等运
行正常。 (测试通过)
联网功能:玩家点击开始联网游戏之后,在 Unity3D的控制台能够输出正常创建和
进入房间的测试语句,并且其他玩家也能够正常进入及退出游戏房间。(测试通过)
6.2 资源占用测试
测试环境:
处理器:AMD Ryzen 7 2700 CPU Eight-Core Processor
内存:16GB DDR4
显卡:AMD Radeon RX 580 2048SP
系统:Windows10 Pro 1909
测试情况如下:
处理器占用率:最高 21%,平均15%
内存占用:101.0MB
显存占用:120MB
以上结果来自人工手动记录,在正常游玩情况下游戏的资源占用均处于正常范围。
测试通过。
6.3 小结
经过测试和调整,游戏正常运行,没有出现卡顿,闪退等问题。屏幕和鼠标的
交互正常,联机的人物没有出现卡顿,断连等网络问题。玩家能够正常获得游戏物
品,并且能够实时在另一个客户端上更新。基本功能已经实现,游戏过程无异常。
第七章 总结
基于 Unity3D 的多人合作游戏到此就圆满完成了,至此也表示毕业设计已经到
了最终阶段。在整个毕业设计的过程中,通过对该游戏的开发与对多人联机类型游
戏的研究,我收获了许多知识。但是在这过程中我也意识到自己还有很大的学习空
间,在游戏制作的过程中深感自己知识储备的不足。
29
通过在网上查阅资料,观看教学视频,咨询指导老师等方式最终将问题解决了。
但是我认为这个项目中仍旧存在这许多不完美:
1.关卡设计过于简单,可玩性不高;
2.联机功能不够强大,在游戏的网络优化部分需要继续打磨;
3.UI设计不够好看。
Unity3D引擎因为功能强大,易上手等特点被越来越多厂商所使用,在未来可能
会更加的热门,熟练掌握 Unity3D引擎的使用有助于我们在游戏开发这一条道路上
走得更远。在本次毕业设计所遇到的困难使我意识到自己经验与知识储备不足,将
来的日子里,我会不断学习进步,争取在未来做出更好的作品。
参考文献
[1] [美]Joseph Hocking. Unity5实战[M].蔡俊鸿,译.北京:清华大学出版社,2016.
[2] Unity 3D游戏开发[M]. 人民邮电出版社,宣雨松, 2012
[3] [美]Jesse Schell.游戏设计艺术:第二版[M]刘嘉俊等,译.北京:电子工业出版社.2016
[4] Unity.Unity3D参考手册.Unity,2010:94-121
[5] 基于Unity3D的多通道下服务器客户端同步[J].汪瑞.现代计算机(专业版). 2015(24)
[6] 魏迎梅.虚拟环境中碰撞检测问题的研究 .[D].长沙:中国人民解放军国防科学技术大学,
2000:23-45
[7]宋传磊.Unity3D中物体间通信方式应用研究.[J].软件开发与应用,2015(12)
[8]吴晶晶 ,戴智超 .基于 Unity3D 的多人在线网络游 戏设计与开发 .[J].计算机系统应
用,2017,26(10):133 138
[9]肖俊.基于Unity3D的跨平台手机网络游戏的研究与实现.[J]科技与信息. 2018(02)
[10]薛玉倩.基于Unity3D的网络游戏.[J]内蒙古科技与经济.2018.7(13)
[11]徐军,张子墨.基于 Unity3d 射击游戏的设计及其核心功能实现.[J]福建电脑.2018(7)
[12]李智鹏.基于Unity3D引擎的空中战机游戏设计与实现.[D].吉林.吉林大学.2016
[13]干建松.基于Unity局域网同步与多角色玩家的设计与实现.[J]盐城工学院学报(自然科学
版).2018.9(3)
[14]吕圣卿,陈一民等.一种基于网络的并行渲染和跨平台同步展示系统 .[J].计算机应用与软
件.2017.10(10)
[15]梁成.基于 Unity3D 在基本游戏框架下客户端研究与实现.[J].现代计算机.2015.09(25)
30

内容摘要
近几年来, 随着科技的发展, 计算机的配置越来越好, 游戏行业也因
为这一浪潮蓬勃发展。在社会的各种压力下,许多人都选择在下班时

与朋友一起玩游戏。在这一条件下促使了多人合作游戏的火热,这类游
戏易上手,音乐节奏较为欢快。并且强调人们之间的沟通协作能力,在

轻松慢节奏的游戏过程中增进彼此之间的友情。多人合作游戏经过长时
间的发展变得多种多样,但总的来说均使玩家得到了轻松愉快的游戏体

验。
选择了 Unity3D 进行开发主要是开发易上手,开发界面交互较为友
好,能够较为便捷的实现所需功能,并且支持为多个平台生成
可执行文
件,在 Windows 或者其他任何平台上启动它而无需任何额外的努力。并
且开发者可以在 Unity3D 中的 Asse
ts Store 里购买到正版素材, 无需为
游戏素材担心。
本文主要包括了此游戏的开发方式以及开发的原理, 游戏场景关卡的
设计
和游戏的联网功能测试等步骤。希望能够为后续同类多人游戏制作
者提供参考和借鉴。
关键词:Unity3D 多人游戏 联网游戏
Abs
tract
In recent years, with the development of science and techno
logy, the
configuration of computers is getting better and better
, and the game industry
is booming because of this wave. Under al
l kinds of social pressures, many
people choose to play games wit
h friends during off hours. Under this
condition, the popularity
of multi player cooperative games is promoted.
Such games are eas
y to play, and the music rhythm is relatively happy. And
emphasiz
e the ability of communication and cooperation between people,
an
d enhance the friendship between them in the process of relaxed a
nd
slow-paced game. After a long time of development, multiplayer
cooperative
games have become diversified, but in general, they
make the players have a
relaxed and pleasant experience.
Unity3d
is chosen for development, which is easy to start with, friendly

to develop interface, convenient to realize required functions, a
nd supports
generating executable files for multiple platforms, e
nabling it on windows or
any other platform without any extra eff
ort. And developers can buy
1
authentic materials in the assets s
tore of unity3d without worrying about
game materials.
This artic
le mainly includes the development mode and principle of the
game
, the design of game scene level and the networking function test
of the
game. Hope to be able to provide reference and reference
for the following
similar multiplayer game makers.
Keywords :Unit
y3D Multiplayer game Networking games
目录
第一章 绪论
.................
.................................................................
................................. 4
1.1 选题的目的和意义
................
................................................................
4
1.2 国内外研究现状
..................................................
.................................. 1
1.3 论文组织架构
.................
.................................................................
..... 5
第二章 游戏开发工具
..............................................
.................................................. 5
2.1 Unity3D
游戏引擎
............................................................
..................... 5
2.1.1 Unity3D 软件介绍
.....................
........................................................ 5
2.1.2
Unity3D 引擎常用函数
.................................................
................... 5
2.1.3 GUI (图形用户界面)
.......................
............................................. 4
2.2 3Ds Max 软件
.
.................................................................
...................... 4
2.3 C# 开发语言
...........................
.................................................................
4
2.4 Photon 引擎
................................................
............................................ 5
2.4.1 Photon 引擎介绍

................................................................
................ 5
2.4.2 PUN (Photon Unity Networking )介绍
......
............................... 5
第三章 游戏设计
.....................
.................................................................
................... 8
3.1 场景设计
.................................
................................... 错误! 未定义书签。
3.1.1 场景的制作
.....
.................................................................
.................... 6
3.2 人物控制与动画
.............................
.......................... 错误! 未定义书签。
3.2.1 导入人物模型
..............
.................................................................
....... 7
3.2.2 人物模型运动的实现
.......................................
................................. 7
2
3.3 游戏中的碰撞检测
..............
................................................................
10
3.4 游戏中的任务系统
.................................................
............................. 10
3.5 添加游戏背景音乐
...................
........................................................... 13
第四
章 游戏 UI 界面设计
....................................................
................................... 15
4.1 菜单界面
................
.................................................................
.............. 15
4.1.1 菜单界面功能
..................................
.................................................. 15
4.1.2 菜单界面制

...............................................................
..................... 16
4.2 游戏界面 UI 制作
........................
........................................................ 17
第五章 将
游戏更改为多人联网游戏
.....................................................
............. 20
5.1 设置 Photon 引擎
..............................
.................................................. 20
5.1.1 注册并配置
Photon 服务器
.....................................................
...... 20
5.1.2 在 Unity 上配置 PUN
................................
..................................... 20
5.2 游戏主菜单加入联网功能
........
......................................................... 22
5.3
同步游戏玩家的数据
.......................................................
................... 23
5.3.1 同步人物的运动与旋转
.........................
........................................ 25
5.3.2 同步游戏中的其他数据
....
............................................................. 24

5.4 游戏的打包与导出
...................................................
............................ 24
第六章 游戏测试
.......................
.................................................................
............... 26
第七章 总结
.......................................
.................................................................
......... 27
参考文献
...............................................
.................................................................
......... 28
致谢
................................................
.................................................................
................. 29
3
第一章 绪论
1.1 选题的目的和意义
近些年以来,随着计算机和通信领域的不断发展,
网络带宽的配置也变得越来
越好,因此网络游戏也随着更快的网络,更低的网络延迟而走进千家万户。网络游
戏也因为硬件需求较为大众化,不
需要特别好的电脑配置而广受电脑游戏玩家喜爱。
其中多人合作网络游戏不仅配置的需求较低,玩法也更趋向于简单化,比一般的网
络游戏更适
合各个年龄段的玩家而广受追捧。此类游戏易上手,节拍也很欢快轻松。
当然,玩家间的沟通和协作能力也是玩这类游戏不可缺少的,在轻松愉悦
的游戏过
程中,彼此之间的友情也得到了增进。
选择了 Unity3D 进行开发主要是开发易上手,软件的交互做的比较友好,能够较为

便捷的实现所需功能,并且支持为多个平台生成可执行文件,在 Windows 或者其他
任何平台上启动它而无需任何额外的努力。并且用户
可以在 Unity3D 中的 Assets
Store 里购买到正版素材,无需为游戏素材担心。通过设计和游玩多人合作游戏,
让我切
身体会到游戏的趣味性和游戏拉近了玩家之间的距离,增进了感情又可以让
玩家得到身心上的放松,拉近朋友之间的距离,让人保持身心愉悦。

本项目使用 Unity3D 开发和设计,探究如何设计开发一个多人游戏并实现多人
联机功能是本次实验的主要目的。
1.2 国内外研究
现状
近年来,随着 Unity3D 引擎的快速推广,越来越多的游戏厂商开始使用 Unity
引擎进行游戏开发,多人合作游戏在国外也
发展迅速。其中由Ghost Town工作室使
用Unity3D引擎开发的多人合作游戏《Overcooked》在2016年获得了 T
GA最佳多人
游戏提名,证明多人游戏在玩家间的受欢迎程度之高。
随着网络技术的发展,网络游戏的玩家越来越多。网络游戏发展迅速,是当

游戏产业中规模最大的一类。国内首款自主研发的 3D 游戏始于 2003 年,到目前
为止,国内在 3D 游戏方面已经 有了很多
的研究,不过考虑到 3D 游戏开发的复杂
性和经济效益,国内拥有自主研发的 3D 游戏引擎的互联网公司屈指可数,中小型
公司更多还
是使用国外相较成熟的游戏工具。多人网络游戏的联机效果关乎到游戏
过程的流畅性,游戏中的元素实时更新决定了游戏过程的流畅程度。是否使
用更好
的网络服务器以及优化较好的服务器引擎决定了玩家的游玩体验。国内的各大公司
中,网易,腾讯等知名公司的联机游戏体验较好,但一
般游戏开发商想要重新开发
4
一个流畅的服务器引擎是不经济的,对于一般的开发者来说,熟悉并掌握 Unity3D
游戏引擎和第三方的
服务器引擎可以降低游戏开发周期。
1.3 论文组织架构
论文从构思到实践查阅了大量的游戏开发手册以及专业的开发资料,进行了一
个多
人合作联网游戏的设计制作。其中具体介绍了游戏的设计思路以及制作步骤,
包括游戏各部分的设计,部分代码的编写,以及将游戏部署在网络上
并传输信息三
个部分。论文分为六个章节,各章节的内容安排为:
第一部分:绪论部分。主要内容是介绍了该项目设计和制作的背景,国内外关

于游戏引擎和服务器引擎的研究现状和该项目的大致内容介绍;
第二部分:主要阐述了本项目使用的开发工具,服务器引擎以及 Unity3
D 等的
大致介绍;
第三部分:详细介绍游戏的设计思路以及实现的各个步骤;
第四部分:游戏界面的 UI设计;
第五部分:运行游戏测
试界面,打包封装;
第六部分:总结项目的不足和缺陷以及改进的方向。
第二章 游戏开发工具
2.1 Unity3D 游戏引擎
2.1
.1 Unity3D 软件介绍
Unity3D 是由 Unity Technologies 开发的一个让玩家轻松创建诸如三维视频游

戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,
是一个全面整合的专业游戏引擎。从通用性上考虑,Unit
y3D 是目前使用范围最广
的引擎。它可以在多个平台上进行开发,并可以较为方便地将项目配置在PC,手机
等各个平台,其对于个人版免
费的策略也非常适合游戏初学者上手。并且 Unity3D
支持C#,javascript 等多种语言编程,操作界面也较为简单,易上手
,包括 project,
hierarchy,inspector,scene,game 等视图,分别用来存放游戏素材和资源,编
5

辑游戏场景并放置游戏对象,描述并配置游戏脚本和素材信息,存放模型资源以及
观察游戏实际运行效果。在游戏素材方面,Unity拥有A
ssest Store素材商店,支
持.fbx,.dae,.3ds,.dxf,.obj等通用模型格式,不必担心游戏素材的问题。
2
.1.2 Unity3D 引擎常用函数
使用 Unity3D引擎制作游戏时,需要经常用到几个生命周期函数:
Awake():初始化
函数,在游戏开始的时候自动进行调用,只会调用一次。
Start():初始化函数,在 Awake函数和 Update 函数之间调用。
只调用一次。用
于赋予变量初始值。
Update():每一帧都会调用一次,受游戏的帧率影响。一般用于游戏内的数值监
测。
Fixe
dUpdate():每隔一定的时间调用并且不受帧率影响。常用于物理引擎的调用,
以及需要固定时间更新的函数。
OnTriggerE
nter():当配置了碰撞体的物体进入拥有此函数的物体之后,执行函
数里的内容一次,用于判定角色是否触碰目标物体的判定。
OnTr
iggerStay():当函数识别的碰撞体进入挂有该函数的物体后,不断执行函数
内的内容,用于拾取物品等用途。
Invoke():
延时执行函数,在 UI 设置的界面的开启或者关闭或者是自身脚本的
执行上使用。
SendMessage():向该脚本所在的物体呼叫
函数, 一般用于传送消息。
2.1.3 GUI (图形用户界面)
GUI即 Graphical User Interface(图形
用户界面 )的简称,泛指用户的操作界面。
本文主要使用了 UGUI 对游戏的界面进行开发, UGUI 就是 Unity 的 GUI
系统,在
此前广泛使用的 UI系统为 NGUI,是 UGUI 出现之前非官方制作的 GUI插件。作为
一个非官方插件虽然让 UI
开发工作变得简单,但相比 UGUI系统的 Image可以使用
material,不需要绑定 Colliders 便可以自动拦截事件
,在 Navigation在 Scene中可视
化等功能,其易用性是没法比的。 UGUI是 Unity3D原生支持的 UI方案,使
用上比
NGUI插件更加的人性化。。
6
2.2 3Ds Max 软件
3D Studio Max常常简称为3D Max或3Ds
Max,由Discreet公司开发制作。前
身为 DOS 系统上的 3D Studio 系列软件。因为可以安装更多插件,使用者多便
于交
流,上手容易,并且拥有强大的角色动画制作能力而广泛应用于三维动画,工业设
计,建筑设计,游戏等领域的建模。
在本项目中 3D
sMax软件因为建模需要花费很多的时间与精力,所以并不会
将软件用于建模功能,而是用于防止模型出错而下载备用。本项目所采用的建筑与

人物模型将从Unity 的官方商店Asset Store 下载,以降低开发所需的时间成本。
2.3 C# 开发语言
C#语言是由
Microsoft 公司发布的面向对象的,基于.NET Framework 和.NET
Core上的高级程序设计语言。C#几乎集
中了所有关于软件开发和软件工程研究的最
新成果:面向对象、类型安全、组件技术、自动内存管理、跨平台异常处理、版本
控制、代码安全管
理等等。根据以上特点,我们在Unity3D引擎上优先考虑使用 C#
语言进行开发。
2.4 Photon 引擎
2.4.1 Pho
ton 引擎介绍
在以前,制作一个合格的多人网络游戏需要大量的金钱及人力开发游戏引擎及
服务器,。随着技术的进步,开始有了成型的游
戏引擎,像Unity3D 引擎、虚幻引擎
等,也因为开发周期的需要出现了成型的服务器引擎。如 SmartFoxServer、Ele
ctro
Server、Photon Server 等。这些成型的游戏服务器为游戏公司省下大量的开发费
用,也让一些小型公司或独立
制作团队有了开发网络游戏的能力,尤其在社群游戏
盛行的这个年代成型的服务器越来越受欢迎。
Photon 是一个泛用性的 S
coketServer 套装软件,可用于多人在线游戏、聊天
室、大厅游戏,同时支持Windows、Unity3D、iOS、Andr
oid等平台。服务端底层由
C++语言编写,客户端使用 C#语言编写,跨多平台,拥有免费的体验服务器,并且
Photon也是比较早
且成熟的与 Unity携手工作的引擎之一。Photon在多人在线共享
7
游戏场景保持平台和多玩家(多客户端)的性能优越。
2.4
.2 PUN (Photon Unity Networking )介绍
Photon Unity Networking(首字母缩写
PUN)是一个 Unity 多人游戏插件包。
它提供了身份验证选项、匹配,以及快速、可靠的通过我们的Photon 后端实现的游

戏内通信。使用 PUN 不需要搭建服务器,与 Unity3D 引擎完美整合,项目可以导出
至所有 Unity 支援的平台。根据以上
与 Unity 完美兼容的特性以及易上手,无需自
己维护服务器等特点,在本项目中采用 PUN 插件进行网络部分的配置。
第三章 游
戏设计
3.1 场景设计
游戏总共包括两个场景:场景 1 和场景 2,场景 1 是游戏联机匹配的主页面,
场景2是游戏的主场景。

场景2中主要包括以下对象:
地形:包括货柜,收银台等游戏场景。
游戏对象:联机中的人物,由脚本在固定位置生成。
其他物体:货篮等障
碍物。
3.1.1 场景的制作
利用 Unity3D 的官方商店 Asset Store 寻找适合的场景,在 Asset Stor
e 的页
面中点击Import按钮将所需的场景导入到项目中。并在 Scene面板中拖动至大致需
要的位置,在 Inspector
面板设置各物体的具体位置参数。在 Inspector 面板中,
设置物体的 Transform 选项比较重要,Position 表
示物体在世界坐标中的位置,
Rotation 表示物体模型沿着 X,Y,Z 轴旋转的角度,Scale 表示物体在 X,Y,Z 轴的

放。移动货篮,并拼凑相应的货架,修改并重新搭建原场景后,最终产生了适合游
戏的场景,如图3-1 所示。
8
图3-1 修改后的
游戏场景
3.2 人物的控制与动画
3.2.1 导入人物模型
首先要设计玩家在游戏中所使用并控制的人物,由于设计人物模型的时间成本

较高,所以采用 Unity 官方商店 Asset Store 中的人物模型。Unity3D 所支持的模
型格式有许多种,在前期项
目的关卡设计中我已经下载并导入项目中。将 Project
面板中的人物模型直接拖入 Project中,调整原始的大小和旋转角度即可
,如图 3-2
所示。
图3-2 导入后的人物模型
3.2.2 人物模型运动的实现
将人物模型导入后,给人物添加刚体 Rigidb
ody 以实现摩擦力,阻力等物理效
果,给人物添加胶囊碰撞体 Capsule Collider,用于与其他碰撞体产生碰撞交互。
9

添加以上两个所需的组件后,需要设置其参数, Rigidbody的参数为默认即可,
Capsule Collider需要点击 Ed
it Collider更改其大小,以符合人物模型大小产生
更合理的碰撞。如图 3-3所示。
图3-3 人物模型及刚体的配置
接下来
给人物模型添加人物的移动脚本 playerControl.cs,在此脚本中编写人
物的移动和旋转函数。人物的移动使用的方法是 Ri
gidbody.MovePosition()函数,
人物旋转使用的方法是 Rigidbody.MoveRotation()函数。移
动和旋转脚本在
FixedUpdate()函数中调用。
最后,给人物添加运动时播放的动画。在 Inspector面板中添加 Ani
mator组件,
并在Project面板中右键→Create→Animation Controller 新建一个动画控制器,
将其
拖入 Animator 组件中的 Controller 选项中。简单配置动画控制器,如图 3-4
所示。
图 3-4 人物动画控制
器配置
10
编辑脚本如下:
1. using System;
2. using System.Collections;
3. u
sing System.Collections.Generic;
4. using UnityEngine;
5.
6. publ
ic class playerControl : MonoBehaviourPun
7. {
8. public float sp
eed = 6f;
9.
10. Vector3 movement;
11. Animator anim;
12.
Rigidbody playerRigidbody;
13. int floorMask;
14. float camRayL
ength = 100f;
15.
16. private void Awake()
17. {
18. fl
oorMask = LayerMask.GetMask("Floor");
19. anim = GetCompon
ent();
20. playerRigidbody = GetComponent ody>();
21. }
22.
23. private void FixedUpdate()
24. {
25.
float h = Input.GetAxisRaw("Vertical");
26. float v = -Input.GetA
xisRaw("Horizontal");
27.
28. Move(h, v);
29. Turni
ng();
30. Animating(h, v);
31. }
32.
33. void Move( flo
at h, float v)
34. {
35. movement.Set(h, 0f, v);// 存储键盘
输入
36.
37. movement = movement.normalized speed Time.d
eltaTime;
38.
39. playerRigidbody.MovePosition(transform.p
osition + movement);
40. }
41. void Turning()
42. {
43.
Ray camRay = Camera.main.ScreenPointToRay(Input.mousePosition
);
44.
45. RaycastHit floorHit;
46.
47. if (Physics.Raycas
t(camRay, out floorHit, camRayLength, floorMask))
48. {
49
. Vector3 playerToMouse = floorHit.point - transform.p
osition;
50. playerToMouse.y = 0f;
51. Quat
ernion newRotation = Quaternion.LookRotation(playerToMouse);
52.
playerRigidbody.MoveRotation(newRotation);
53.
}
54. }
55.
56. void Animating( float h, float v)
57. {
58.
bool walking = h != 0f || v != 0f;
59. anim.SetBool("IsWa
lking", walking);
60. }
11
3.3 游戏中的碰撞检测
游戏需要检测人物碰到了什么, 并处理碰撞体的
信息。 首先要在货架上添加 Box
Collider 碰撞体并调整大小用于物理碰撞,人物碰到货架时会停下来,然后添加货
架的 ta
g 用于与非货架物体区分。
在 playerController.cs 编辑代码部分,用 OnCollisionStay ()函数
检测人物
模型所碰到的物体, 用 name 储存物体碰撞体的名字, 在人物碰到带有 tag 的货架时,
玩家按键盘上的 E 键即可
获取货架上的商品。 脚本编辑完毕后, 将 player 设置为预
制体,在游戏开始时实例化。
1. private void On
CollisionStay(Collision collision)
2. {
3. string name = colli
sion.collider.name;
4.
5. if (collision.gameObject.tag == "contai
ner")
6. {
7. if (Input.GetKeyDown(KeyCode.E))
8.
{
9. // 按e 拿取物品
10. Debug.Log(" 拿到了 " + name);

11. TaskEventArgs e = new TaskEventArgs();
12.
e.id = name;
13. e.amount = 1;
14.
MesManager.Instance.Check(e);
15. }
16.
17
. }
3.4 游戏中的任务系统
游戏中的任务内容通过 XML 文件储存。首先要新建 Task.xml 文件,编辑任
务内
容。
部分任务内容如下:
1.
2. 购物清单
3. tion> 苹果2 ,冰棍3
4.
5. 苹果

6. 2
7. nID> 冰棍
8. 3 etAmount>
9.
10. 报酬
11. 5 rewardAmount>
12
12.

13.
14.
15. 购物清单

16.
方便面10, 酱油1
献花(0)
+1
(本文系考试资料文...原创)