这是我的第一篇文章,在此处发布之前,我确实对该主题做了很多研究。但是现在我找到了一些可能的解决方案,但我不确定什么是正确的方法。
问题
我们目前正在开发一款本地合作游戏,该游戏是一个适合一个玩家的动作游戏和第二个玩家的益智游戏。我们的实际问题是当前由播放器控制器处理的输入,该输入在收到的每个动作映射委托上都施放,以确定所拥有的Pawn是否来自Playera类型或Playerb,然后调用正确的功能。
让我给你一个具体的例子:
我们有两个针对按钮B(Xbox控制器)的动作绑定,当前称为" B"
当代表被称为时,我们将拥有拥有的玩家来检查它是否称为playera->跳跃或playerb-> blink
我对每次收到输入时都必须施放的情况完全不满意,只是为了检查我拥有的动作/拼图char
解决方案
1)创建2个PlayerControllers,并使用 gamemode :: swapplayercontroller(old,new)
交换它们我在研究过程中找到了此功能,但我不满意使用PlayerControllera创建一个播放器以立即将其切换为使用PlayerControllerb,
2)将责任转移到Charatcer类
另一个想法是,通过将e_button_b(例如e_button_b)从playerController传递到角色的枚举值来将决策制定委托给角色类。我们可以编写一个宏,该宏根据我们的输入映射创建此枚举,然后将决策委托给通用字符 -> processInput(Enumvalue)函数。我也不是很高兴,因为那时PC对我来说并没有太大的意义。
3)缓存拥有的典当,以避免演员
每当PC拥有PAWN时,另一个想法是缓存所拥有的字符的类型。这将摆脱每个输入代表的演员。
我会为Advide和任何暗示您如何在游戏中解决此类问题的任何提示感到非常高兴。我们的主要目标是分离关注,良好的可维护性和投入重新启动。
欢呼,祝您有美好的一天,
parzival
您可以创建这样的结构(用C 编写,但是此方法也可以在蓝图中很容易实现):
class MyGameBasePlayerController : public PlayerController
{
// TODO methods common for both controllers (for example Escape key handling)
}
现在特定的控制器:
class PuzzlePlayerControler : public MyGameBasePlayerController
{
UPROPERTY(BlueprintReadWrite, Transient, Category = "MyCat"
PuzzleCharacter* puzzleChar;
// TODO handle specific actions for Puzzle chararacter and control handling.
// TODO override base methods / input bindings if necesary
virtual void Possess(APawn* pawn) override;
}
ActionPlayerCharacter
。
您需要决定,角色将如何不同。如果它们相同,则可以使用诸如MyGameCharacter : public PlayerCharacter
之类的东西(或者可以使用更广泛的PlayerPawn
),并且您的PlayerControllers
将调用适当的方法。然后,您存储的MyGameCharacter
的引用可以存储在MyGameBasePlayerController
中。
您也可以使用继承,因此您将拥有一些常见的基础实现并扩展方法或使用虚拟方法覆盖的PuzzleCharacter : public MyGameCharacter
和ActionCharacter : MyGameCharacter
。
根据您的最终结构,您可以使用Overriden Possess
方法(UE DOCS)获取实际的PAWN实例,将其施放为适当的类(例如PuzzleCharacter
或PuzlePawn
中的CC_11),然后存储参考以供以后使用。请注意在这种情况下,您也应该实现Unpossess
,以便您可以清除存储的参考并在任何给定情况下正确地行为。