Unreal教学(7)——控制玩家相机(Player-Controlled Cameras)
来源:互联网 发布:怎么导入mysql数据库 编辑:程序博客网 时间:2024/06/14 16:05
下面这个设置好像只有一个有作用,无法同时控制两个物体。
//Take control of the default Player AutoPossessPlayer = EAutoReceiveInput::Player0;
这个程序是让物体附加一个相机,应该移动和视图都是针对物体的,和之前的Game-Controlled Cameras还是有区别的,Game-Controlled Camera没有依附特定的物体,直接写在程序的两个变量上进行控制,而这个例子使用的是UCameraComponent,attach到根节点。
放上代码,和之前的例子没有什么区别,那么这个C++ Programming Tutorials中的七个例子还剩下两个例子,First Person Shooter Tutorial和User Interface With UMG.这两个例子暂时先不写,已经能写基本的程序,需要弄清楚它们的类是干什么的。很明显的tutorial上有个错误是编译不过的,但是自己参考API修改过来了。
Performing 3 actions (4 in parallel)@progress 'Compiling C++ source code...' 0%[2/3] Compile PawnWithCamera.cpp[1/3] Compile PawnWithCamera.gen.cpp/home/wang/Documents/Unreal Projects/UnrealLearn/Source/UnrealLearn/PawnWithCamera.cpp:75:43: error: no member named 'SafeNormal' in 'FVector2D' MovementInput = MovementInput.SafeNormal() * 100.0f; ~~~~~~~~~~~~~ ^1 error generated.@progress 'Compiling C++ source code...' 25%@progress 'Compiling C++ source code...' 50%@progress 'Compiling C++ source code...' 75%
可以看到编译的时候SafeNormal编译提示上说FVector2D没有这个方法,所以查看Document发现应该使用GetSafeNormal(),所以会查阅还是很重要的,之前就有很多的头文件都是通过查找获取来的,这点官网还做得比较好,附上代码。
PawnWithCamera.h
// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"#include "GameFramework/Pawn.h"#include "GameFramework/SpringArmComponent.h"#include "Camera/CameraComponent.h"#include "PawnWithCamera.generated.h"UCLASS()class UNREALLEARN_API APawnWithCamera : public APawn{GENERATED_BODY()public:// Sets default values for this pawn's propertiesAPawnWithCamera();protected:// Called when the game starts or when spawnedvirtual void BeginPlay() override;public:// Called every framevirtual void Tick(float DeltaTime) override;// Called to bind functionality to inputvirtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;protected: UPROPERTY(EditAnywhere) USpringArmComponent* OurCameraSpringArm; UCameraComponent* OurCamera;//Input variables FVector2D MovementInput; FVector2D CameraInput; float ZoomFactor; bool bZoomingIn; //Input functions void MoveForward(float AxisValue); void MoveRight(float AxisValue); void PitchCamera(float AxisValue); void YawCamera(float AxisValue); void ZoomIn(); void ZoomOut();};PawnWithCamera.cpp
// Fill out your copyright notice in the Description page of Project Settings.#include "PawnWithCamera.h"// Sets default valuesAPawnWithCamera::APawnWithCamera(){ // Set this pawn to call Tick() every frame. You can turn this off to improve performance if you don't need it.PrimaryActorTick.bCanEverTick = true;//Create our components RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("RootComponent")); OurCameraSpringArm = CreateDefaultSubobject<USpringArmComponent>(TEXT("CameraSpringArm")); OurCameraSpringArm->SetupAttachment(RootComponent); OurCameraSpringArm->SetRelativeLocationAndRotation(FVector(0.0f, 0.0f, 50.0f), FRotator(-60.0f, 0.0f, 0.0f)); OurCameraSpringArm->TargetArmLength = 400.f; OurCameraSpringArm->bEnableCameraLag = true; OurCameraSpringArm->CameraLagSpeed = 3.0f; OurCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("GameCamera")); OurCamera->SetupAttachment(OurCameraSpringArm, USpringArmComponent::SocketName); //Take control of the default Player AutoPossessPlayer = EAutoReceiveInput::Player0;}// Called when the game starts or when spawnedvoid APawnWithCamera::BeginPlay(){Super::BeginPlay();}// Called every framevoid APawnWithCamera::Tick(float DeltaTime){Super::Tick(DeltaTime);//Zoom in if ZoomIn button is down, zoom back out if it's not { if (bZoomingIn) { ZoomFactor += DeltaTime / 0.5f; //Zoom in over half a second } else { ZoomFactor -= DeltaTime / 0.25f; //Zoom out over a quarter of a second } ZoomFactor = FMath::Clamp<float>(ZoomFactor, 0.0f, 1.0f); //Blend our camera's FOV and our SpringArm's length based on ZoomFactor OurCamera->FieldOfView = FMath::Lerp<float>(90.0f, 60.0f, ZoomFactor); OurCameraSpringArm->TargetArmLength = FMath::Lerp<float>(400.0f, 300.0f, ZoomFactor); } //Rotate our actor's yaw, which will turn our camera because we're attached to it { FRotator NewRotation = GetActorRotation(); NewRotation.Yaw += CameraInput.X; SetActorRotation(NewRotation); } //Rotate our camera's pitch, but limit it so we're always looking downward { FRotator NewRotation = OurCameraSpringArm->GetComponentRotation(); NewRotation.Pitch = FMath::Clamp(NewRotation.Pitch + CameraInput.Y, -80.0f, -15.0f); OurCameraSpringArm->SetWorldRotation(NewRotation); } //Handle movement based on our "MoveX" and "MoveY" axes { if (!MovementInput.IsZero()) { //Scale our movement input axis values by 100 units per second MovementInput = MovementInput.GetSafeNormal() * 100.0f; FVector NewLocation = GetActorLocation(); NewLocation += GetActorForwardVector() * MovementInput.X * DeltaTime; NewLocation += GetActorRightVector() * MovementInput.Y * DeltaTime; SetActorLocation(NewLocation); } }}// Called to bind functionality to inputvoid APawnWithCamera::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent){Super::SetupPlayerInputComponent(PlayerInputComponent);//Hook up events for "ZoomIn" InputComponent->BindAction("ZoomIn", IE_Pressed, this, &APawnWithCamera::ZoomIn); InputComponent->BindAction("ZoomIn", IE_Released, this, &APawnWithCamera::ZoomOut); //Hook up every-frame handling for our four axes InputComponent->BindAxis("MoveForward", this, &APawnWithCamera::MoveForward); InputComponent->BindAxis("MoveRight", this, &APawnWithCamera::MoveRight); InputComponent->BindAxis("CameraPitch", this, &APawnWithCamera::PitchCamera); InputComponent->BindAxis("CameraYaw", this, &APawnWithCamera::YawCamera);}//Input functionsvoid APawnWithCamera::MoveForward(float AxisValue){ MovementInput.X = FMath::Clamp<float>(AxisValue, -1.0f, 1.0f);}void APawnWithCamera::MoveRight(float AxisValue){ MovementInput.Y = FMath::Clamp<float>(AxisValue, -1.0f, 1.0f);}void APawnWithCamera::PitchCamera(float AxisValue){ CameraInput.Y = AxisValue;}void APawnWithCamera::YawCamera(float AxisValue){ CameraInput.X = AxisValue;}void APawnWithCamera::ZoomIn(){ bZoomingIn = true;}void APawnWithCamera::ZoomOut(){ bZoomingIn = false;}
阅读全文
0 0
- Unreal教学(7)——控制玩家相机(Player-Controlled Cameras)
- Unreal教学(3)——游戏相机控制(Game-Controlled Cameras)
- Unreal教学(6)——玩家输入和Pawn(Player Input and Pawns)
- Unreal教学(12)——增加玩家的能力(Enhancing Player Abilities)
- Unreal教学(1)——序言
- Unreal教学(10)——放置Actor (Placing Actors)
- Unreal教学(9)——虚幻引擎名词解释(Unreal Engine 4 Terminology)
- Unreal教学(2)——快速开发程序(Programming Quick Start)
- Unreal教学(4)——组件和碰撞(Components and Collision)
- Unreal教学(5)——变量,时间,事件(Variables, Timers, and Events)
- Unreal教学(8)——蓝图学习快速开始(Blueprints Quick Start Guide)
- Unreal教学(11)——物体交互(Object Interaction with Blueprints)
- Unreal教学(13)——创建界面(Creating Screen UI Elements)
- 【Unet】Unet 产生不同玩家( Spawning different player prefabs)
- OpenCV —— Calling Cameras
- unreal engine pawn controlled spring arm camera
- 对于RGB-D相机,视觉密集型下的SLAM算法(Dense Visual SLAM for RGB-D Cameras)
- Futaba S-BUS controlled by mbed(使用mbed控制Futaba S-BUS)
- mysql聚集索引的优缺点
- 阿联酋,一起现场看球(阿里云99积分起抢兑FIFA世俱杯门票)
- MFC编程里面的m_time=-1
- 达内课程-异常Exception
- 重写Oracle的wm_concat函数,以自定义分隔符、排序
- Unreal教学(7)——控制玩家相机(Player-Controlled Cameras)
- INDEX SKIP SCAN 和 INDEX RANGE SCAN
- JS——计算属性
- windows 下安装nodejs
- Qt数据库事务操作
- Bounding-box_regression详解
- 移动端上拉加载demo
- 判断是否为平方数之和-LintCode
- Java