ue4 总结十二

一、PlayAnimMontage时候有时要延迟0.5秒才有效,查看是否关闭这些(多播调用)

角色->GetMesh()->SetSimulatePhysics(false);
角色->GetMovementComponent()->SetActive(false);

二、角色AttachComponent的时候,必须通过mesh来绑定,角色绑定没效果

角色->GetMesh()->AttachToComponent(StaticMeshComponent, FAttachmentTransformRules::SnapToTargetNotIncludingScale, FName("Socket1"));

三、某个类触发一个函数,但此时有些值还没有拿到,那是在spawnActor时候没有初始化该变量,BeginDeferredActorSpawnFromClass,该函数可以在生成actor时,调用该类自定义的初始化函数,再FinishSpawn,完成生成

AActor* LavaActor = UGameplayStatics::BeginDeferredActorSpawnFromClass(this, *TSmelterLavaSubClass, LavaTransform, ESpawnActorCollisionHandlingMethod::AlwaysSpawn);
//传入是谁打倒的熔炉
Cast<AGOASmelterLava>(LavaActor)->GetInstigatorAgladitor(CurrentInstigateActor, CurrentInstigatePlayerController);
LavaActor->FinishSpawning(LavaTransform);

四、BlueprintSpawnableComponent关键字用于在类中的宏定义,让蓝图中可以添加组件

UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) )
class GOA_DEV_API UItemMgrStaticComp : public UActorComponent

五、蓝图调试:

1、在一断点处右键->查看此数值

在断点或游戏进行中时,如果变量变化,就会显示该值

2、在蓝图->调试中可以断开所有断点

3、ZOrder

如果三张图片或按钮放在同一层级,那么有可能一张图片把另一张按钮的点击事件禁用,原因是ZOrder都为0

解决方法:

将按钮的ZOrder改大点

4、对于UI界面的每个控件的属性设置,一定要注意关系

比如设置button的大小,该属性在子类Canvas panel Slot中,

在蓝图中拿到button后,再去拿Slot,再去设置大小

5、

    UFUNCTION(BlueprintImplementableEvent)
        void AddAchievementImage(FString InUid);

上面这样写编译错误,必须下面这样写才能编译过

    UFUNCTION(BlueprintImplementableEvent)
        void AddAchievementImage(const FString& InUid);

6、在UserWidget中通过getAllActorOfClass拿到所有的playerController,只能拿到一个自己的,其他人拿不到,但是拿所有的PlayerState可以拿到全部的

7、遇到一个问题,如果游戏里创建了两个角色,在客户端能控制player移动但是PlayerState中拿到的却是两个ROLE_SimulatedProxy,解决方法,通过GetOwner判断是否为空,为空就是ROLE_SimulatedProxy否则就是ROLE_AutonomousProxy

8、Sequence的执行顺序

执行顺序是从上到下,但是只是调用了从上到下的事件启动,而不会等到事件0执行完成之后再执行事件1 

摘自:https://blog.csdn.net/tianxiaojie_blog/article/details/78277560?utm_source=blogxgwz4

9、Lambda函数

下面举了几个Lambda函数的例子:      

[](int x, int y) { return x + y; } // 隐式返回类型
[](int& x) { ++x; }   // 没有return语句 -> lambda 函数的返回类型是'void'
[]() { ++global_x; }  // 没有参数,仅访问某个全局变量
[]{ ++global_x; }     // 与上一个相同,省略了()

可以像下面这样显示指定返回类型:  

[](int x, int y) -> int { int z = x + y; return z; }

10、获取所有某个类型的对象

// 将找到当前所有的 UObjects 实例
for (TObjectIterator<UObject> It; It; ++It)
{
    UObject* CurrentObject = *It;
    UE_LOG(LogTemp, Log, TEXT("Found UObject named:%s"), *CurrentObject.GetName());
}

如果是获取所有的特效对象(不仅仅是游戏场景中的,还包括编辑器中的)就把UObject类型改成特效类型

Actor 迭代器与对象迭代器的工作方式非常相近,但只能用于派生自 AActor 的对象。Actor 迭代器不存在下列问题,只返回当前游戏世界实例使用的对象。

创建 actor 迭代器时,需要为其赋予一个指向 UWorld 实例的指针。许多 UObject 类(如 APlayerController)会提供 GetWorld 方法,助您一臂之力。如不确定,可在 UObject 上检查 ImplementsGetWorld 方法,确认其是否应用 GetWorld 方法。

APlayerController* MyPC = GetMyPlayerControllerFromSomewhere();
UWorld* World = MyPC->GetWorld();

// 和对象迭代器一样,您可提供一个特定类,只获取为该类的对象
// 或从该类派生的对象
for (TActorIterator<AEnemy> It(World); It; ++It)
{
    // ...
}

另一种通过GetAllActorsOfClass获取所有对象的方法:

 TArray<AActor*> allPlayerState;
 UGameplayStatics::GetAllActorsOfClass(this, PlayerState::StaticClass(), allPlayerState);

        for (int i = 0; i < allPlayerState.Num(); i++)
        {
            if (IsValid(allPlayerState[i]))
            {
                PlayerState* playerstate = Cast<PlayerState>(allPlayerState[i]);
                if (IsValid(playerstate))
                {

                }
            }
        }

综合来看,还是通过迭代器获取更好,同时迭代器也能获取UObject类型的对象

11、IsPendingKill()

已在自身上调用 Destroy() 的 actor 在垃圾回收器再次运行之前不会被移除。您可检查 IsPendingKill() 方法,确定 UObject 正等待被删除。如方法返回 true,则应将对象视为废弃物,不进行使用。

12、c++这样暴露出结构体指针数组给蓝图

    UFUNCTION(BlueprintCallable)
        TArray<const FSlateBrush*> GetAllStaticMesh();

会报错,Inappropriate '*' on variable of type 'FSlateBrush', cannot have an exposed pointer to this type.

解决方法:

把FSlateBrush的信息复制给一个新的FSlateBrush,返回这个

13、T const&与T &的区别

T const&与T &的区别是一个加了常量限定符,一个没加,也相应的一个是常引用,不能修改其值,一个为引用,可以修改值。
如果返回值是常引用,说明不能把返回值作为左值,也就是

a.top() = 10;//如果a 为常对象,这句是非法的

如果返回值是引用,就可以作为左值:

a.top() = 10; //如果a 不是常对象,这句把a的data_[top_-1]修改为10了;

14、在ue4中cameraActor这种命名,意思就是把一个组件放到一个actor里面,把CameraComponent放到一个Actor中,其作用是这个Actor可以放到Level(场景)中,类似的很多,比如CubeActor就是建一个actor,里面放一个staticmeshComponent,其mesh是个Cube

15、UActorComponent中有个虚函数TickComponent,用于每帧都更新数据,相当于ActorComponent的心跳

/**
     * Function called every frame on this ActorComponent. Override this function to implement custom logic to be executed every frame.
     * Only executes if the component is registered, and also PrimaryComponentTick.bCanEverTick must be set to true.
     *    
     * @param DeltaTime - The time since the last tick.
     * @param TickType - The kind of tick this is, for example, are we paused, or 'simulating' in the editor
     * @param ThisTickFunction - Internal tick function struct that caused this to run
     */
    virtual void TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction *ThisTickFunction);
    

16、远程投掷物的反弹效果

void AGladiator::GladiatorBackRemoteWeapon(FVector location, AActor* RemoteActor)
{
    FActorSpawnParameters f;
    f.Instigator = this;

    AActor* TargetActor;
    UGOAProjectileMovementCom*  ProjectileMovement =nullptr;
    if (Cast<AStone>(RemoteActor))
    {
        TargetActor = GetWorld()->SpawnActor<AStone>(Cast<AStone>(RemoteActor)->GetClass(), location, RemoteActor->GetActorRotation(), f);
        ProjectileMovement = Cast<AStone>(TargetActor)->ProjectileMovement;
    }
    if (Cast<AProjectileWeaponBase>(RemoteActor))
    {
        TargetActor = GetWorld()->SpawnActor<AProjectileWeaponBase>(BP_ProjectileWeaponBase, location, RemoteActor->GetActorRotation(), f);
        ProjectileMovement = Cast<AProjectileWeaponBase>(TargetActor)->ProjectileMovement;
    }
    //计算随机反弹速度
    FVector LauncherVeloctiy = ProjectileMovement->Velocity;
    LauncherVeloctiy.Normalize();
    float randomFloat = UKismetMathLibrary::RandomFloatInRange(-200, 200);
    FVector LauncherBackVeloctity = FVector(-LauncherVeloctiy.X * 600 + randomFloat, -LauncherVeloctiy.Y * 600 - randomFloat, 0);

    ProjectileMovement->Activate(true);
    //设置反弹速度
    ProjectileMovement->InitialSpeed = 600;
    ProjectileMovement->SetVelocityInLocalSpace(LauncherBackVeloctity);
    //UKismetSystemLibrary::PrintString(this, UKismetStringLibrary::Conv_VectorToString(LauncherBackVeloctity));
    //UKismetSystemLibrary::PrintString(this, UKismetStringLibrary::Conv_VectorToString(TargetActor->ProjectileMovement->Velocity));

}


在weaponBase中
        Cast<AGladiator>(OtherActor)->GladiatorBackRemoteWeapon(Hit.Location,this);

17:、另一种for循环

    for (ASpawnCage* TempCage : Cages)
    {
       if (IsValid(TempCage)&&TempCage->GroupNumber == GroupID && TempCage->GetCanRaise())
              {
                 return TempCage;
              }
          }
    }


18

鼠标左摇杆,它有个内圈和外圈的区别,如果摇杆摇到内圈,那么没有反应,也叫Dead Zone,如果摇到外圈,就会有移动反应

在项目设置->input中这个内圈不反应的区域叫做Dead Zone,第二个Sensitivity是灵敏度,乘以一倍的移动速度,如果没有内圈的概念,只要摇杆动就反应,把Dead Zone设为0

19 

Spring Arm Component (弹簧臂组件)

弹簧臂组件会努力与其子对象之间保持一个固定距离,但如果发生碰撞,就会使子对象收回,如果没有碰撞,则使之发生回弹。通常,弹簧臂组件用作“摄像机摇臂”,可防止玩家的跟拍摄像机在游戏时间中发生碰撞(没有弹簧臂组件,则摄像机组件将保持指定的固定距离,无论是可能会挡住它去路的对象,还是它所跟随的对象)

您可在弹簧臂组件上调节多个摄像机相关属性,比如 TargetArmLength(该属性是不存在碰撞时的弹簧臂自然长度),Probe Size(该属性用于设置检查碰撞时探头的尺寸),以及 CameraLag(当您想要让摄像机稍稍滞后于其所跟随的对象时,该属性很有用)。

灯光组件

不同类型的 Light Components 可将光照添加为 Actor 的子对象,取决于您想要实现的效果。无论您选择哪种灯光组件类型,都有一些总体灯光设置(灯光颜色或强度)或单独设置(参见各独立灯光的特定设置)可供调节。

Directional Light Component (方向性灯光组件)

DirectionalLightComponent 模拟了从无穷远的光源发射出的灯光。这也就是说,这种灯光所投射的所有阴影都是平行的,使其成为模拟阳光的最佳选择。

Point Light Component (点灯光组件)

PointLightComponent 感觉上很像是现实世界中的灯泡,从灯泡的钨丝向着所有方向发射灯光。但是,为了提高运行性能,点光源组件被简化了,只从空间中的一个点均匀地向所有方向发射光线。

Sky Light Component (天空灯光组件)

SkyLightComponents 用于捕捉关卡中的远距离物体(距离大于 SkyDistanceThreshold 的所有物体),并将其作为灯光应用到场景中。这也就是说,天空的外观及其光线/反射将匹配。

Spot Light Component (射光圈组件)

SpotLightComponent 从锥形的单点发射出方向性光线。有一些设置可调节内锥角和外锥角,另外还有一些其他类型的光线设置,如强度、光线颜色和阴影设置。这种光线很适合作为手电筒,因为它可以定义内/外锥角半径。

Physics Constraint Component (物理约束组件)

PhysicsConstraintComponent 是一种能连接两个刚性物体的接合点。您可以借助该组件的各类参数来创建不同类型的接合点。

通过使用一个 PhysicsConstraintComponent 和两个 StaticMeshComponents,您可以创建悬摆型对象,如秋千、重沙袋或标牌,它们可以对世界中的物理作用做出响应,让玩家与组件进行互动(请参见 物理约束组件用户指南 了解基于 Blueprints 的相关示例)。

Physics Handle Component (物理句柄组件)

PhysicsHandleComponent 用于“抓取”和移动物理对象,同时让您抓取的对象继续使用物理效果。这样的例子可能以“重力枪”的形式存在,此时您可以拾取和掉落物理对象(参见 Physics Content Examples 了解详细信息)。

Radial Force Component (径向力组件)

RadialForceComponent 用于发出径向力或脉冲来影响物理对象或可摧毁对象。与 PhysicsThrusterComponent 不同,这类组件会施加“发射后不用管”类型的作用力,而且并不持续。

您可以使用这类组件来推动被摧毁对象(如爆炸物)的碎片。使用 RadialForceComponent 指定作用力和方向,当对象被摧毁时,您可以像下面的图示那样,沿着特定方向将碎片向外“推”(参见 Destructibles Content Examples 了解详细信息)。

Physics Thruster Component (物理推进器组件)

PhysicsThrusterComponent 适用于沿着 X 轴负方向施加特定物理作用力的对象(例如,您所推动的方向上的 X 点)。推力组件使用连续作用力,而且能通过脚本来自动激活、一般激活或取消激活。

关于推力组件的示例可能以火箭(见下图)的形式出现,它将持续施加作用力将火箭向上推(因为推力部分位于火箭下方)。通过使用 Blocking Volumes,您可以牵制一些受推力影响的组件动作。

缆绳组件(Cable Component)

以较低的开销添加来回晃荡的缆绳、绳索或链条(类似被风吹动的效果)后,虚幻引擎 4(UE4)项目中便会拥有更加生动的效果。在以下文档中,我们将了解如何使用 缆绳组件(Cable Component) 插件创建、设置和控制缆绳的外观、响应,甚至使其和关卡中的物体发生碰撞。

猜你喜欢

转载自blog.csdn.net/zhangxiaofan666/article/details/83789334