在UE里面,我们运行项目可以设置多种网络模式,主要是分为三种:
- 运行Standalone 就是单人模式,没有网络交互
- 以监听服务器运行,在界面里运行的游戏会作为服务器使用
- 以客户端运行,UE会单独运行一个线程作为服务器端,所有的游戏线程都为客户端
接下来,我们要调试之前实现功能在多人玩法下会不会出现问题,我们以上面的方式设置运行,看看会有哪些问题出现。
敌人角色初始化问题
在角色初始时,报了一个错误
在获取角色配置时,无法获取到配置文件,这个配置文件是设置到GameMode上面的。
GameMode内容只运行在服务器端,在客户端是无法获取到其设置的内容,所以会引发对应的报错,所以,我们需要在初始化时,判断是否拥有控制权。
初始化角色属性属于应用GE到角色ASC,应用完成的属性会自动复制到客户端,所以我们初始化敌人时,需要判断一下是否是服务器。
我们可以通过HasAuthority()来判断
在初始化角色属性时,也需要
然后编译查看问题,这个问题看来就解决了。
解决客户端攻击在服务器端显示
我们在客户度攻击敌人时,发现伤害数字并没有在客户端显示,而只是在服务器端上面显示数字,这个问题是在AttributeSet(服务器)调用时,获取到的控制器是服务器的,所以在服务器上播放文字。
我们查看以下代码,我们是通过的UGameplayStatics::GetPlayerController获取的控制器
看函数发现第一个值是获取对象的上下文,我们在服务器端传入的角色对象也是属于服务器端的。
所以,这里我们无法直接使用静态函数去获取,我们可以直接从SourceCharacter上面获取
这样就实现了,在客户端上显示伤害数字
解决在客户端运行时报错行为
接下来,我们切换到单独客户端运行
在运行时会出现错误,经过我检查因为创建的自定义FRPGGameplayEffectContext复制的父类的函数,没有做到统一,所以读取内容时,我们新增的内容无法复制,现在修改后,就没有问题了
然后就是第二个问题,我们在客户端模式下,如果攻击敌人,会发现没有释放出火球,但是自身会减血
推理一下,就是火球术直接攻击了自己,造成了伤害,而没有发射出去。
接下来编译运行,我们发现火球术能顺利发射出去了,但是它也无法和目标产生交互
至于为什么无法和敌人产生碰撞交互,我们暂停,按F8,发现火球术是在敌人头上飞过去的
造成这个的原因是因为,火球术是在法杖的头部发射出去的,并且我们在生成火球时,将火球设置为了水平飞行,所以,火球现在直接在敌人头上飞过。
所以我们把Pitch取消设置为0
现在就没有问题了
处理技能和自身产生碰撞的问题
首先我们看以下Laya里面是如何实现的,它是在蓝图中,忽略了施放者的碰撞体。
经过我测试这种方法只能忽略碰撞,如果是OnComponentBeginOverlap这种还是会触发,经过查询数据需要在触发时进行判断,所以我们需要在创建时,设置好它的触发者
在创建发射物时,设置好释放者,我们设置的是ASC的AvatarActor
接下来在发射物类的Overlay回调函数中,设置判断和触发碰撞的物体是否和释放者一致,这里,我们也不需要用从GE的Context获取,因为之前这是判断发现触发碰撞是,GE里面数据是空的,证明在碰撞时,数据还未设置,所以,我们在初始化时设置的必能够获取到。
获取属性报错信息
在获取属性时,没有设置的SetByCaller会报错
在ExecCalc_Damage里设置的方法获取
我们查看原方法,发现如果第二个值为true才会打印debug,但是不知为何我们没有设置也会报出来,所以,我们直接增加全配置项。
增加两个参数设置,没有了报错
查看了一下没有其它问题,就告一段落。
后面我们将制作敌人的AI。