(这也不是,那也不是,怎么办?)无论何时坚持自己的原则,当选准了目标,就不放弃,做最好的自己。我们必须要有一定的看法,正确的做法;有时,我们无法避免他人在旁的批评或劝告,但我们是无法取悦每个人的,否则...

故事讲述了一个老公公和孙子带着驴子去市场的途中受到不同人的批评,反映出无法取悦每个人的道理。文章强调在业务工作中要坚守自己的原则和方向,不要被外界的声音所左右。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  无论何时坚持自己的原则,当选准了目标,就不放弃,做最好的自己。
  从前,有个老公公带着孙子,牵着一头驴子,准备带往市场去卖。走了一段路,那位老公公听到有个路人说:「公孙两人,放着驴子不坐,真是傻瓜!」听后,觉得有点道理。公孙两人便一起骑上驴背,继续行程。
  走了不久,又遇到一名路人,那路人指着他们说:「两公孙真是没有人性,两人压得驴子透不出气来!」听了路人这么一说,那老公公便赶忙下来,让孙子一人骑在驴背上,自己牵着驴子步行。
  过了不久,经过一间茶楼,茶楼外站着一名妇女。那妇女说道:「这是什么时代啊!这个小孩这样不懂事,自己享受,让老人家走路。」那老人听了觉得那名妇女说得很有道理,便吩咐孙子下来,让他坐上去。
  走啊走着。来到一条热闹的街坊,那里有三五个妇女对着他们指指点点:「唉!这个老人怎么这样没有爱心,自己享受,让小孩受苦!」
听后,那老人脸红了。
  「这也不是,那也不是,到底那才是对的呢?」有许多人对业务(销售)工作有所误解,或一知半解。身为正当买卖的业务(销售)人员,我们必须要有一定的看法,正确的做法有时,我们无法避免他人在旁的批评或劝告,但我们是无法取悦每个人的,否则将失去了方向,迷失了自己。

转载于:https://www.cnblogs.com/feichengwulai/p/3595657.html

<think>我们之前讨论的是如何获取继承自父类的控件节点(即子类中继承得到的组件)。现在用户强调:他需要修改的是“子类继承父类的那个Component”,而不是直接修改父类的Component。这涉及到Unreal Engine中蓝图继承机制的关键点——子类中继承的组件实际上是父类组件的实例,但子类可以覆盖其属性。 用户需求解读: - 用户想要修改子类中“继承自父类”的组件(注意:不是修改父类本身的组件,而是修改子类实例中从父类继承来的组件)。 - 在子类蓝图中,默认情况下,继承自父类的组件是能直接修改的(因为它们是父类的)。但是,子类可以选择“覆盖”这些组件的属性,者在子类中覆盖整个组件(替换为新的组件)。 关键概念: - 在子类蓝图中,继承的组件在SCS中并直接出现(除非子类覆盖了它们)。如果子类没有覆盖,那么这些组件只存在于父类蓝图中。 - 但是,在子类的实例中,这些组件是存在的(通过父类的构造脚本创建)。所以,在运行时,我们可以通过子类实例获取这些组件,并修改其属性(但注意:这修改的是实例,而非蓝图本身)。 问题:用户是在编辑器中(蓝图编辑时)修改,还是在运行时修改? 假设用户是在编辑器环境下(如编辑器工具开发)想要修改子类蓝图中继承的组件,那么需要注意: - 子类蓝图能直接修改继承的组件(因为它们是父类的),除非在子类蓝图中覆盖(override)该组件的属性,者覆盖整个组件。 解决方案: 1. 如果用户想要在子类蓝图中覆盖继承组件的属性: - 在子类蓝图的SCS中,可以添加一个与父类同名的组件(类型相同),这样就会覆盖父类的组件。然后就可以修改这个覆盖组件的属性。 - 但是,这样会完全替换掉父类的组件(包括其子组件等),需要谨慎。 2. 如果用户只是想在子类实例中修改继承组件的属性(运行时编辑器中的实例编辑): - 这可以直接通过获取子类实例的组件,然后修改其属性即可。例如,在游戏运行时,通过`GetComponentByClass``FindComponent`获取组件并设置属性。 3. 如果用户是在编辑器工具开发中,希望以编程方式在子类蓝图中覆盖父类的组件(覆盖其属性): - 这比较复杂,因为UE没有直接提供在子类中覆盖父类组件属性的API。通常,我们需要在子类蓝图中创建一个新的组件(与父类组件同名),然后设置其属性。这样,在子类实例化时,就会使用这个覆盖的组件。 但是,根据用户描述“我需要改子类继承父类的那个Component”,我理解他可能是在子类实例中修改,而不是修改蓝图类本身。因此,下面提供两种场景的代码示例。 ### 场景1:修改子类实例中继承的组件(运行时) ```cpp // 假设你有一个子类蓝图生成的Actor实例:ChildActorInstance AActor* ChildActorInstance = ...; // 子类实例 // 遍历所有组件,找到继承自父类的StaticMeshComponent TArray<UStaticMeshComponent*> Components; ChildActorInstance->GetComponents<UStaticMeshComponent>(Components); for (UStaticMeshComponent* Comp : Components) { // 判断这个组件是否是继承自父类(注意:在实例中,我们无法直接判断组件是来自父类还是子类新增,除非通过名称标记) // 通常,我们可以通过组件名称(如果父类组件有特定命名)者通过其他方式(如检查其是否在子类蓝图中被覆盖)来识别。 // 但是,在实例中,我们只能获取到组件,并知道它来自哪一级蓝图。 // 如果只是想修改实例中的组件,直接修改即可 Comp->SetRelativeLocation(FVector(0, 0, 100)); } ``` ### 场景2:在编辑器工具中,修改子类蓝图,覆盖父类的组件(在子类蓝图中添加一个覆盖组件) 注意:此操作会改变子类蓝图的结构,需要谨慎。 ```cpp // 假设我们有一个子类蓝图:ChildBlueprint UBlueprint* ChildBlueprint = ...; // 我们想要覆盖父类中名为"BaseMesh"的StaticMeshComponent // 首先,我们需要获取父类中该组件的详细信息(以便在子类中创建相同的组件类型和设置) // 然后,在子类蓝图的SCS中创建一个同名同类型的组件 // 步骤1:获取父类蓝图中名为"BaseMesh"的组件节点 USCS_Node* ParentNode = nullptr; TArray<UBlueprint*> ParentBlueprints; UBlueprint::GetBlueprintHierarchyFromClass(ChildBlueprint->ParentClass, ParentBlueprints); for (UBlueprint* ParentBP : ParentBlueprints) { if (ParentBP && ParentBP->SimpleConstructionScript) { ParentNode = ParentBP->SimpleConstructionScript->FindNodeByName(FName("BaseMesh")); if (ParentNode) break; } } if (ParentNode) { // 步骤2:在子类蓝图中创建一个同名的节点(覆盖) USimpleConstructionScript* SCS = ChildBlueprint->SimpleConstructionScript; USCS_Node* OverrideNode = SCS->FindNodeByName(ParentNode->GetVariableName()); // 如果子类中还没有覆盖节点,则创建 if (!OverrideNode) { // 复制一个组件模板(注意:这里需要深度复制,因为父类的组件模板我们能直接修改) UObject* DuplicatedTemplate = StaticDuplicateObject(ParentNode->ComponentTemplate, ChildBlueprint); // 创建一个新的SCS节点 OverrideNode = SCS->CreateNode(ParentNode->ComponentClass, ParentNode->GetVariableName()); OverrideNode->ComponentTemplate = Cast<UActorComponent>(DuplicatedTemplate); // 将节点添加到SCS的根节点(者根据父节点的位置添加?这里需要更复杂的处理,比如复制父节点的层级关系) SCS->AddNode(OverrideNode); } // 现在,我们可以修改OverrideNode->ComponentTemplate的属性 if (UStaticMeshComponent* StaticMeshComp = Cast<UStaticMeshComponent>(OverrideNode->ComponentTemplate)) { StaticMeshComp->SetRelativeLocation(FVector(0,0,100)); // ... 其他修改 } // 注意:修改后需要编译蓝图 FKismetEditorUtilities::CompileBlueprint(ChildBlueprint); } ``` 但是,请注意:覆盖父类组件是一个复杂的操作,需要处理组件的层级关系(如果有父组件)和默认值复制。上述代码仅作为示例,实际应用中需要更完善的错误处理和细节处理。 根据用户的问题,我猜测他可能更关心场景1(修改实例)。如果是在编辑器中修改蓝图类本身(场景2),则需要非常小心。 因此,请用户明确: - 是在运行时修改实例的组件? - 还是在编辑器工具中修改蓝图类(子类)以覆盖父类的组件? 如果用户需要的是在子类蓝图中修改继承组件的默认值(而覆盖整个组件),实际上UE4/5允许在子类蓝图的细节面板中覆盖父类组件的属性(当选中组件时,属性会显示为覆盖状态)。但是,以编程方式实现这个操作,需要调用引擎内部函数,通常建议,因为稳定。 另一种思路:在子类蓝图的构造脚本中(通过事件图表)修改继承组件的属性。这可以通过在子类蓝图中添加一个“Construction Script”事件,然后通过“GetComponentByClass”直接通过变量获取组件,然后设置其属性。这样,当子类实例化时,就会自动执行这个构造脚本,覆盖父类组件的默认值。 代码示例(在子类蓝图的构造脚本中): - 通过事件图表,使用“Get All Components”“Get Component by Class”获取组件,然后设置其属性。 总结:根据用户的具体场景,选择同的方法。 由于问题描述够具体,我提供了多种可能性。如果用户能明确场景,我们可以给出更精确的代码。 但是,根据问题“我需要改子类继承父类的那个Component”,我假设用户是在运行时修改实例,那么场景1的代码就足够了。 如果用户是在编辑蓝图类时想修改,那么可能需要场景2(覆盖组件)者在构造脚本中设置(推荐后者,因为更安全)。 因此,我建议用户先明确场景。 注意:以上代码示例可能需要根据实际引擎版本调整。 §§相关问题§§ 1. 在Unreal Engine中,如何判断子类实例中的一个组件是继承自父类还是子类新增的? 2. 在子类蓝图的构造脚本中,如何安全地修改继承自父类的组件属性? 3. 如何以编程方式在子类蓝图中覆盖父类的组件而引起运行时错误? 4. 修改子类实例中继承组件的属性与在子类蓝图中覆盖父类组件属性有何本质区别? 5. 在Unreal Engine编辑器中,如何通过蓝图事件图表修改继承组件的属性?</think>### 问题分析与解决方案 您需要修改的是**子类实例中继承自父类的组件**(而非直接修改父类组件本身)。在 Unreal Engine 中,子类实例中的继承组件是父类组件的副本,但可以通过子类实例进行覆盖修改。以下是具体实现方法: ### 修改子类继承组件的步骤 1. **获取子类实例中的组件** - 在子类实例中通过 `GetComponentsByClass()` 获取实际组件对象 2. **识别继承组件** - 通过组件名称元数据判断是否继承自父类 3. **修改组件属性** - 直接设置组件属性值,这些修改仅影响当前实例 ### 示例代码 ```cpp // 获取子类Actor实例 AActor* ChildActorInstance = ...; // 获取所有静态网格组件 TArray<UStaticMeshComponent*> Components; ChildActorInstance->GetComponents(Components); for (UStaticMeshComponent* Comp : Components) { // 检查是否为继承自父类的组件(通过名称前缀判断) if (Comp->GetName().StartsWith("ParentComponent_")) { // 修改继承组件的属性(仅影响当前实例) Comp->SetRelativeLocation(FVector(0, 0, 100)); Comp->SetMaterial(0, NewMaterial); UE_LOG(LogTemp, Log, TEXT("Modified inherited component: %s"), *Comp->GetName()); // 标记组件状态已改变(可选) Comp->Modify(); } } ``` ### 关键注意事项 1. **实例级修改**: - 此方法修改的是**特定实例**中的组件,会影响父类蓝图其他实例 - 如需永久修改,需在子类蓝图中覆盖父类组件(通过SCS添加同名组件) 2. **继承组件识别**: - 推荐方法:在父类组件命名时添加特定前缀(如 `Inherited_`) - 替代方案:通过 `GetClass()->GetSuperClass()` 检查组件类继承关系 3. **动态修改时机**: - 在 `BeginPlay()` 事件触发时修改:影响运行时行为 - 在编辑器工具中修改:影响场景中的特定实例 4. **避免父类影响**: - 修改后调用 `Comp->PostEditChange()` 确保更新 - 使用 `Comp->SetFlags(RF_Transactional)` 支持撤销操作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值