I'm trying to create an elevator, I use Character's physics, Character goes up normally with the elevator, but when descending it goes down slower than the elevator, I already used a script to increase gravity, and Character got heavier than the elevator, however, when he steps in the elevator during the descent, the character bounces. I tried to parent them, but I couldn't get Character to respect the collision of the elevator walls. And I realized that it is also a problem for me to create a platform that moves, because the Character keeps falling due to the speed. Thank you for your time, God bless you!
I think this is what you are looking for : walk around and stick to animated objects.blend
Original Blender.Artists Thread link here
Video showing the following script in action here
THIS SCRIPT DOES NOT WORK WELL WITH CHARACTER PHYSICS!
USE DYNAMIC PHYSICS INSTEAD!
# Walk and stick on animated objects and planets v3 # by cotaks # w,s,a,d and spacebar to move # able to walk speheres and animated objects: # like elevators/platforms/planets/beveled cubes/etc. # when you jump off one of the objects, it will automatically turn +z axis back up # it' a small script but very adjustable, i added more comments then script itself haha # have fun with it. from bge import logic # from player origin to the floor heigth_offset = 1.0 # length of the raycast # increase this to be able to jump higher before falling of an object # (also tweak jump force(brick) and (lower) gravity force) ray_distance = 0.5 # creates some player gravity, default 30. # (lower ables to jump off objects, higher means you can jump at all sides of the object) # adjust the player jump force(brick), or adjust the gravity_force, i suggest keeping it 20+ #just experiment around with it till you are statisfied with the results gravity_force = 30 def cast_ray(own, vector): total_distance = ray_distance + heigth_offset return own.rayCast(vector, own, total_distance) def stick_to_it(cont): own = cont.owner vector_z = own.worldPosition - own.worldOrientation.col ray_z = cast_ray(own, vector_z) if ray_z and ray_z is not None: # this could be usefull if you use python for movement, stops the sliding # if you use this make sure you add a + to line 48 and 49 (so it becomes +=) #own.linearVelocity.x = 0 #own.linearVelocity.y = 0 # creates some player gravity vector = -own.worldOrientation.col * gravity_force counter_gravity = own.applyForce(vector,False) # match our speed with the ground speed (add a + before the = if you use the above code) own.linearVelocity.x = ray_z.linearVelocity.x own.linearVelocity.y = ray_z.linearVelocity.y # align to the floor own.alignAxisToVect(ray_z,2, 0.3) # counters default gravity stops sliding down from the sides with player friction at 0 # if you use player (material) friction (default 0.500) then you can remove this line own.applyForce((0,0,9.8*own.mass),False) else: # put head (z axis) back up own.alignAxisToVect([0,0,2],2, 0.1) def update_physics(cont): # for the (animated) object(s), or any object that needs to update it # (if you want to walk on animated objects(with bones) they need this part) # always(true pulse)-python(module)-scriptname.update_physics # if you have multiple animated objects, your better of making using for loop here # if you use it remove the own.reinstancePhysicsMesh() and uncomment the for loop code # with the for loop the animated objects needs a property called: update_physics own = cont.owner own.reinstancePhysicsMesh() # if not 'update_list' in own: # own['update_list'] = [obj for obj in own.scene.objects if 'update_physics' in obj] # # for obj in own['update_list']: # obj.reinstancePhysicsMesh()