CARLA
 
载入中...
搜索中...
未找到
BaseVegetationActor.cpp
浏览该文件的文档.
1// Copyright (c) 2022 Computer Vision Center (CVC) at the Universitat Autonoma
2// de Barcelona (UAB).
3//
4// This work is licensed under the terms of the MIT license.
5// For a copy, see <https://opensource.org/licenses/MIT>.
6
8#include "Carla/Carla.h"
9
10// ABaseVegetationActor类的成员函数BeginPlay,重写了UE4中Actor类的BeginPlay函数,在游戏开始时执行初始化相关操作,同时记录性能分析事件便于后续性能分析。
12{
13 // 使用TRACE_CPUPROFILER_EVENT_SCOPE宏(应该是用于性能分析的工具,用于标记一个代码块的开始,方便统计该函数执行过程中的CPU使用等性能相关数据),
14 // 这里标记了ABaseVegetationActor::BeginPlay函数的执行范围,括号内传入函数名称作为标识,方便在性能分析工具中查看该函数相关的性能情况。
15 TRACE_CPUPROFILER_EVENT_SCOPE(ABaseVegetationActor::BeginPlay);
16 // 调用父类的BeginPlay函数,确保先执行父类中已有的初始化逻辑,这是在UE4等游戏开发框架中重写函数时的常见做法,以保证继承链上的功能完整性。
17 Super::BeginPlay();
18}
19
20// ABaseVegetationActor类的成员函数GetParametersFromComponent,用于从USpringBasedVegetationComponent组件中获取各种参数,并复制到SpringParameters结构体中。
22{
23 // 使用GetComponentByClass函数(UE4中Actor类提供的用于获取指定类型组件的函数),尝试获取当前Actor上类型为USpringBasedVegetationComponent的组件,
24 // 返回一个通用的UActorComponent类型指针,后续需要进一步转换为具体的USpringBasedVegetationComponent类型才能使用其特有的属性和函数。
25 UActorComponent* Component =
26 GetComponentByClass(USpringBasedVegetationComponent::StaticClass());
27 // 使用Cast函数(UE4中的类型转换函数,进行安全的向下转型,确保转换的类型是正确的)将获取到的通用组件指针Component转换为USpringBasedVegetationComponent类型指针,
28 // 如果转换成功,SpringComponent指针将指向对应的组件实例,方便后续操作该组件的属性;如果转换失败(组件不存在或者类型不匹配),则SpringComponent为nullptr。
29 USpringBasedVegetationComponent* SpringComponent =
30 Cast<USpringBasedVegetationComponent>(Component);
31
32 // 判断SpringComponent是否为nullptr,即是否成功获取并转换到对应的组件实例,如果为nullptr,说明没有找到指定类型的组件。
33 if (!SpringComponent)
34 {
35 // 使用UE_LOG宏输出错误日志,日志分类为LogCarla,错误级别为Error,日志内容为提示文本"ABaseVegetationActor::GetParametersFromComponent Component not found",
36 // 用于在开发过程中方便排查组件获取失败的问题,告知开发者找不到对应的组件,无法进行参数获取操作,然后直接返回,不再执行后续代码。
37 UE_LOG(LogCarla, Error,
38 TEXT("ABaseVegetationActor::GetParametersFromComponent Component not found"));
39 return;
40 }
41
42 // 将SpringComponent组件的Beta属性值复制到SpringParameters结构体的Beta成员变量中,实现参数的获取和赋值操作,以下类似的代码行都是依次将组件的各个参数复制到结构体对应成员中。
43 SpringParameters.Beta = SpringComponent->Beta;
44 SpringParameters.Alpha = SpringComponent->Alpha;
45 SpringParameters.Gravity = SpringComponent->Gravity;
46 SpringParameters.BaseSpringStrength = SpringComponent->BaseSpringStrength;
47 SpringParameters.MinSpringStrength = SpringComponent->MinSpringStrength;
48 SpringParameters.HorizontalFallof = SpringComponent->HorizontalFallof;
49 SpringParameters.VerticalFallof = SpringComponent->VerticalFallof;
50 SpringParameters.RestFactor = SpringComponent->RestFactor;
51 SpringParameters.DeltaTimeOverride = SpringComponent->DeltaTimeOverride;
52 SpringParameters.CollisionForceParameter = SpringComponent->CollisionForceParameter;
53 SpringParameters.CollisionForceMinVel = SpringComponent->CollisionForceMinVel;
54 SpringParameters.ForceDistanceFalloffExponent = SpringComponent->ForceDistanceFalloffExponent;
55 SpringParameters.ForceMaxDistance = SpringComponent->ForceMaxDistance;
56 SpringParameters.MinForceFactor = SpringComponent->MinForceFactor;
57 SpringParameters.LineTraceMaxDistance = SpringComponent->LineTraceMaxDistance;
58 SpringParameters.CapsuleRadius = SpringComponent->CapsuleRadius;
59 SpringParameters.MinBoneLength = SpringComponent->MinBoneLength;
60 SpringParameters.SpringStrengthMulFactor = SpringComponent->SpringStrengthMulFactor;
61 SpringParameters.VehicleCenterZOffset = SpringComponent->VehicleCenterZOffset;
62 SpringParameters.Skeleton = SpringComponent->Skeleton;
63 SpringParameters.bAutoComputeStrength = SpringComponent->bAutoComputeStrength;
64
65 // 使用UE_LOG宏输出普通日志,日志分类为LogCarla,日志级别为Log(一般用于记录正常的操作信息),日志内容为提示文本"ABaseVegetationActor::GetParametersFromComponent Copy successful",
66 // 告知开发者参数复制操作成功完成,方便在开发过程中了解函数执行情况。
67 UE_LOG(LogCarla, Log,
68 TEXT("ABaseVegetationActor::GetParametersFromComponent Copy successful"));
69}
70
71// ABaseVegetationActor类的成员函数SetParametersToComponent,用于将SpringParameters结构体中的各个参数设置到USpringBasedVegetationComponent组件中,实现参数的反向赋值。
73{
74 // 与GetParametersFromComponent函数中类似的操作,先使用GetComponentByClass函数获取当前Actor上类型为USpringBasedVegetationComponent的组件,返回通用的UActorComponent类型指针。
75 UActorComponent* Component =
76 GetComponentByClass(USpringBasedVegetationComponent::StaticClass());
77 // 再使用Cast函数将获取到的通用组件指针转换为USpringBasedVegetationComponent类型指针,方便后续操作该组件的属性,如果转换失败则SpringComponent为nullptr。
78 USpringBasedVegetationComponent* SpringComponent =
79 Cast<USpringBasedVegetationComponent>(Component);
80 // 判断SpringComponent是否为nullptr,如果为nullptr,说明没有找到指定类型的组件,无法进行参数设置操作。
81 if (!SpringComponent)
82 {
83 // 使用UE_LOG宏输出错误日志,日志分类为LogCarla,错误级别为Error,日志内容为提示文本"ABaseVegetationActor::SetParametersToComponent Component not found",
84 // 用于告知开发者找不到对应的组件,然后直接返回,不再执行后续代码。
85 UE_LOG(LogCarla, Error, TEXT("ABaseVegetationActor::SetParametersToComponent Component not found"));
86 return;
87 }
88
89 // 将SpringParameters结构体的Beta成员变量的值设置到SpringComponent组件的Beta属性中,以下类似的代码行都是依次将结构体中的各个参数设置到组件对应属性中,实现参数的传递和更新。
90 SpringComponent->Beta = SpringParameters.Beta;
91 SpringComponent->Alpha = SpringParameters.Alpha;
92 SpringComponent->Gravity = SpringParameters.Gravity;
93 SpringComponent->BaseSpringStrength = SpringParameters.BaseSpringStrength;
94 SpringComponent->MinSpringStrength = SpringParameters.MinSpringStrength;
95 SpringComponent->HorizontalFallof = SpringParameters.HorizontalFallof;
96 SpringComponent->VerticalFallof = SpringParameters.VerticalFallof;
97 SpringComponent->RestFactor = SpringParameters.RestFactor;
98 SpringComponent->DeltaTimeOverride = SpringParameters.DeltaTimeOverride;
99 SpringComponent->CollisionForceParameter = SpringParameters.CollisionForceParameter;
100 SpringComponent->CollisionForceMinVel = SpringParameters.CollisionForceMinVel;
101 SpringComponent->ForceDistanceFalloffExponent = SpringParameters.ForceDistanceFalloffExponent;
102 SpringComponent->ForceMaxDistance = SpringParameters.ForceMaxDistance;
103 SpringComponent->MinForceFactor = SpringParameters.MinForceFactor;
104 SpringComponent->LineTraceMaxDistance = SpringParameters.LineTraceMaxDistance;
105 SpringComponent->CapsuleRadius = SpringParameters.CapsuleRadius;
106 SpringComponent->MinBoneLength = SpringParameters.MinBoneLength;
107 SpringComponent->SpringStrengthMulFactor = SpringParameters.SpringStrengthMulFactor;
108 SpringComponent->VehicleCenterZOffset = SpringParameters.VehicleCenterZOffset;
109 SpringComponent->Skeleton = SpringParameters.Skeleton;
110 SpringComponent->bAutoComputeStrength = SpringParameters.bAutoComputeStrength;
111
112}
113
114// ABaseVegetationActor类的成员函数UpdateSkeletonAndParameters,用于更新USpringBasedVegetationComponent组件的骨架和相关参数,并计算分支的弹簧强度,整合了多个相关操作。
116{
117 // 同样先使用GetComponentByClass函数获取当前Actor上类型为USpringBasedVegetationComponent的组件,返回通用的UActorComponent类型指针。
118 UActorComponent* Component =
119 GetComponentByClass(USpringBasedVegetationComponent::StaticClass());
120 // 再使用Cast函数将获取到的通用组件指针转换为USpringBasedVegetationComponent类型指针,如果转换失败则SpringComponent为nullptr,用于后续操作该组件。
121 USpringBasedVegetationComponent* SpringComponent =
122 Cast<USpringBasedVegetationComponent>(Component);
123 // 判断SpringComponent是否为nullptr,如果为nullptr,说明没有找到指定类型的组件,无法进行后续的更新操作。
124 if (!SpringComponent)
125 {
126 // 使用UE_LOG宏输出错误日志,日志分类为LogCarla,错误级别为Error,日志内容为提示文本"ABaseVegetationActor::UpdateSkeletonAndParameters Component not found",
127 // 告知开发者找不到对应的组件,然后直接返回,不再执行后续代码。
128 UE_LOG(LogCarla, Error, TEXT("ABaseVegetationActor::UpdateSkeletonAndParameters Component not found"));
129 return;
130 }
131 // 调用SetParametersToComponent函数,将SpringParameters结构体中的参数设置到SpringComponent组件中,实现参数的更新,确保组件使用最新的参数值。
133 // 调用SpringComponent组件的GenerateSkeletonHierarchy函数(应该是用于生成组件相关的骨架层次结构的函数,具体功能取决于该函数的实现逻辑),更新组件的骨架结构。
134 SpringComponent->GenerateSkeletonHierarchy();
135 // 调用SpringComponent组件的ComputeSpringStrengthForBranches函数(用于计算分支的弹簧强度,根据组件内的相关参数和逻辑进行计算),完成强度计算操作。
136 SpringComponent->ComputeSpringStrengthForBranches();
137 // 最后调用GetParametersFromComponent函数,重新从更新后的SpringComponent组件中获取参数,可能用于同步组件参数和SpringParameters结构体中的值,或者进行后续的其他相关操作。
139}
UE_LOG(LogCarla, Log, TEXT("UActorDispatcher::Destroying actor: '%s' %x"), *Id, Actor)
virtual void BeginPlay() override
FSpringBasedVegetationParameters SpringParameters