美文网首页
UE 使用 UCustomMeshComponent 绘制圆

UE 使用 UCustomMeshComponent 绘制圆

作者: WOTTOW | 来源:发表于2023-06-27 14:47 被阅读0次

    UCustomMeshComponent 只能支持简单的自定mesh,这种Mesh并不支持贴图材质。官方的API也只有简单的三个函数而已。


    image.png

    ACustomSphereActor 是我自定义的辅助Actor


    image.png
    // Fill out your copyright notice in the Description page of Project Settings.
    
    #pragma once
    
    #include "CoreMinimal.h"
    #include "CustomMeshComponent.h"
    #include "GameFramework/Actor.h"
    
    #include "Materials/Material.h"
    
    #include "CustomPanelActor.generated.h"
    
    UCLASS()
    class CUSTOMLINEPLUGINS_API ACustomPanelActor : public AActor
    {
        GENERATED_BODY()
        
    public: 
        // Sets default values for this actor's properties
        ACustomPanelActor();
    
    protected:
        // Called when the game starts or when spawned
        virtual void BeginPlay() override;
    
    public: 
        // Called every frame
        virtual void Tick(float DeltaTime) override;
    
    public:
        UPROPERTY(VisibleAnywhere)
        UCustomMeshComponent* MeshComponent;
    
        UPROPERTY(EditAnywhere,BlueprintReadOnly,Category = "Custom")
        UMaterial* Material;
    
        UPROPERTY(EditAnywhere,BlueprintReadOnly,Category = "Custom")
        FVector ReocrdPos;
    public:
        
        UFUNCTION(BlueprintCallable, Category = "Custom")
        void Create();
        UFUNCTION(BlueprintCallable, Category = "Custom")
        void Update(float Len);
        UFUNCTION(BlueprintCallable, Category = "Custom")
        void CreateSmallSphere(FVector Location,FString Name,float Scale);
        
    private:
        int num=180;
        TArray<FVector>  Points;
        TArray<FCustomMeshTriangle> Meshvertices;
    };
    
    #include "CustomPanelActor.h"
    #include "CustomMeshPanelActor.h"
    #include "CustomSphereActor.h"
    
    // Sets default values
    ACustomPanelActor::ACustomPanelActor()
    {
        // Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
        PrimaryActorTick.bCanEverTick = true;
        MeshComponent = CreateDefaultSubobject<UCustomMeshComponent>(TEXT("CustomMeshComponentZ"));
    }
    
    // Called when the game starts or when spawned
    void ACustomPanelActor::BeginPlay()
    {
        Super::BeginPlay();
        ReocrdPos=GetActorLocation();
        Create();
    }
    
    // Called every frame
    void ACustomPanelActor::Tick(float DeltaTime)
    {
        Super::Tick(DeltaTime);
    }
    
    void ACustomPanelActor::Create()
    {
        float angle = 360.0f / num;
        FVector dir = FVector::Zero();
        FVector forward = FVector::ForwardVector;
    
        Points.Add(ReocrdPos);
        //CreateSmallSphere(ReocrdPos,"AA_"+FString::FromInt(0),0.2f);
        for (int i = 1; i < num+1; i++)
        {
            FVector vec = FVector(0,0,angle * i);
            FQuat rot=FQuat::MakeFromEuler(vec);
            dir = rot * forward;
            Points.Add(ReocrdPos+dir);
    
           // CreateSmallSphere(ReocrdPos+dir,"AA_"+FString::FromInt(i),0.2f);
        }
        
         for (int i = 0; i < num; i++)
        {
            FCustomMeshTriangle temp;
            temp.Vertex0 = Points[num-1==i?1:2+i];
            temp.Vertex1 = Points[num-1==i?i:1+i];
            temp.Vertex2 = Points[0];
            Meshvertices.Add(temp);
        }
        MeshComponent->AddCustomMeshTriangles(Meshvertices);
        
        if(Material!=NULL)
        {
            UMaterialInterface* InterfacePtr = reinterpret_cast<UMaterialInterface*>(Material);
            MeshComponent->SetMaterial(0,InterfacePtr);
        }
    }
    
    void ACustomPanelActor::Update(float Len)
    {
        float angle = 360.0f / num;
        FVector dir = FVector::Zero();
        FVector forward = FVector::ForwardVector;
    
        Points[0]=ReocrdPos;
        for (int i = 1; i < num+1; i++)
        {
            FVector vec = FVector(0,0,angle * i);
            FQuat rot=FQuat::MakeFromEuler(vec);
            dir = rot * forward*Len;
            Points[i]=(ReocrdPos+dir);
        }
        
        for (int i = 0; i < num; i++)
        {
            FCustomMeshTriangle temp;
            temp.Vertex0 = Points[num-1==i?1:2+i];
            temp.Vertex1 = Points[num-1==i?i:1+i];
            temp.Vertex2 = Points[0];
            Meshvertices[i]=temp;
        }
        MeshComponent->SetCustomMeshTriangles(Meshvertices);
    }
    
    
    void ACustomPanelActor::CreateSmallSphere(FVector Location,FString Name,float Scale=0.3f)
    {
        Location=ReocrdPos+Location;
        ACustomSphereActor* Temp=GetWorld()->SpawnActor<ACustomSphereActor>(ACustomSphereActor::StaticClass(),Location, FRotator(0.0f));
        Temp->SetActorScale3D(FVector(Scale,Scale,Scale));
        Temp->SetActorLabel(Name);
        //#if WITH_EDITOR 
        //ACustomSphereActor* temp = GetWorld()->SpawnActor<ACustomSphereActor>(ACustomSphereActor::StaticClass(), Location, FRotator(0.f));
        //  ACustomSphereActor* Temp = GetWorld()->SpawnActor<ACustomSphereActor>(Location, FRotator(0.f));
        //#endif
    }
    
    

    相关文章

      网友评论

          本文标题:UE 使用 UCustomMeshComponent 绘制圆

          本文链接:https://www.haomeiwen.com/subject/kilnydtx.html