前言
这是中山大学软件工程学院2024年3D游戏编程与设计的第五次作业
所有项目与代码已上传至gitee当中,欢迎大家访问。
游戏简介
你穿越了,你的身边现在只有无尽的猎物和供你训练箭术的靶场,而你的身体却化为了一把连弩。
游戏玩法
你可以操控角色(连弩)在场景中自由移动,并通过射击靶子和猎物进行得分
游戏界面演示
旁边的企鹅是跟随的宠物。
游戏物体
天气控制器-UI控制:为游戏的控制节点,在游戏中不展示,只挂在控制类型的脚本
Crossbow_Blue:即游戏玩家player,在地图上游走的那把连弩。相机都挂载在上面,用来固定相机和player的相对位置
弩箭袋/生物袋:用来存放在场景中大量生成的物体,射出的弩箭,猎场生成的猎物等。
射击点:用来确定可以射击的位置的中心位置,距离某一个射击点足够近时就可以射击。射击点1挂载Create_prey脚本组件,用于在猎场生成猎物。
各Canvas:UI画布,分别用于绘制瞄准的准星,射击点内时会出现的左上角的得分Point和游戏开始界面。
路牌:进入游戏时,面前指示靶场和猎场位置的文字。
各Target:靶场内的各个靶子
音乐盒:空物体,只用于挂载audio_source组件,播放背景音乐
宠物哥:游戏界面演示第二张右侧的小企鹅,会跟随玩家移动。
脚本详解
本游戏项目的代码被划分为7个板块,每个板块对应一类游戏物体或一种功能的实现,接下来会对每个板块的主要的脚本代码逐个进行讲解。
Camera:
Camera中只有Mouse_look这一个脚本文件。不论是在第一人称还是第三人称射击游戏中,我们都需要实现玩家的视野随着游戏主角(后称player)的移动、抬头低头等动作而平滑地改变。Mouse_look中实现的就是这样的功能。对于射击游戏来说,瞄准和正常状态行走的视野应不同,该功能虽然属于摄像机操作,但逻辑上由游戏主控节点完成,在MainControl's中实现,在后文中会出现。
Mouse_look:
参数如下
FreeLook():
实现了玩家及摄像头随鼠标位置旋转。需要注意的是,只有瞄准状态下,才需要弩有抬头低头的动作,需要y轴方向上的旋转。
Update():
调用FreeLook函数,确保实现能实时随鼠标而移动,同时再次修正摄像头方向,确保摄像头和弩的朝向不会偏移(只起到保险作用,实际上按照FreeLook中的逻辑,如果没有剧烈碰撞等运动导致的偏转,摄像头和弩的朝向不会不同)

set_default_rotation():
用于重置弩的旋转,在需要时调用。
Players:
Player_move:
该脚本中实现了player的移动,player能够在地形上,根据用户输入的wasd进行各个方向的移动。参数如下
Update():
如果玩家按着左shift键,弩将以更快的速度奔跑,如果没有,则以慢速行走。行走的方向由用户在wasd上输入的垂直和水平值共同决定。
Player_shoot:
该脚本控制player的射击逻辑。参数如下
Update():
鼠标左键按下即开始蓄力,用来做蓄力展示的箭设置为active,让玩家能够看见蓄力的进度,松开即射出,同时计算蓄力的总时长,蓄力时长越长,箭的移动速度越快,但是有上限和下限。按下鼠标中键会终止蓄力,让蓄力的程度保持在按下中键时的样子,但如果现在不在可以射击的范围内,这一切都不会发生。
Able_to_shoot:
判断当前player是否在射击点,并处理在射击点和不在射击点时相关的各个属性。参数如下
Update():
判断当前位置和每个射击点的距离,只要在其中一个射击点,就说明可以射击,如果都不在,则不可以射击。在游戏逻辑中,得分只有在射击点内才会显示。所以需要设置是否展示得分(showPoint),AddPoint用于刷新显示得分的text。
Target:
共有两段代码,一段处理Target的属性,一段处理移动靶的运动逻辑
Target_attribute:
靶子的静态属性只有命中它时的得分。
Update():
如果接收到R输入的话,就会清空目前靶子上的箭。
Target_move:
对靶子的静态/移动状态进行切换和处理,参数如下。
Update():
按M键切换移动/静止状态,按H/L(High,Low)调整靶子的移动速度。
Bullet:
bullet中有两个脚本,一个控制弩箭的飞行,一个控制子弹命中物体的事件
Bullet_hit:
参数如下
OnCollisionEnter():
如果碰撞到的是靶子,那就让箭停止移动,作为靶子的子物体停在靶子上(在靶子是移动靶时也能跟随移动)。如果碰撞到的是猎物,就调用猎物被击中的函数。
Bullet_move:
参数如下
Update():
如果现在这跟箭应该移动,就让它被设置的速度向前移动。
Prey:
Prey有四个相关的脚本组件。
Create_prey:
参数如下
Start():
围绕中心点的随机位置生成每个生物,为它们能离开中心点的最大距离赋值。
Is_shooted:
参数如下
is_shooted():
被射中后,在该物体身上生成特效,且生命值-1,若生命值为0,该生物死亡,并生成战利品(掉落物)。
MovementLimiter:
参数如下
Change_direction():
从游戏开始,每过3秒改变一次移动方向。
Update():
如果在规定范围内,就按原方向运动,如果不在,就向区域中心运动。
Award:
Award是Prey被击杀后掉落的战利品,只有被拾取时会用到的Was_picked这一个脚本组件。
Was_picked:
参数如下
Was_picked():
在距离玩家足够近时,该战利品被玩家拾取。玩家得到该战利品的分数,同时战利品被销毁。
Main_control:
Main_control中共有三个脚本组件,分别控制游戏内部逻辑、游戏开始界面逻辑和控制天气。
Main_control:
参数如下
Start():
对游戏进行初始化,包括使用的摄像机和文本的显示。
Change_camera():
在主摄像机和瞄准视角之间切换。
Setting_control:
参数如下
Start_btm_click():
点击开始游戏按钮后,启动游戏,游戏内的所有画布启动,属于开始界面的画布/摄像机禁用。
至此,该游戏项目的主要逻辑功能的代码便已经完成。