Announcement

Collapse
No announcement yet.

[UMaterialInstanceDynamic] Compile problem

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

    [UMaterialInstanceDynamic] Compile problem

    Hello !

    I was following this tutorial on eu4 : https://www.youtube.com/channel/UCnO...O1WwKFq-5Pvj0Q
    At 13.00m he create a UMaterialInstanceDynamic and he does the SetVectorParametersValue on his material. I've try to do it in the basicProjectile.cpp file (OnHit function).
    But visual studio tells me I can't do that. Also, Visual studio auto completion didnt work on MatInst.


    Code:
    void AMaze_V_1_0_0Projectile::OnHit(UPrimitiveComponent* HitComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit)
    {
        // Only add impulse and destroy projectile if we hit a physics
        if ((OtherActor != NULL) && (OtherActor != this) && (OtherComp != NULL) && OtherComp->IsSimulatingPhysics()) {
            OtherComp->AddImpulseAtLocation(GetVelocity() * 100.0f, GetActorLocation());
    
    
            UMaterialInstanceDynamic *MatInst = OtherComp->CreateAndSetMaterialInstanceDynamic(0);
    
            if (MatInst) {
    
                // Error Here on MatInst ... Dont know why
    MatInst->SetVectorParametersValue("Color", FLinearColor::MakeRandomColor);
            }
    
            Destroy();
        }
    }
    Sorry for my english and thx for any help.

    #2
    Hello,

    First, you made a typo:

    Bad:
    MatInst->SetVectorParametersValue("Color", FLinearColor::MakeRandomColor);
    Good:
    MatInst->SetVectorParameterValue("Color", FLinearColor::MakeRandomColor());


    Then, the reason why visual studio is complaining is the GENERATED_UCLASS_BODY() macro inside MaterialInstanceDynamic.h

    To keep it simple, at the end of the macro, there is a "public:", but visual studio doesn't know it.
    The result: it thinks that the function is private and this is why it doesn't autocomplete you.

    But it should compile no problem.




    Cheap fix if you have the engine source and you want to have the autocomplete:
    Search for "GENERATED_UCLASS_BODY()" in the entire solution and replace it with "GENERATED_UCLASS_BODY() public:"

    Note:
    I do this everytime I get a new engine source code and everything works fine, but make sure that it does not break anything for you before doing it.
    Last edited by AlexQuevillon; 01-10-2019, 05:03 AM.
    Have An Awesome And Productive Day
    Alex, Youtube Tutorials

    Comment


      #3
      Thanks a lot !

      Comment


        #4
        Hum It still doest compile even without the "s"

        I've also added the public in the header file but the auto complet is still broken.

        Code:
        void AMaze_V_1_0_0Projectile::OnHit(UPrimitiveComponent* HitComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit)
        {
            // Only add impulse and destroy projectile if we hit a physics
            if ((OtherActor != NULL) && (OtherActor != this) && (OtherComp != NULL) && OtherComp->IsSimulatingPhysics()) {
                OtherComp->AddImpulseAtLocation(GetVelocity() * 100.0f, GetActorLocation());
        
        
                FVector scale = OtherComp->GetComponentScale();
                scale *= 0.8f;
        
                if (scale.GetMin() < 0.5) {
                    OtherActor->Destroy();
                } else {
                    OtherComp->SetWorldScale3D(scale);
        
                }
        
                UMaterialInstanceDynamic *MatInst = OtherComp->CreateAndSetMaterialInstanceDynamic(0);
        
                if (MatInst) {
                    MatInst->SetVectorParameterValue("Color", FLinearColor::MakeRandomColor);
                }
        
                Destroy();
            }
        }

        Comment


          #5
          What is the compile error message?
          Have An Awesome And Productive Day
          Alex, Youtube Tutorials

          Comment


            #6
            Projectile.cpp (54): Note: You must not use the source type or the manufacturer's overload solution? was ambiguous?
            Projectile.cpp (54): error C2664: 'void UMaterialInstanceDynamic :: SetVectorParameterValue (FName, FLinearColor)' ?: Unable to convert argument 2 of 'FLinearColor (__cdecl *) (void)' in 'FLinearColor'

            Comment


              #7
              Ok I found how to fix it ... Sorry I was doing **** ... The "()" was missing at the end of MakeRandomColor()

              But I still dont understand why I need to include this :

              Code:
               #include "Runtime/Engine/Classes/Materials/MaterialInstanceDynamic.h"
              To get the auto complet on a MaterialInstanceDynamic Object


              Now if I remove this include I have an error on the MatInst but on ue4 side it compile
              Code:
                       UMaterialInstanceDynamic *MatInst = OtherComp->CreateAndSetMaterialInstanceDynamic(0);
              
                      if (MatInst) {
                          MatInst->SetVectorParameterValue("Color", FLinearColor::MakeRandomColor());
                      }
              Last edited by starkmax; 01-09-2019, 10:37 PM.

              Comment


                #8
                Oh wow, I didn't see the missing () either, sorry.

                And for the include, it is better to keep it.
                Most of the classes are not included by default.

                If you don't know where to find it:
                Go into the API and search for it.
                Go at the bottom and you will find the include file.

                While being there, you can also take a look at the dependency module, if you're not adding it into your build.cs file, you will probably get a link error during compile.
                Have An Awesome And Productive Day
                Alex, Youtube Tutorials

                Comment

                Working...
                X