CARLA
 
载入中...
搜索中...
未找到
CarlaLight.cpp
浏览该文件的文档.
1// 版权所有 (c) 巴塞罗那自治大学 (UAB) 2020 计算机视觉中心 (CVC)。
2//
3// 本作品根据 MIT 许可证的条款进行许可。
4// 有关副本,请参阅 <https://opensource.org/licenses/MIT>。
5
6// 包含CarlaLight相关的头文件,可能定义了该类依赖的基础结构、类型等内容
7#include "CarlaLight.h"
8// 包含CarlaLightSubsystem相关的头文件,应该是和灯光子系统相关的定义所在
10// 包含Carla相关的静态工具类的头文件,用于获取游戏中的一些通用静态资源等操作
12
13// UCarlaLight类的定义,通常继承自UE4中的某个组件类(从命名推测),用于表示游戏中的灯光相关逻辑
14UCarlaLight::UCarlaLight()
15{
16 // 设置该组件的Tick机制,这里表示该组件在游戏运行时不会每帧进行更新(bCanEverTick设为false)
17 PrimaryComponentTick.bCanEverTick = false;
18}
19
20// 当该组件所在的Actor开始游戏时调用的函数(UE4生命周期函数)
21void UCarlaLight::BeginPlay()
22{
23 // 先调用父类的BeginPlay函数,确保父类相关的初始化逻辑先执行
24 Super::BeginPlay();
25
26 // 注册灯光,将该灯光组件添加到相应的系统中进行管理等操作
27 RegisterLight();
28}
29
30// 用于注册灯光的函数
31void UCarlaLight::RegisterLight()
32{
33 // 如果已经注册过了,直接返回,避免重复注册
34 if (bRegistered)
35 {
36 return;
37 }
38
39 // 获取该组件所在的世界指针,UE4中世界是管理游戏场景中所有Actor等对象的顶级容器
40 UWorld *World = GetWorld();
41 if (World)
42 {
43 // 从世界中获取CarlaLightSubsystem实例,用于后续把自身注册到该子系统中
44 UCarlaLightSubsystem* CarlaLightSubsystem = World->GetSubsystem<UCarlaLightSubsystem>();
45 // 将当前灯光组件注册到灯光子系统中,具体注册逻辑在子系统内实现
46 CarlaLightSubsystem->RegisterLight(this);
47 }
48 // 将灯光与天气相关逻辑进行注册(具体功能可能是根据天气情况调整灯光等,从函数名推测)
49 RegisterLightWithWeather();
50 // 标记该灯光已经注册成功
51 bRegistered = true;
52}
53
54// 当该组件被销毁时调用的函数(UE4生命周期函数)
55void UCarlaLight::OnComponentDestroyed(bool bDestroyingHierarchy)
56{
57 // 先调用父类的OnComponentDestroyed函数,确保父类相关的销毁逻辑先执行
58 Super::OnComponentDestroyed(bDestroyingHierarchy);
59}
60
61// 当该组件所在的Actor结束游戏时调用的函数(UE4生命周期函数),传入结束游戏的原因类型参数
62void UCarlaLight::EndPlay(const EEndPlayReason::Type EndPlayReason)
63{
64 // 获取该组件所在的世界指针
65 UWorld *World = GetWorld();
66 if (World)
67 {
68 // 从世界中获取CarlaLightSubsystem实例
69 UCarlaLightSubsystem* CarlaLightSubsystem = World->GetSubsystem<UCarlaLightSubsystem>();
70 // 将当前灯光组件从灯光子系统中注销,释放相关资源等
71 CarlaLightSubsystem->UnregisterLight(this);
72 }
73 // 调用父类的EndPlay函数,确保父类相关的结束游戏逻辑能执行
74 Super::EndPlay(EndPlayReason);
75}
76
77// 设置灯光强度的函数,接收一个表示强度的浮点数值参数
78void UCarlaLight::SetLightIntensity(float Intensity)
79{
80 // 更新灯光强度的内部变量
81 LightIntensity = Intensity;
82 // 根据新的强度值更新灯光的实际显示效果等(具体实现可能在UpdateLights函数内)
83 UpdateLights();
84}
85
86// 获取当前灯光强度的函数,返回一个表示强度的浮点数值
87float UCarlaLight::GetLightIntensity() const
88{
89 return LightIntensity;
90}
91
92// 设置灯光颜色的函数,接收一个FLinearColor类型(UE4中表示线性颜色的结构体)的参数
93void UCarlaLight::SetLightColor(FLinearColor Color)
94{
95 // 更新灯光颜色的内部变量
96 LightColor = Color;
97 // 根据新的颜色值更新灯光的实际显示效果等
98 UpdateLights();
99 // 记录灯光颜色发生了改变,可能用于后续的日志记录、回放等相关逻辑
100 RecordLightChange();
101}
102
103// 获取当前灯光颜色的函数,返回一个FLinearColor类型的颜色值
104FLinearColor UCarlaLight::GetLightColor() const
105{
106 return LightColor;
107}
108
109// 设置灯光是否开启的函数,接收一个布尔值参数表示是否开启
110void UCarlaLight::SetLightOn(bool bOn)
111{
112 bLightOn = bOn;
113 // 根据新的开启状态更新灯光的实际显示效果等
114 UpdateLights();
115 // 记录灯光开启状态发生了改变
116 RecordLightChange();
117}
118
119// 获取灯光当前是否开启的函数,返回一个布尔值表示开启状态
120bool UCarlaLight::GetLightOn() const
121{
122 return bLightOn;
123}
124
125// 设置灯光类型的函数,接收一个ELightType类型(自定义的灯光类型枚举,推测)的参数
126void UCarlaLight::SetLightType(ELightType Type)
127{
128 LightType = Type;
129}
130
131// 获取当前灯光类型的函数,返回一个ELightType类型的灯光类型值
132ELightType UCarlaLight::GetLightType() const
133{
134 return LightType;
135}
136
137// 获取灯光状态的函数,返回一个carla::rpc::LightState类型(应该是和RPC通信相关的灯光状态结构体,推测)的对象
138carla::rpc::LightState UCarlaLight::GetLightState()
139{
140 // 创建一个carla::rpc::LightState对象,并通过当前灯光组件的各项属性进行初始化
142 GetLocation(),
143 LightIntensity,
144 static_cast<carla::rpc::LightState::LightGroup>(LightType),
145 LightColor,
146 bLightOn
147 );
148
149 // 设置该灯光状态对象的id为当前灯光组件的id
150 state._id = GetId();
151
152 return state;
153}
154
155// 设置灯光状态的函数,接收一个carla::rpc::LightState类型的参数表示要设置的目标状态
156void UCarlaLight::SetLightState(carla::rpc::LightState LightState)
157{
158 // 根据传入的灯光状态参数更新灯光强度的内部变量
159 LightIntensity = LightState._intensity;
160 // 根据传入的灯光状态参数更新灯光颜色的内部变量
161 LightColor = LightState._color;
162 // 根据传入的灯光状态参数更新灯光类型的内部变量,进行类型转换(从rpc相关类型转换为自定义的ELightType类型)
163 LightType = static_cast<ELightType>(LightState._group);
164 // 根据传入的灯光状态参数更新灯光开启状态的内部变量
165 bLightOn = LightState._active;
166 // 根据新的状态值更新灯光的实际显示效果等
167 UpdateLights();
168 // 记录灯光状态发生了改变
169 RecordLightChange();
170}
171
172// 获取灯光在游戏世界中的位置的函数,返回一个FVector类型(UE4中表示三维向量的结构体)的位置值
173FVector UCarlaLight::GetLocation() const
174{
175 // 先获取该灯光组件所属的Actor在本地坐标系下的位置
176 auto Location = GetOwner()->GetActorLocation();
177 // 获取游戏模式实例,通过CarlaStatics工具类从世界中获取
178 ACarlaGameModeBase* GameMode = UCarlaStatics::GetGameMode(GetWorld());
179 // 从游戏模式中获取大型地图管理器实例(可能用于地图相关的坐标转换等功能)
180 ALargeMapManager* LargeMap = GameMode->GetLMManager();
181 if (LargeMap)
182 {
183 // 如果大型地图管理器存在,将本地坐标转换为全局坐标(具体转换逻辑在LargeMap的对应函数内实现)
184 Location = LargeMap->LocalToGlobalLocation(Location);
185 }
186 return Location;
187}
188
189// 获取灯光组件的唯一标识符的函数,返回一个整数类型的id值
190int UCarlaLight::GetId() const
191{
192 return Id;
193}
194
195// 设置灯光组件唯一标识符的函数,接收一个整数类型的参数表示要设置的新id值
196void UCarlaLight::SetId(int InId)
197{
198 Id = InId;
199}
200
201// 记录灯光发生改变的函数(通常用于一些日志记录、事件记录等相关逻辑),被标记为const表示不会修改类的成员变量(除了可能的mutable成员变量,如果有的话)
202void UCarlaLight::RecordLightChange() const
203{
204 // 获取当前游戏的剧情实例(可能用于记录游戏过程中的一些事件等,从命名推测),通过CarlaStatics工具类从世界中获取
205 auto* Episode = UCarlaStatics::GetCurrentEpisode(GetWorld());
206 if (Episode)
207 {
208 // 从剧情实例中获取记录器实例(用于记录游戏中的各种事件等操作)
209 auto* Recorder = Episode->GetRecorder();
210 if (Recorder && Recorder->IsEnabled())
211 {
212 // 如果记录器存在且已启用,添加一个灯光场景改变的事件记录,将当前灯光组件作为参数传入(具体记录逻辑在记录器内实现)
213 Recorder->AddEventLightSceneChanged(this);
214 }
215 }
216}
FVehicleLightState LightState
Definition ActorData.h:131
TSharedPtr< const FActorInfo > carla::rpc::ActorState UWorld * World
ELightType
Definition CarlaLight.h:25
CARLA Game Mode 的基类。
ALargeMapManager * GetLMManager() const
FVector LocalToGlobalLocation(const FVector &InLocation) const
void RegisterLight(UCarlaLight *CarlaLight)
void UnregisterLight(UCarlaLight *CarlaLight)
static UCarlaEpisode * GetCurrentEpisode(const UObject *WorldContextObject)
static ACarlaGameModeBase * GetGameMode(const UObject *WorldContextObject)
geom::Location Location