当前位置:   article > 正文

SplineTrace组件_binputsplinepointstoconstructionscript

binputsplinepointstoconstructionscript

.h

  1. // Fill out your copyright notice in the Description page of Project Settings.
  2. #pragma once
  3. #include "CoreMinimal.h"
  4. #include "GameFramework/Actor.h"
  5. #include "SplineTraceActor.generated.h"
  6. UCLASS()
  7. class MZEDUCATION_API ASplineTraceActor : public AActor
  8. {
  9. GENERATED_BODY()
  10. public:
  11. // Sets default values for this actor's properties
  12. ASplineTraceActor();
  13. protected:
  14. // Called when the game starts or when spawned
  15. virtual void BeginPlay() override;
  16. public:
  17. // Called every frame
  18. virtual void Tick(float DeltaTime) override;
  19. public:
  20. //根组件;
  21. UPROPERTY(VisibleDefaultsOnly, BlueprintReadWrite, Category = "DefaultComponent")
  22. class USceneComponent* Root;
  23. //可编辑的Spline;
  24. UPROPERTY(VisibleDefaultsOnly, BlueprintReadWrite, Category = "DefaultComponent")
  25. class USplineComponent* EditableSpline;
  26. //用于显示的Spline;
  27. UPROPERTY(VisibleDefaultsOnly, BlueprintReadWrite, Category = "DefaultComponent")
  28. class USplineComponent* DisplaybleSpline;
  29. //用于存放生成的点的信息的数组;
  30. UPROPERTY(EditAnywhere,BlueprintReadWrite,Category="DefaultValues")
  31. TArray<FVector> Points;
  32. //分割次数 点的密集程度
  33. UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "DefaultValues", meta = (ClampMin = "10", ClampMax = "45"))
  34. int Times=10;
  35. //函数序列
  36. //ConstructionScript函数;
  37. UFUNCTION(BlueprintCallable, Category = "ConstructionFunction")
  38. virtual void OnConstruction(const FTransform& Transform) override;
  39. //得到分割后每段的距离;
  40. UFUNCTION(BlueprintCallable, Category = "CaculateDistance")
  41. float GetPerDistance();
  42. //得到发出射线的点的起始点和终止点
  43. UFUNCTION(BlueprintCallable, Category = "CaculateDistance")
  44. void GetTracePoint(float CurrentDistance, FVector& StartPointLoc, FVector& EndPointLoc);
  45. };

.cpp

  1. // Fill out your copyright notice in the Description page of Project Settings.
  2. #include "SplineTraceActor.h"
  3. #include "Components/SplineComponent.h"
  4. #include "Engine/EngineTypes.h"
  5. #include "Engine/World.h"
  6. #include "Components/TimelineComponent.h"
  7. // Sets default values
  8. ASplineTraceActor::ASplineTraceActor()
  9. {
  10. // Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
  11. PrimaryActorTick.bCanEverTick = true;
  12. Root = CreateDefaultSubobject<USceneComponent>(TEXT("RootCom"));
  13. EditableSpline = CreateDefaultSubobject<USplineComponent>(TEXT("EditableSpline"));
  14. DisplaybleSpline = CreateDefaultSubobject<USplineComponent>(TEXT("DisplaybleSpline"));
  15. EditableSpline->bInputSplinePointsToConstructionScript = true;
  16. DisplaybleSpline->bInputSplinePointsToConstructionScript = true;
  17. RootComponent = Root;
  18. EditableSpline->SetupAttachment(Root);
  19. DisplaybleSpline->SetupAttachment(Root);
  20. DisplaybleSpline->ClearSplinePoints(true);
  21. }
  22. // Called when the game starts or when spawned
  23. void ASplineTraceActor::BeginPlay()
  24. {
  25. Super::BeginPlay();
  26. }
  27. // Called every frame
  28. void ASplineTraceActor::Tick(float DeltaTime)
  29. {
  30. Super::Tick(DeltaTime);
  31. }
  32. void ASplineTraceActor::OnConstruction(const FTransform& Transform)
  33. {
  34. Super::OnConstruction(Transform);
  35. Points.Empty();
  36. for (int i=0;i<Times;i++)
  37. {
  38. float dis = GetPerDistance()*i;
  39. //UE_LOG(LogTemp, Warning, TEXT("dis:%f"), dis);
  40. FVector StartPoint,EndPoint;
  41. GetTracePoint(dis, StartPoint, EndPoint);
  42. //UE_LOG(LogTemp, Warning, TEXT("点:%d,%d,%d"),StartPoint.X,StartPoint.Y,StartPoint.Z);
  43. UWorld* world = GetWorld();
  44. if (world)
  45. {
  46. FHitResult hitresult;
  47. GetWorld()->LineTraceSingleByObjectType(hitresult, StartPoint, EndPoint, true);
  48. FVector Hitpoint = hitresult.Location;
  49. Points.Add(Hitpoint);
  50. }
  51. }
  52. DisplaybleSpline->ClearSplinePoints(true);
  53. for (int i=0;i<Points.Num();i++)
  54. {
  55. DisplaybleSpline->AddSplineWorldPoint(Points[i]);
  56. //UE_LOG(LogTemp, Warning, TEXT("Construction函数,points:%d,points个数:%d"),Points[i].Y,Points.Num());
  57. }
  58. }
  59. float ASplineTraceActor::GetPerDistance()
  60. {
  61. float perDistance = 0;
  62. if (Times)
  63. {
  64. perDistance = (EditableSpline->GetSplineLength())/Times;
  65. //UE_LOG(LogTemp, Warning, TEXT("%f:"), perDistance)
  66. }
  67. else
  68. {
  69. UE_LOG(LogTemp,Warning,TEXT("Times的值为空!"))
  70. }
  71. return perDistance;
  72. }
  73. void ASplineTraceActor::GetTracePoint(float CurrentDistance, FVector& StartPointLoc, FVector& EndPointLoc)
  74. {
  75. FVector Point = EditableSpline->GetLocationAtDistanceAlongSpline(CurrentDistance, ESplineCoordinateSpace::Local);
  76. Point = FVector(Point.X, Point.Y, Point.Z + 1000);
  77. StartPointLoc = GetActorLocation() + GetActorRotation().RotateVector(Point);
  78. EndPointLoc = StartPointLoc + FVector(0, 0, -3000);
  79. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/91454
推荐阅读
相关标签
  

闽ICP备14008679号