个人技术总结——Unity3D游戏的数据及3D空间部分的配置

222100335廖晨旭 2024-06-06 20:55:44
这个作业属于哪个课程2302软件工程社区
这个作业要求在哪里软件工程实践总结&个人技术博客
这个作业的目标课程回顾与总结和个人技术总结
其他参考文献《构建之法》

文章目录

  • 技术概述
  • Unity3D游戏中数据存储,使用的接口设计及其实现与运用。
  • Unity3D游戏中的摄像机和人物移动逻辑以及动画逻辑
  • 技术详述
  • 一、数据存取
  • 1.编写相应创建脚本:
  • 2.编写基础的读取数据脚本ReadTable
  • 3.编写相应存取脚本
  • 4.实现数据与UI之间的交互
  • 二、摄像机和人物移动逻辑与动画逻辑
  • 1.相机移动逻辑
  • 2.人物移动逻辑
  • 动画控制逻辑
  • 问题总结
  • 1.数据与游戏物体交互时的查找与更新


技术概述

Unity3D游戏中数据存储,使用的接口设计及其实现与运用。

  • 技术的核心在于灵活运用Unity编辑器特有的存储结构的接口ScriptableObject。这个接口可以生成Unity特有的表格,存储各种不同信息。
  • 技术主要实现数据在表格中的存取,编写相应的方法实现游戏过程中的各种数据存取。

Unity3D游戏中的摄像机和人物移动逻辑以及动画逻辑

  • 技术的核心在于熟练掌握Unity3D的相对坐标的运用和动画器的运用,不然容易出现位置错误等问题。
  • 技术主要实现人物移动,摄像机移动,播放动画等。

技术详述

一、数据存取

1.编写相应创建脚本:

编写脚本用于声明该存储结构中存储的数据类型,如下图,下图中存储的就是一个我自己声明的PackageTableItem类,创建出的表格是以PackageItem为元素的List,用于存储所有可以放入背包中的物品的详细信息。

在这里插入图片描述


这是更加复杂的创建脚本,该对象中含有一个构造函数用于在获得灵兽后随机分配灵兽的天赋信息。

在这里插入图片描述


在这里插入图片描述


这是创建出的表格,里面所有信息都可以在这里直观展示,便于Unity开发过程中实时监测数据变化,可让测试效率大大提高。

在这里插入图片描述


2.编写基础的读取数据脚本ReadTable

该脚本中创建了各种基础的读取数据的方法,如下图:
这里展示了两个示例方法,ReturnItem(int id)和ReturnItem(string name)
用于根据输入的id或是物品名字来返回一个物品对象,用于在某些方法中识别物品。

在这里插入图片描述


3.编写相应存取脚本

加载对应的ScriptableObject,以下代码用于为playerItemTable和packageTable赋值,Resources.Load用于加载对应表,用于存取数据,此时playerItemTable和packageTable就分别对应了玩家背包内的物品表和存储了所有物品详细信息的表。

在这里插入图片描述


AddItem方法:可用于添加一个物品到玩家的背包内,id对应添加的物品id,num对应添加的物品数量。
下列代码中实现的是首先检测背包中是否存在该物品,然后查找到id对应的物品信息存入item对象中,再将物品放入背包中。
如果背包中已经存在该物品,则直接添加该物品在背包中的数量,如果不存在,则创建一个该物品对应的物品对象。
最后,引用SignController的ShowAddItem方法,用于在界面中显示已获取到当前物品。

在这里插入图片描述


在获取任务奖励中的金币后,将在界面上显示获取信息

在这里插入图片描述


以下是一些基础处理方法,获取指定id的物品在玩家背包中的数量,获取整个背包中的物品对象,以及对背包物品根据物品的id进行排序。

在这里插入图片描述


以下是另一种存取方法,首先声明一些需要的变量。

在这里插入图片描述


而后创建一个鼠标点击事件,在点击该按钮后可以执行相应的逻辑,根据ReadTable脚本中的方法,查找点击到的图片属于哪个法术对象,而后进行处理。

在这里插入图片描述


4.实现数据与UI之间的交互

下图是任务界面的UI数据显示,显示当前的任务进度以及详细描述。

在这里插入图片描述


如下是对应代码,代码中的第一个for循环用于在打开该界面时可以清理之前的数据,保证数据的实时性,第二个foreach循环则负责查找TaskTable表中的award数据,及任务奖励,将其依次显示在界面右侧的任务奖励区域。

在这里插入图片描述


如下是更复杂的一个UI数据交互,用于进行NPC的交互,首先进行数据的声明和初始化。

在这里插入图片描述


而后根据NPC的位置和类型进行判断,判断成功则进入该方法,点击F与NPC对话,点击左键执行ShowNextChat方法。

在这里插入图片描述


在这里插入图片描述


下图则是执行对话功能中涉及到的数据交互,先从PlayerData.getNowNPC进行比较,如果id是当前的任务NPC则执行任务剧情相应对话,如果不是则进行该NPC的常规对话。

在这里插入图片描述


背包UI界面中会显示背包中所有物品的信息,在鼠标移入后会显示更加详细的信息

在这里插入图片描述


在这里插入图片描述


灵兽UI界面显示也会显示所有背包中的灵兽,鼠标移入后也会在界面右侧显示对应的灵兽信息。

在这里插入图片描述


二、摄像机和人物移动逻辑与动画逻辑

1.相机移动逻辑

这里我将玩家对象和相机对象看作一个整体,角色对象是图中的Navia,相机对象是图中的Main Camera

在这里插入图片描述


这是整体对象和两个子对象的详细层级结构,分为角色和相机。

在这里插入图片描述


下图是相应的代码实现,mouseX和mouseY分别为鼠标的水平和垂直输入,用于操作鼠标移动相机视角,rotationX是相机的水平移动角度,然后在计算完成垂直移动角度后执行cameraHandle.transform.LoaclRotation = Quaternion......计算出最终的相机视角角度。然后重置相机视角。
float scroll = Input.GetAxis("Mouse ScrollWheel")以下的代码是处理相机与角色距离的代码,在没有任何外力作用下只会根据鼠标滚轮的滚动而变化。

在这里插入图片描述


以下是相应的执行逻辑,第一张图是当前脚本的OnTriggerStay方法,用于判断是否有物体在相机的第一层碰撞体上,第二张图是CameraCollider脚本的方法,用于判断是否有物体在第二层碰撞体上,放置两层碰撞体进行检测是为了可以更流畅的进行视角变化,这样可以在碰撞到物品后自由移动相机距离,最大程度限制相机与地形重叠等问题。

在这里插入图片描述


在这里插入图片描述

2.人物移动逻辑

horizontal与vertical用于获取键盘的横纵向输入,控制人物的前后移动,isSlide用于控制滑铲状态,disableInput用于控制禁止获取输入的状态。

在这里插入图片描述


控制人物攻击部分

在这里插入图片描述


控制灵兽召唤部分

在这里插入图片描述


部分人物控制逻辑的代码,这个是主要的移动逻辑,包括播放不同状态的动画,以及根据相机视角改变人物当前的朝向。

在这里插入图片描述


动画控制逻辑

这里通过动画器来管理动画的状态,我的策略是利用动画器和代码组合进行动画管理,这样就组成了一个大致成型的动画逻辑,下图动画器中的箭头都存放了转变状态需要的条件。

在这里插入图片描述


这是挑选了其中一种灵兽的动画器,灵兽的动画器相较于角色来说更为简单一些,因为灵兽的大部分逻辑偏向于在代码中实现而不是依赖动画器。

在这里插入图片描述

问题总结

1.数据与游戏物体交互时的查找与更新

  • 因为游戏是每帧执行代码,所以一些代码需要尽量避免无意义的循环执行,比如Update方法会在游戏的每一帧调用一次,如果Update中数量过多且计算量过大的话,会给游戏运行带来过多负担,严重影响游戏性能,导致卡顿等问题。所以我在开发过程中花费了很多时间在优化相关代码,减少了大量无意义的逐帧调用,优化游戏性能,提高用户的游戏体验。
  • 方法执行时数据查找时非常容易出现查找错误问题,因为Unity3D存在大量的游戏对象,而且结构复杂,虽然我尽最大努力避免出现结构过于复杂的问题,但是仍然需要仔细的比对和调试,才能精确查找到需要的对象。
  • 动画的调整过于复杂,不仅是对于动画器层面以动画为单位的调整,在调整动画细节上也是非常困难的工作。首先要绑定动画和游戏对象的骨骼,骨骼如果无法匹配则会导致动画错位,以及“骨折”等严重影响游戏体验的现象,而且在不同动画的衔接上,比如从奔跑状态转变到滑铲状态,需要各种复杂工序,调整动画的衔接速度,以及动画的衔接过程,才能保证流畅运行动画。
...全文
99 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

122

社区成员

发帖
与我相关
我的任务
社区描述
FZU-SE
软件工程 高校
社区管理员
  • LinQF39
  • 助教-吴可仪
  • 一杯时间
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧