Actor是UE引擎中的一个类。类中可以包含很多类型的东西,这些东西可以是类的对象,也可以是组件的对象。
ActorComponent就是为Actor类添加更多自定义功能的组件。它仅仅针对的是Actor类及其派生类的对象。你可以为这个组件设置很多你想要的属性和功能,当Actor类的对象挂载了这个组件的时候,这个Actor类就拥有了这个组件的功能,好比擎天柱拥有了天火的翅膀,从而实现了飞翔的功能一样。
SceneComponent是ActorComponent组件的派生类型,它比ActorComponent组件多拥有了Transform的功能,而且它并不会被渲染出来,意思就是好比在你家里搭建了一个舞台,一个看不见的舞台,所有的活动必须在这个舞台里。家就是Actor,舞台就是SceneComponent,而所有参与演出的乐器和演职人员都必须在SceneComponent里,SceneComponent就如同一个玻璃盒子,把它们都装了起来。
现在,利用SceneComponent完成旋转组件的编写
效果图:
头文件:
1 // Fill out your copyright notice in the Description page of Project Settings.
2
3 #pragma once
4
5 #include "CoreMinimal.h"
6 #include "Components/SceneComponent.h"
7 #include "MyRotationComponent.generated.h"
8
9
10 UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) )
11 class MYPROJECT5_API UMyRotationComponent : public USceneComponent
12 {
13 GENERATED_BODY()
14
15 public:
16 // Sets default values for this component's properties
17 UMyRotationComponent(); 18 19 protected: 20 // Called when the game starts 21 virtual void BeginPlay() override; 22 23 public: 24 // Called every frame 25 virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override; 26 27 public: 28 UPROPERTY() 29 float orbitDistance; 30 UPROPERTY() 31 float currentValue; 32 UPROPERTY() 33 float offsetSpeed; 34 };
源文件:
1 // Fill out your copyright notice in the Description page of Project Settings.
2
3
4 #include "MyRotationComponent.h"
5
6 // Sets default values for this component's properties
7 UMyRotationComponent::UMyRotationComponent()
8 {
9 // Set this component to be initialized when the game starts, and to be ticked every frame. You can turn these features
10 // off to improve performance if you don't need them.
11 PrimaryComponentTick.bCanEverTick = true;
12
13 orbitDistance = 200.0f;
14 currentValue = 0.0f;
15 offsetSpeed = 50.0f; 16 } 17 18 19 // Called when the game starts 20 void UMyRotationComponent::BeginPlay() 21 { 22 Super::BeginPlay(); 23 24 } 25 26 27 // Called every frame 28 void UMyRotationComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) 29 { 30 Super::TickComponent(DeltaTime, TickType, ThisTickFunction); 31 32 float radians = FMath::DegreesToRadians(currentValue); 33 34 SetRelativeLocation(FVector(orbitDistance * FMath::Cos(radians), orbitDistance * FMath::Sin(radians),RelativeLocation.Z)); 35 36 FVector dir_normal = RelativeLocation.GetSafeNormal(); 37 FRotator rot = dir_normal.Rotation(); 38 39 SetRelativeRotation(rot); 40 41 currentValue = FMath::Fmod(currentValue + (DeltaTime * offsetSpeed),360); 42 }
这里需要说明的是,你运行所看到的旋转,是SceneComponent组件在相对Actor对象的旋转,两个物体并没有发生自转。
1 FVector dir_normal = RelativeLocation.GetSafeNormal();
2 FRotator rot = dir_normal.Rotation();
第一行代码中的GetSafeNormal()方法是用来将相对位置向量进行单位化。
第一行代码中的Rotation()方法可以理解为将向量的数据作为旋转的数据,且将Roll方向的旋转设置为0。
1 currentValue = FMath::Fmod(currentValue + (DeltaTime * offsetSpeed),360);
这一句话的意思是将不断变化的角度数值与360度进行取模操作,可有让它们顺利的、圆滑的不停旋转。