版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于unity的VR场景交互系统设计摘要网络社交已经是人们日常生活必不可少的一部分。以腾讯公司开发腾讯QQ为起始,随着技术的发展,VR虚拟社交也开始崭露头角。为了国内虚拟社交的发展与革新,开发了基于unity的VR虚拟社交社区,用于满足国内用户不断膨胀的虚拟社交需求。主要使用Unity3d、Mirror框架、C#等技术。本次设计围绕着Unity3d提供的摄像机、灯光、地形等各种组件,以及物理、网格、图形等多种引擎,展开对VR虚拟社交社区基本交互系统的开发。此项目将针对VR虚拟社交社区的场景交互系统,完成场景、人物、摄像机、网络等相关模块与脚本的开发。关键词:Unity3dMirrorC#虚拟社区交互系统VR目录TOC\o"1-3"\h\u19932一、绪论 217817(一)研究背景 222114(二)研究目的与意义 23964(三)国内外研究现状 326493二、可行性研究 317534(一)技术可行性 329088(二)经济可行性 31079(三)操作可行性 42864三、需求分析 421498(一)系统功能需求分析 421159(二)市场需求分析 413550(三)相关技术介绍 430435四、详细设计 511161(一)项目环境设计 516101(二)脚本开发 619755五、局域网联机相关调试 1329832(一)调试的目的 1318386(二)测试档案 1329182结论 1518128致谢 1620492参考文献 16一、绪论(一)研究背景在马斯洛需求层次理论中,社交需求是连接低级需求与高级需求的桥梁。当人们满足了基础的生存需求与安全需求后,就会开始渴求社交需求,进一步步入尊重需求与自我实现需求的高级需求中。显然连接着低级需求与高级需求的社交需求是必不可少的。俗语有云“男女搭配,干活不累”这就是一种社交需求正面反馈。无论是线上网络游戏还是线下桌游、以及各种朋友圈、Vlog都是这个时代主流的社交方式。更有Vup、VTUber等借助虚拟形象进行直播的主播。在这个人际关系复杂的时代,借助虚拟形象来满足社交需求,成为了被越来越多人认可的一种方式。VR这个领域自20世纪开始就拥有这这个概念,而在前两年又迎来了一波技术革新小高峰,但却始终不能和现有的职业领域很好的融合。但我相信在未来的技术迭代过程中,VR一定会脱颖而出,成为新生的技术热点。而在VR今后的发展中,成本最低、最容易取得成果的不是游戏,也不是职业模拟,而是虚拟社交社区的建设。社交作为人的五大需求之一,相关软件将会是线上应用辐射规模最广的一种,这一点已经被不少现如今的龙头企业证实过了。(二)研究目的与意义本项目主要开发的模块有:场景搭建、多种人物移动脚本、视角跟随、局域网连接、伪随机概率梯度算法等。项目完成后可通过客户端游览虚拟世界,并使目前渐渐行成趋势的虚拟人物形象相关产业提供一个虚拟活动场景。同时也是为了弥补国内此种软件的缺口,满足人们对虚拟社交画面、娱乐性、丰富性的需求,而开发这个项目。(三)国内外研究现状能真正称得上是VR外置设备的产品,大多都是由外国厂商设计生产的,包括VR所依托的Unity引擎与3dmax等建模软件也都是外国厂商。不过即使是这样,其对VR产品的应用也同样不多。当然软件的应用是不分国内国外的,HTCVIVE的VR外置设备也留有开发使用的接口和接口说明文档,结合Unity编辑C#脚本即可。 在国内VR领域虽然没有较为杰出的作品,但在3d游戏与模型等方面,却有不少优秀的厂商。现在VR所依托的3d建模等相关技术多用于建筑设计、装修设计等行业。二、可行性研究(一)技术可行性本项目的开发需要使用的主要技术手段有:Unity3d、C#、Mirror框架。这些内容虽然没有系统的上过课程,但在课余时间是我一直研究的方向。在学校培养编程逻辑与思想,让我在接触C#时也迅速上手。Unity引擎的各种文档资料在官网都有,并且作为两大主流引擎之一,Unity开发的视频资源也非常丰富。经过这几年的积累,在相关论坛、社交软件中也有不少前辈能求教。市面上主流的VR设备也都能与SteamVR接口互通。综上所述,基于Unity的VR交互系统具备技术支持,所以在技术上是可行的。(二)经济可行性从经济角度来看,需要一个配置较高的电脑就可以进行开发。虽然对电脑配置有一定要求,但从设计功能与系统的角度上来说,对硬件要求不高。如果一味地堆叠素材不仅对硬件要求严苛,其中技术的含金量也较低。在功能模块明确后,项目交互操作开发为重点,减少不必要的资源消耗。并且我对计算机硬件了解也不少,在校期间自己组装过台式机,后续界面升级,也可自己手动按需升级硬件,提高计算机性能。项目开发中用到的模型资源,可在Unity3d官网的AssetStore中下载(包括Mirror在内的)免费资源。因此项目并不需要大量的资金支持。同样项目完成后,基于Unity3d便于开发Mod的性质,与Steam创意工坊的支持,将开放用户部分开发权限,为项目的丰富性提供支持。虽然手中没有现成的VR设备,但如技术可行性的分析所说,保留VR的接口即可。综上所述,基于Unity的VR交互系统对经济方面要求不大,所以在经济上是可行的。(三)操作可行性该项目核心内容就是设计系统对用户输入的指令做出反应,例如场景中的交互提示、移动指令、联机房间等。在项目中会开发核心功能相同,但操控方式不同的脚本。使用者可以选择自己习惯的操作方式进行操作综上所述,基于Unity的VR交互系统在操作上是可行的。三、需求分析(一)系统功能需求分析基于Unity的场景交互系统主要设计方向是,能够完成角色基本操作并对网络功能进行适配。通过逻辑关系对场景中不同的物体发送交互指令,针对交互物体性质产生不同的交互效果。从开发者的角度来看,脚本代码要保证低耦合高内聚,提高脚本代码的泛用性,并保证脚本代码不会过于零散,做到一个脚本做一件事。以便于用户创意工坊及Mod的制作。同时也便于自己后续开发,以及Bug的查找与修改。从用户的角度来看,系统功能要简单易于理解,快速上手,切合自身平时使用习惯(如有人习惯摇杆/鼠标翻转),需要提供不同的操作方式,界面简洁引导清晰。(二)市场需求分析在国内,以B站为活动中心一般称虚拟主播为VUP,作为新兴的直播模式,粉丝用户数激增。甚至近一年来,在B站主办的《花样实习生》节目中,蔡明老师也加入了虚拟主播的行列。在上述所涉及的VTB、VUP,甚至是粉丝中,显然都是虚拟社交社区的潜在用户。(三)相关技术介绍1、编程环境选择MicrosoftVisualStudio是微软公司的开发工具包系列产品。VS包括了在软件生命周期中所需要的绝大部分工具,例如UML工具、代码管控工具、集成开发环境(IDE)等等。所写的目标代码适用于微软支持的所有平台,包括MicrosoftWindows、WindowsMobile、WindowsCE、.NETFramework、.NETCompactFramework和Microsoft
Silverlight
及WindowsPhone。简单来说VS其实就是一个集合了许多工具的开发工具集合。在我们的项目中只需要在工具菜单栏中点击获取工具,添加Unity开发包即可。2、C#语言C#是由C和C++衍生出来的一种安全的、稳定的、简单的、优雅的面向对象编程语言。它在继承C和C++强大功能的同时去掉了一些它们的复杂特性(例如没有宏以及不允许多重继承)。C#综合了VB简单的可视化操作和C++的高运行效率,以其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为.NET开发的首选语言。
C#是面向对象的编程语言。它使得程序员可以快速地编写各种基于MICROSOFT.NET平台的应用程序,MICROSOFT.NET提供了一系列的工具和服务来最大程度地开发利用计算与通讯领域。C#使得C++程序员可以高效的开发程序,且因可调用由C/C++编写的本机原生函数,而绝不损失C/C++原有的强大的功能。因为这种继承关系,C#与C/C++具有极大的相似性,熟悉类似语言的开发者可以很快的转向C#。3、引擎Unity
作为两大引擎之一,是应用非常广泛的试试内容开发平台。为建筑工程、装修设置、影视动画、游戏开发等广泛的领域提供了动画、物理、粒子、光照系统等强大的工具。借助Unity平台提供的这些工具,开发者轻易的获得包含创作、运营和变现等整个项目流程所需要的东西,进行任何实时互动的2D和3D内容,支持平台包括手机、平板电脑、PC、游戏主机、增强现实和虚拟现实设备。基于Unity开发的游戏和体验月均下载量高达30亿次,并且其在2019年的安装量已超过370亿次。全平台(包括PC/主机/移动设备)所有游戏中有超过一半都是使用Unity创作的;在Apple应用商店和GooglePlay上排名最靠前的1000款游戏中,53%都是用Unity创作的。Unity提供易用实时平台,开发者可以在平台上构建各种AR和VR互动体验。四、详细设计(一)项目环境设计本项目使用Unity3d进行创建,使用unity的Terrain(地形)模组、Lighting(光照)模组、camera(摄像机)模组以及导入的各种模型资源进行开发(1)创建Unity3d项目在UnityHub中选择个人版免费许可证,创建3D项目。进入项目后在空场景中会自带全局光照、主相机、天空盒各一个。(2)创建地形在上方菜单栏GameObject中选择3DObject,添加其中的Terrain组件。为方便建造地形凹陷效果,调整地形Y轴(高度)坐标为100。在通过Terrain组件衍生周边地形,扩大地形面积。选择RaiseorLowerTerrain模式,调整大笔刷、低强度羽化边缘的笔刷,按住鼠标左键使地形升高,建造地图大型平缓山坡。选择中型笔画在地图边缘创建拔高地形的小型山地。再在此模式下按住Shift,使笔刷效果变为凹陷,在山地中心设计凹陷做湖泊效果。同时使地图边缘不规则凹陷,创造海岛效果。选择笔刷的PaintTexture模式添加草地、沙地、岩石等各种地形贴图。分别在相应位置进行低强度覆盖粉刷,保证渐变效果。最后通过SmoothHeight笔刷,磨平地形高度差,使其过度更加平滑。(3)导入模型在AssetStore中下载免费的房子、环境、室内、人物等模型,拖拽模型预制体进入场景布置。树木(有碰撞体的植被模型)与草(无碰撞体的植被贴图)添加到Terrain组件下对应的模块中,通过笔刷进行批量创建。通过调整TreeHeight强度,改变树木模型高度随机差异。通过调整TargetStrength调整草地摆动效果强度。调整水面模型Transform面板(属性面板)中的ScaleX值与Z值,使水面模型放大。使其位于地形平面下方,并覆盖凹陷部分,做出整体的水面效果。(二)脚本开发在Start()中的语句为:物体启用时执行一次的语句;在Update()中的语句是:每刷新一帧执行一次的语句;FixedUpdate()对物理组件操作有优化,能有效避免卡墙、卡地、闪回等问题。在涉及移动量的计算上,存在硬件性能区别,会出现:刷新率高的设备每秒的帧数高,按帧执行的语句执行次数高,反之执行次数低;进而导致不同设备(或同一设备在不同场景)的移动速度不同。在移动量的计算公式中,乘上Time.deltaTime,使语句每秒执行次数与系统帧数(60帧/秒)对应。即可有效回避移动异常的问题。1、人物脚本(1)以世界坐标为基准进行平移:publicfloatmoveSpeed=5f;Vector3moveAmount;Vector3moveDir;Rigidbodyrb;voidStart(){rb=GetComponent<Rigidbody>();}voidUpdate(){moveDir=newVector3(Input.GetAxis("Horizontal"),0,Input.GetAxis("Vertical")).normalized; moveAmount=moveDir*moveSpeed*Time.deltaTime;}privatevoidFixedUpdate(){rb.MovePosition(moveDir+this.gameObject.transform.position);}MoveSpeed为速度控制器保留外部控制接口,代码挂到物体上后可以不改变代码中的数据,只改变这个物体上脚本的数据。Input.GetAxis("Horizontal")代表读取键盘的A/D键输入,Input.GetAxis("Vertical")代表读取键盘的W/S键输入,分别作文三维坐标系中X与Z的值放入暂存器moveDir。通过速度倍率与执行帧数限制的调整后,通过与目标坐标值相加移动刚体位置,实现以世界坐标系为参考系的平移。(2)以自身为轴进行前进、后退与旋转floath=Input.GetAxis("Horizontal");floatv=Input.GetAxis("Vertical");transform.Translate(Vector3.forward*v*speed*Time.deltaTime);//WS上下transform.Rotate(0,Input.GetAxis("Horizontal")*Time.deltaTime *RotateSpeed;,0);//AD左右通过transform.Translate改变以自身坐标系方向为基准的前后位置坐标,通过transform.Rotate改变自身坐标系的Y轴角度,实现角色以自身坐标系为参考系的转向与移动。(3)摄像机与鼠标脚本①鼠标锁定与隐藏Cursor.lockState=CursorLockMode.Locked;Cursor.visible=false;锁定光标不能动,可按Esc解锁光标,并隐藏光标,增强用户的沉浸感与代入感。②摄像机锁定Vector3dir;publicGameObjectCameraObject;voidStart(){dir=CameraObject.GetComponent<Transform>().position- gameObject.GetComponent<Transform>().position;} voidUpdate(){gameObject.GetComponent<Transform>().position= CameraObject.GetComponent<Transform>().position-dir;}锁定摄像机,CameraObject为对外接口,可在脚本外设置目标对象。使挂载脚本的物体与目标物体的坐标差值不变,用于摄像机跟随正在移动的人物,结合鼠标控制摄像机视角的脚本有另一种应用方式。③鼠标控制摄像机视角publicenumRotationAxes{MouseXAndY=0,MouseX=1,MouseZ=2}publicRotationAxesm_axes=RotationAxes.MouseXAndY;publicfloatm_sensitivityX=10f;publicfloatm_sensitivityY=10f;publicfloatm_minimumY=-45f;publicfloatm_maximumY=45f;floatm_rotationY=0f;通过枚举设定三种模式的切换判定,可以通过外部接口进行切换,转向速度倍率为10,上下最大转动仰角限定45°。Y轴(左右转向)初始值设定为0。voidUpdate(){if(m_axes==RotationAxes.MouseXAndY){ floatm_rotationX=transform.localEulerAngles.y+ Input.GetAxis("MouseX")*m_sensitivityX;m_rotationY+=Input.GetAxis("MouseY")* m_sensitivityY; m_rotationY=Mathf.Clamp(m_rotationY,m_minimumY,m_maximumY); transform.localEulerAngles=newVector3(-m_rotationY,m_rotationX,0);}判断m_axes为0时执行同时操作x与y轴视角的转动。注:手握的鼠标硬件移动时是应用的传统二维坐标系xy,所以鼠标左右移动时是鼠标的x轴在进行变化,所以体现在Unity3d中是变化y轴的旋转值。而上下移动,鼠标y轴变换时,改变的是Unity3d中x轴的旋转值。当前物体的y轴旋转值与鼠标x轴移动量的和赋值给m_rotationX;同理m_rotationY赋值后,通过值限制函数Mathf.Clamp把其先行在-45°与45度之间。再把作为m_rotationX作为向量的y值,m_rotationY作为向量的x值,赋值给脚本挂载物体的轴。elseif(m_axes==RotationAxes.MouseX){transform.Rotate(0,Input.GetAxis("MouseX")*m_sensitivityX,0);}判断m_axes变量为1时,仅读取鼠标x轴增/减量,用于改变物体y轴角度,并物体的x轴与z轴锁定为0。else{m_rotationY+=Input.GetAxis("MouseY")*m_sensitivityY;m_rotationY=Mathf.Clamp(m_rotationY,m_minimumY,m_maximumY); transform.localEulerAngles=newVector3(-m_rotationY,transform.localEulerAngles.y,0);}判断m_axes不为0也不为1时(节省运算时间,不再if),仅改变物体x轴角度,并使目标y轴保持原有角度不变,z轴为0。将此脚本与摄像机跟随脚本挂到一个空物体上,相机作为空物体的子类,空物体位于人物头顶,摄像机跟随脚本目标设为人物,可实现摄像机以人物为轴进行旋转。触发器及触发事件脚本(1)触发器脚本publicGameObjectF_Hover;publicvoidShow(GameObjectF_Hover){F_Hover.SetActive(true);}publicvoidHide(GameObjectF_Hover){F_Hover.SetActive(false);}F_Hover是对外接口,Show函数控制显示目标对象(即启用),Hide函数控制隐藏目标对象(即禁用)。F_Hover是场景中的交互提示,即“按F进行交互”。voidOnTriggerEnter(ColliderF_Trigger){Debug.Log(Time.time+"进入该触发器的对象是:"+F_Trigger.gameO);Show(F_Hover);GameObject.Find("Ball").GetComponent<BallShot>().enabled=true;}进入触发器后再控制台显示进入触发器物体的名称,并在进入时调用Show函数,启用目标对象(F_Hover),并且搜索场景中名称为Ball的物体,启用物体上名为BallShot的脚本。voidOnTriggerStay(ColliderF_Trigger){Debug.Log(Time.time+"留在触发器的对象是:"+ F_Trigger.gameO);}进入触发器控制台每帧刷新一次,显示留在触发器物体的名称。voidOnTriggerExit(ColliderF_Trigger){Debug.Log(Time.time+"离开触发器的对象是:"+ F_Trigger.gameO);Hide(F_Hover);GameObject.Find("Ball").GetComponent<BallShot>().enabled=false;}离开触发器后在控制台显示离开触发器物体的名称,并在离开时调用Hide函数,禁用不表对象(F_Hover),并且搜索场景中名为Ball的物体,禁用物体上名为BallShot的脚本。(2)场景跳转脚本if(Input.GetKeyDown(KeyCode.F)){SceneManager.LoadScene("thelastrevelation");}PRD伪随机算法的实现for(int
i
=
1;
i
<=
100;
i++){ double
p
=
i
*
1d
/
100d;
double
c
=
CFromP(p);
Debug.Log("P:
"
+
p
+
"
C:
"
+
c);}p为实际客户端显示的概率数值,把p值作为参数传入CFromP()函数中,进行运算计算出概率增量C值。private
static
double
CFromP(double
p){ double
dUp
=
p;double
dLow
=
0d; double
dMid
=
p; double
dPLast
=
1d;double
dPtested;while
(true){ dMid
=
(dUp
+
dLow)
/
2d;dPtested
=
PFromC(dMid);if
(Math.Abs(dPtested-dPLast)
<=
0.00005d)
break;if
(dPtested
>
p)
dUp
=
dMid;else
dLow
=
dMid;dPLast
=
dPtested;
}return
dMid;}把目标概率p设定为初始最大值,初始最小值为0,dMid为本次循环概率增量C的暂存器,dPLast上一次运算平均概率的暂存器,dPtested为本次运算平均概率的暂存器。应用二分法,取dUp(最大值)与dLow(最小值)和的一半作为概率增量C值传递到PFromC函数中。通过PfromC函数对本次循环概率增量C运算后,得出在此概率增量C下,对应的dPtested(平均概率)为多少。如果dPtested(本次运算的平均概率)与dPLast(上一次运算的平均概率)差值的绝对值小于我们设定的界限0.00005则跳出循环。否则判断dPtested是否大于(目标概率)p。(1)如果大于概率p,则说明此次概率增量C设置的过大,理想的C值应该在dLow与dMid(C值暂存器)之间,则应把本次的概率增量赋值给dUp,再次进行上述循环。(2)如果小于概率p,则说明此次概率增量C设置的过小,理想的C值应该在dMid(C值暂存器)与dUp之间,则应吧本次的概率增量赋值给dUP,再次进行上述循环。在开始进入下一个循环之前需要把dPtested(本次运算平均概率暂存器)的值赋给dPlast(上一次运算平均概率暂存器),把这个放在最后说是因为这里有个看似不合理的地方:为什么不直接计算dPtested与(目标概率)p的差值,使dPtested在逼近p时就跳出循环呢?其实是因为在高精度运算中,过小的值可能会因为计算机误差与运算精度等问题导致dPtested与p永远无法达到0.00005差值的理想状态。但同样用二分法计算出的dPLast值会与dPtested最终的结果绝对是相等。private
static
double
PFromC(double
c){double
dCurP
=
0d;
double
dPreSuccessP
=
0d;double
dPE
=
0;int
nMaxFail
=
(int)Math.Ceiling(1d
/
c);for
(int
i
=
1;
i
<=
nMaxFail;
i++){dCurP
=
Math.Min(1d,
i
*
c)
*
(1
-
dPreSuccessP);dPreSuccessP
+=
dCurP;dPE
+=
i
*
dCurP;}return
1d
/
dPE;}PFromC函数的作用是计算在当前概率增量C下,平均概率为多少。dCurp是单次概率暂存器。dPreSuccessP为在当前C值下,前几次循环概率事件发生的占比分布之和(简称占比分布)。dPE为事件发生的期望。概率增量C在PRD算法的意义是:第一次发生事件的概率为C,第二次发生事件的概率为2C,第三次3C,以此类推,借此用以达到保持随机性的同时,降低完全随机连续发生(或连续不发生)的概率。所以,出现事件连续不发生的情况时,在第nMaxFail次,概率会增加至极限100%,即事件必然发胜,所以使用通过1/c向上取整,即可求出极限值nMaxFail。Math.Min函数用于控制事件发生概率不会超过100%。(1-dPreSuccessP)为第i次循环发生的概率权重(这里的概率不同于事件发生的概率),没有具体事件这里容易发生混淆,故用游戏中的暴击率来举例说明。第一次攻击产生暴击的概率为30%,因为第一次攻击必定进行,所以概率权重为100%;第一次不暴击,第二次攻击产生暴击,因概率增量提升暴击率为2*30%,但仅在第一次不暴击的情况下才会进入本次循环,所以概率权重为1-(第一次暴击概率),即(1-30%)。前两次都不暴击,第三次攻击产生暴击,因概率增量提升暴击率为3*30%,但仅在前两次都不暴击的情况下才会进入本次循环,所以概率权重为1-(在第一次攻击发生暴击的概率+在第二次攻击发生暴击的概率),即(1-((30%)+(2*30%*(1-70%))))。五、局域网联机相关调试(一)调试的目的在Unity项目开发过程中,只能通过Game视窗运行一个进程,而在项目后期的局域网联机开发中,必须打开至少两个以上的项目同时运行。而在项目的导出与网络组件加入后出现了不少问题,甚至出现了与单机模式脚本不兼容、逻辑混乱的问题。就此模块的开发过程中留存了不少“版本更新”文档,故在此整理。(二)测试档案本项目中的测试是在基本功能完成后,对项目进行导出测试。本过程中不涉及测试案例,而是并针对版本中出现的问题进行整理,并提出拟解决方案(1)版本需解决问题:场景中自带玩家预制体,输入会同时操纵两个玩家角色拟解决方案:删除场景中预制体,靠脚本生成玩家,生成点从4减少为1出现问题:客户端不能正常生成玩家角色预制体(2)版本解决问题:客户端不能正常生成玩家角色预制体。解决方案:玩家角色生成点“SpawnPoint”从1增加到2。出现问题:生成角色不同步,且角色生成逻辑混乱,出现复数同时接受键盘输入指令角色。解决问题:触发器脚本关联玩家预制体,进入场景后才创建角色预制体会导致交互提示图标F逻辑异常。解决方案:把相机与角色预制体关联解除,相机与交互提示图标F关联,使场景加载后触发器能锁定场景中的图标F,解决其逻辑错误。出现问题:场景中鼠标锁定脚本生效,导致不能正常点击创建或加入服务器房间。(3)版本解决问题:场景中鼠标锁定脚本生效,导致不能正常点击创建或加入服务器房间。解决方案:把鼠标锁定脚本关联角色模型,在玩家角色预制体生成后锁定鼠标。出现问题: 客户端不能正常加入服务器房间,角色生成异常。摄像机跟随功能,因角色加载滞后出现异常。(4)版本解决问题:客户端不能正常加入服务器房间,角色生成异常。摄像机跟随功能,因角色加载滞后出现异常。解决方案:推翻之前一切问题解决方案,把触发器脚本从物体上转移到玩家角色预制体上。解决预制体加载触发逻辑问题的同时,解决角色与场景交互的泛用性问题。出现问题:模型生成数量没问题,但服务器端与客户端数据不同步。键盘指令同时操作两个模型,且两个界面操作不互通。(5)版本解决问题:添加屋内场景。解决方案:给房屋添加触发器,并增加触发器脚本以及事件脚本,实现场景跳转。出现问题:场景跳转后人物不会跟着转移。通过在室内环境添加新的角色生成解决问题。(6)版本/7/8①测试unity禁用脚本后,生成项目是否会同样禁用,并对新的联机移动方式进行第一次测试依旧通信异常。②调整移动脚本与网络连接同时挂载到“摄像机-角色”的预制体父类空物体上。终端输入还是会同时影响两个角色,但在某一终端的输入,会正确反映到另一终端。③把update定义成private,在添加判断语句if(!isLocalPlayer)return。判断是否是终端所属生成角色,成功完成联机数据互通。后续1.0.1.x版本为针对局域网相关脚本适配与BUG处理。均在详细设计中已有体现,故在此不再复述。结论虽然在整个开发过程中遇到了很多问题,但通过询问与讨论,最终都一一解决了。毕业设计工作有以下几个方面:(1)本次系统开发是一种新型社交平台,在项目初期,主要工作为收集各个模块开发所需要的相关技术,并对学习与开发周期做了一个大概的预估。之后开始着手构建项目,并进行相关课程的学习。(2)在开发中期重点放在丰富场景,以及脚本编写上。主要涉及环境布局与Unity接口的查找、使用上。环境布局虽然在计算机技术层面上,技术含量不高,但其也是项目中必不可少的一个模块。Unity提供的各种接口功能非常的全面且强大,但相对应的,想要完全掌握一些接口的内部逻辑以便开发学习不局限于表面,也付出了不少时间进行研究。(3)在项目的后期,基础脚本都成功运行,但在变得的复杂的场景中会出现各种Bug。所以工作重点放在了调试脚本与修改Bug上,对脚本自身、脚本与脚本、脚本与物体之间的逻辑关系进行优化。并针对局域网连接模块进行脚本版本优化与适配。通过这次毕业设计我受益良多,从一开始使用Unity的方块、球体制作简单地人物模型与方块房间到现在的各种脚本、系统的开发。由于时间和精力的限制,受建模技术的制约,本次开发的虚拟社区还缺乏各种游戏性、美观性,场景也只有两个,但比较复杂的交互模块已经开发完毕,后续开发也仅仅需要简单地对应事件脚本即可。总的来说项目还有着进一步开发的空间,使虚拟社交社区在更加丰富
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 国外石英矿山承包合同协议书范本
- 合同板本类型
- 2024年济宁烟台客运上岗证考试题
- 2024应届生签合同的合同陷阱
- 2024上海市旅游包车合同
- 三年级语文上册第二单元测试卷-基础知识与综合能力篇 含答案 部编版
- 2024建筑劳务人工合同范本
- 2024汽车配件供应合同
- 员工人事档案
- 报废车辆收购合同(2篇)
- 七年级语文上册第13课《纪念白求恩》公开课一等奖创新教案
- 统编版语文六年级上册第八单元大单元整体教学设计
- 《扇形统计图》(教学设计)-2023-2024学年北师大版数学六年级上册
- 教师个人业务学习笔记(41篇)
- 2025年高考语文复习备考复习策略讲座
- 数学史上的三次数学危机
- 2024年水电暖安装承包合同
- 缺乳(乳汁淤积)产妇的中医护理
- 2024北师大版新教材初中数学七年级上册内容解读课件(深度)
- 2024年公共营养师三级考试试卷及答案
- 2024年上半年软考信息系统项目管理师真题
评论
0/150
提交评论