zoukankan      html  css  js  c++  java
  • Unreal Engine 4 C++ 能够创建角色Zoom摄像头(资源)

    游戏摄像头可以观察到的距离越近,作用和拉远是一个比较普遍的要求,UE4它也实现比较简单。

    在这篇文章中TopDown模板案例,解释如何,分步实施能Zoom摄像头。

    创建TopDown模板C++项目达产后,我们去叫3一类重要。AXXXCharacter类,实现角色的控制和行为。

    AXXXGameMode类,项目的默认GameMode。定义默认的角色控制器和默认Pawn。AXXXPlayerController,角色控制器类。接受输入控制,并指导角色进行行动。

    我们主要改动AXXXCharacter类。

    说下Zoom实现的原理。UE4专门为摄影机碰撞实现了一个USpringArmComponent类,它能自己主动处理和摄影机相关的碰撞、缩进等等功能。为了实现Zoom,仅仅须要适当的调节此类的TargetArmLength变量的值就可以。非常easy。

    首先,我们定义Zoom配置參数。

    在XXXCharacter.h文件里增加下列结构体:

    USTRUCT()
    struct FZoomData
    {
    	GENERATED_USTRUCT_BODY()
    
    	UPROPERTY(EditDefaultsOnly, Category = Config)
    	float MinCameraLen;
    
    	UPROPERTY(EditDefaultsOnly, Category = Config)
    	float MaxCameraLen;
    
    	UPROPERTY(EditDefaultsOnly, Category = Config)
    	float ZoomStepLen;
    };
    MinCameraLen。定义摄影机近期距离。MaxCameraLen,定义摄影机最远距离。ZoomStepLen,定义每一小步,Zoom的距离。注意USRUCT()前缀,这个结构体后面在编辑器中能够自己配置。

    第二步。为AXXXCharacter类加入配置參数。

    UPROPERTY(EditDefaultsOnly, Category = Config)
    	FZoomData ZoomConfig;

    第三步。为AXXXCharacter加入成员ZoomIn和ZoomOut方法。这两个方法,详细实现Zoom功能。

    UFUNCTION(BlueprintCallable, Category= Camera)
    	void ZoomIn();
    
    	UFUNCTION(BlueprintCallable, Category = Camera)
    	void ZoomOut();

    第四步,为AXXXCharacter加入重载方法SetupPlayerInputComponent。此方法初始化输入绑定。

    protected:
    	virtual void SetupPlayerInputComponent(class UInputComponent* InputComponent) override;
    


    以下是各个方法的详细实现:

    void AsqxgameCharacter::SetupPlayerInputComponent(class UInputComponent* InputComponent)
    {	
    	check(InputComponent);
    	InputComponent->BindAction("ZoomIn", IE_Pressed, this, &AsqxgameCharacter::ZoomIn);
    	InputComponent->BindAction("ZoomOut", IE_Pressed, this, &AsqxgameCharacter::ZoomOut);
    }
    SetupPlayerInputComponent方法,绑定了两个名为ZoomIn和ZoomOut的动作。这两个动作在编辑器中设置。

    在菜单Edit->Project Settings->Input项目下。

    我将两个动作分别绑定到了Mouse Wheel Up和Mouse Wheel Down两个按键上。


    void AsqxgameCharacter::ZoomIn()
    {
    	if (CameraBoom->TargetArmLength >= ZoomConfig.MinCameraLen)
    	{
    		CameraBoom->TargetArmLength -= ZoomConfig.ZoomStepLen;
    	}
    	else
    	{
    		CameraBoom->TargetArmLength = ZoomConfig.MinCameraLen;
    	}
    }
    
    void AsqxgameCharacter::ZoomOut()
    {
    	if (CameraBoom->TargetArmLength <= ZoomConfig.MaxCameraLen)
    	{
    		CameraBoom->TargetArmLength += ZoomConfig.ZoomStepLen;
    	}
    	else
    	{
    		CameraBoom->TargetArmLength = ZoomConfig.MaxCameraLen;
    	}
    }
    ZoomIn和ZoomOut方法实现非常easy。就不解释了。



    编译代码,并在Character蓝图中设置好ZoomConfig的值。运行游戏,就能看到结果了。


    项目源码:http://git.oschina.net/cloudsource/UE4-Code/tree/master/sqxgame

    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    转:上传图片到服务器文件佳
    RowDataBound 事件的巧妙运用
    对查询数据库中第M到N条记录的思考1
    mysql导入表
    vim向上查找
    stackoverflow太好用了
    【原创翻译】理解python的with语句
    转 Python 实例方法、@staticmethod和@classmethod
    我真的渴望成为一名技术牛人
    今天的囧事,一定要熟练使用git。。
  • 原文地址:https://www.cnblogs.com/yxwkf/p/4851967.html
Copyright © 2011-2022 走看看