Advertisement
dkaban

Untitled

Nov 28th, 2022
889
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.73 KB | None | 0 0
  1. В .h файле есть класс
  2. ```
  3. #pragma once
  4. #include "BaseInteractiveObject.generated.h"
  5. class UStaticMeshComponent;
  6. class USceneComponent;
  7. UCLASS(Blueprintable)
  8. class ABaseInteractiveObject: public AActor
  9. {
  10.     GENERATED_UCLASS_BODY()
  11. public:
  12.         // эти параметры добавляются
  13.     UPROPERTY(BlueprintReadWrite, EditAnywhere)
  14.     USceneComponent* SceneRoot = nullptr;
  15.     UPROPERTY(BlueprintReadWrite, EditAnywhere)
  16.     UStaticMeshComponent* OverlapAreaNative = nullptr;
  17. };
  18. ```
  19.  
  20.  
  21. С++ тоже очень прост
  22.  
  23. ```
  24. #include "VehicleGame.h"
  25. #include "Actors/BaseInteractiveObject.h"
  26. ABaseInteractiveObject::ABaseInteractiveObject(const FObjectInitializer& ObjectInitializer)
  27.     : Super(ObjectInitializer)
  28. {
  29.     SceneRoot = CreateDefaultSubobject<USceneComponent>("SceneRoot");
  30.     SetRootComponent(SceneRoot);
  31.     OverlapAreaNative = CreateDefaultSubobject<UStaticMeshComponent>("OverlapAreaNative");
  32.     OverlapAreaNative->SetupAttachment(SceneRoot);
  33.     OverlapAreaNative->SetGenerateOverlapEvents(true);
  34.     OverlapAreaNative->SetCollisionProfileName(FName("OverlapAll"));
  35. }
  36. ```
  37. Есть большая и сложная иерархия наследников от С++ класса с их DefaultSceneRoot компонентами (edited)
  38. После добавления компонентов появляются ошибки вида
  39. ```
  40. Template Mismatch during attachment. Attaching instanced component to template component. Parent 'SceneRoot' (Owner 'Default__BP_BaseCheckpoint_C') Self 'OverlapAreaNative' (Owner 'Challenge_Checkpoint_Common_C_1').
  41. [2022.11.25-16.05.53:956][  0]LogOutputDevice: Error: Ensure condition failed: false [File:D:\build\++UE5\Sync\Engine\Source\Runtime\Engine\Private\Components\SceneComponent.cpp] [Line: 1924]
  42. Template Mismatch during attachment. Attaching instanced component to template component. Parent 'SceneRoot' (Owner 'Default__BP_BaseCheckpoint_C') Self 'OverlapAreaNative' (Owner 'Challenge_Checkpoint_Common_C_1').
  43. ```
  44.  
  45. Решение вида Transient не нравится
  46. ```
  47. UPROPERTY(BlueprintReadWrite, EditAnywhere, Transient)
  48. SceneRoot = CreateDefaultSubobject<USceneComponent>("SceneRoot", true);
  49. SetRootComponent(SceneRoot);
  50. OverlapAreaNative = CreateDefaultSubobject<UStaticMeshComponent>("OverlapAreaNative", true);
  51. ```
  52.  
  53. Есть ли другие решения?
  54. Как задать USceneComponent так, чтобы в нее автоматически скопировалась позиция из "DefaultSceneRoot" ?
  55. Опять же, есть решение по ручному копированию на PreRegisterAllComponents, но это тоже костыль
  56. Есть ли способ автоматически скопировать данные из BP компоненты в С++ компоненту (например, была BP OverlapArea, а мы хотим ее перенести в С++ OverlapAreaNative)?
  57. Чтобы скопировались параметры и у Default классов и у инстансов на картах
  58.  
  59. Есть способ переноса связей в Blueprints через DefaultsEngine.ini через секцию
  60. ```
  61. [CoreRedirects]
  62. +PropertyRedirects=(OldName="/Game/Core/Blueprints/Exploration/MapObjective/BP_BaseInteractiveObject.OverlapArea",NewName="/Script/VehicleGame.BaseInteractiveObject.OverlapAreaNative")
  63. ```
  64.  
  65. Но во всех дефолтных классах в BP параметры приходится переносить руками, и для объектов на карте тоже
  66. Есть ли нормальные советы по переводу проекта из BP в C++, а не "отписка" на официальной документации для начинающих
  67. Типичные ошибки, проблемы, подводные камни и т.д.
  68.  
  69. Как правильно скопировать все Property из одной компоненты в другую?
  70.  
  71. ```
  72. TArray<uint8> NodeData;
  73. FMemoryWriter NodeArchiveWriter(NodeData, true);
  74. NodeArchiveWriter.ArSerializingDefaults = 1;
  75. NodeArchiveWriter.ArNoDelta = true;
  76. FObjectAndNameAsStringProxyArchive NodeProxyArchiveWriter(NodeArchiveWriter, true);
  77. BPComponent->SerializeScriptProperties(NodeProxyArchiveWriter);
  78. FMemoryReader NodeArchiveReader(NodeData, true);
  79. NodeArchiveReader.ArSerializingDefaults = 1;
  80. NodeArchiveReader.ArNoDelta = true;
  81. FObjectAndNameAsStringProxyArchive NodeProxyArchiveReader(NodeArchiveReader, true);
  82. CppComponent->SerializeScriptProperties(NodeProxyArchiveReader);
  83. ```
  84. Решение не всегда работает, иногда (50% случаев) после копирования компонента не отображается в редакторе
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement