I have code that causes the actor to move, however enabling gravity causes it to stop moving whenever it lands on a surface. There is a solution here but for some reason a static mesh as a root has the physics grayed out so that isnt an option either. Any options at all?
Is there a mesh assigned to the static mesh component?
I have code that causes the actor to move
So many things depend on the method used. Adding offset is so much different from simulating physics and is so different from a movement component.
Consider adding more details how the whole thing is supposed to behave.
Yes, as the root component. I am moving by adding offset. I explained it very poorly. The actor is supposed to move side to side on the ground, it can move in midair, and when there is no gravity applied. When i add a collision box at the root instead of a mesh, to give it gravity it lands, bounces once, and sticks to the ground, completely unable to move for some reason. When i try to follow the solution, i cant enable simulate physics on the mesh. I am using the same mesh as the thread i linked, a 100x100x100 bsp brush cube, moving on the default platform.
Edit: I forgot the most obvious solution, add collision to the mesh. This is my second day learning c++ and i keep making incredibly dumb mistakes. Apologies.
Re-edit: Physics work, but its still getting stuck, with beveled collision, ccd, and an insane amount of solvers (100 each), Setting collision to sphere/capsule fixes it, but i still wonder if non-capsule/sphere objects can slide. Setting physics material to frictionless does not help.
You’re going to have a bad time.
If you’re moving a simulating body, you have 2 choices:
avoid using moving by offset / set location at all cost
- a can of ugly worms that in no way meshes with simulation; a.k.a. not really a choiceuse physics only
- not so easy to control but the most realistic lookinguse physics + movement component
- works really well as you get to use movement input, easy to control but the movement component makes certain behaviours more rigid, predictable, non-physical. But it also offers additional goodies, like using navmesh for pathfinding.
Namely, in a Pawn:
The mesh is simulating physics and has (optional) gravity.
This box is using the default box collision, efficient. You get superb collision detection (in most cases), and if you add a physical material to the mix, you get granular control over friction, restitution and more goodies.
@Everynone, thank you for posting this answer! It was exactly what I needed! I’m grateful to folks like you who take the time to help others.
In case it’s of interest to anyone, here’s how I applied the answer in code. Take this with a grain of salt as I’m still learning Unreal and C++.
–header–
UPROPERTY(EditDefaultsOnly, Category = “Input”)
class UFloatingPawnMovement* FloatingPawnMovementComponent;
–constructor–
FloatingPawnMovementComponent = CreateDefaultSubobject(TEXT(“Floating Pawn Movement Component”))
–move function–
void ATank::Move(const FInputActionValue& Value)
{
const FVector2D MovementVector2D = Value.Get();
// move forward-backward
const float Forward = MovementVector2D.Y; //framerate independence handled automatically by AddInputVector
FloatingPawnMovementComponent->AddInputVector(GetActorForwardVector() * Forward);
// turn
const float Turn = MovementVector2D.X * GetWorld()->GetDeltaSeconds() * TurnRate;
const FRotator DeltaRotation(0.f, Turn, 0.f);
AddActorLocalRotation(DeltaRotation, false);
}
AMEN.