这是我拆解游戏项目的CameraSystem做出的一点点小总结,然后写了一个非常非常简单的锁定敌人的功能:
第一步:设置敌人属性,标志为可被锁定
创建一个敌人蓝图,随便搞个模型进去
创建一个接口蓝图,设置两个功能函数,一个是被选中,一个是取消选中,用于后期加上敌人被选中时添加一个标记UI。
给敌人蓝图添加刚刚制作的接口
接下来制作一个简单的UI,表明这个敌人被选中了,UI图片可自己随便弄一个,不用图片写几个字也可以。
、接下来给角色添加这个UI,运动下位置,然后设置UI,记住要把Space设置成Screen,UI大小可以按照自己喜好设置。
然后初始化UI为不可见的
然后再在完成接口函数,当被选中就显示,取消选中就隐藏
然后把敌人拖入场景中,这样锁定敌人功能的敌人部分就完成了。
第二部:玩家角色设置
先在项目设置输入中添加一个选中敌人的操作
我这里设置的锁定敌人的键盘操作是tab键,大家可按照自己的需求来设定。
接下来给玩家角色添加基本的变量:一个是bool变量(HasTarget)表示有没有敌人被锁定,另一个是被锁定的敌人的引用(Target)。
然后再创建一个函数,用来寻找我们要锁定的敌人:
这里我只是简单的获取场景中的一个敌人,如果大家的项目中有许多敌人,那么这个函数要大改,如果面对多个敌人(两三个或以上)、或者玩家与敌人之间隔着一道墙之类的障碍物,那么可能要用到检测;当面临多个敌人,到底要锁定哪一个敌人的问题,可能要把能看到的所有敌人保存到一个数组中并判断哪一个是玩家想要锁定的敌人,这个大家可以自行摸索。
接下来再给我们的角色添加三个bool变量用来保存我们的角色旋转方式:
因为当我们锁定敌人和不锁定敌人的时候,玩家的移动方式不一样:锁定敌人的时候,角色是始终面向敌人的,不锁定敌人的时候角色是面向玩家操作的移动方向的,所以我们要用三个bool变量保存角色的rotation方式,来保证锁定敌人时和不锁定敌人时能够顺利的切换角色的移动方式。
接下来创建SaveRotaionMode的函数,来保存我们锁定敌人前的移动方式,给上面创建的三个变量赋值
然后再创建一个RestoreRotaionMode的函数,当我们来加载我们之前保存的移动方式。
接下来创建一个锁定敌人的函数EnableTarget,当我们按下锁定敌人的操作时,我们先回去找敌人(FindTarget函数),当我们找到后,我们在用之前添加的Actor引用(Target)来保存我们的敌人,然后再把HasTarget状态设置成True,表示我们有一个敌人目标,然后用FindTarget返回的BP_Enemy对象引用来调用这个对象的接口函数Selected来显示敌人身上的UI,然后再保存角色当前的移动方式,保存之后在设置成不根据移动来旋转,而是根据我们的Controller的旋转来旋转,最后再忽略我们控制器的LookInput输入。
然后再创建一个DisableTarget的函数,来表示我们取消选中目标,调用Target的Deselect接口功能函数把UI隐藏,再把Target设置为空,设置HasTarget为false表示没有目标,然后加载之前我们没有锁定目标之前的旋转模式,最后打开我们的LookInput输入。
~~最后就是锁定敌人系统的核心,控制器围绕着目标旋转~
创建一个UpdateRotation函数,获取角色的ControlRotation和目标Target到自己的FindLookAtRotation,然后在控制器的Rotation和FindLookAtRotaion之间设置插值让视角转换的更加平滑,最后来设置控制启的Rotation,这样角色就会在之前转换移动旋转方式模式为跟随控制器之后,随着控制器的旋转而旋转。
最后一步:
看图说话
最后给相机添加一点效果:
加上Lag让角色在移动的时候会有一定的滞后效果
真正项目中的相机系统其实很复杂,这里只是实现了锁定,仅供参考。