Skip to content

0.15.x to 1.x.x Migration guide

Hugo Wiledal edited this page May 21, 2023 · 2 revisions

WorldApi was removed

The WorldApi has been removed. Instead, you can now get a proxied singleton instance of the world from @react-three/rapier. This is a breaking change, but it should be easy to migrate to.

Before:

import { useRapier } from "@react-three/rapier";

const Component = () => {
  const { world } = useRapier();

  useEffect(() => {
    // Access to the WorldApi (limited)
    world.raw().bodies.forEach(() => {
      // Do something
    });

    // Access the raw Rapier World instance
    const rawWorldInstance = world.raw();
    rawWorldInstance.raw().setGravity(new Vector3(0, -9.81, 0));
  }, []);
};

Now:

import { useRapier } from "@react-three/rapier";

const Component = () => {
  const { world } = useRapier();

  useEffect(() => {
    // Access the Rapier World instance directly
    world.bodies.forEach(() => {
      // Do something
    });
    world.setGravity(new Vector3(0, -9.81, 0));
  }, []);
};

Note: it is best to avoid accessing properties and methods on the world outside of useEffect in order for the world to be properly synchronized with the React component lifecycle.

// bad
const Component = () => {
  const {world} = useRapier()

  world.setGravity(...)

  return null
}

// good
const Component = () => {
  const {world} = useRapier()

  useEffect(() => {
    world.setGravity(...)
  }, [])

  return null
}
Clone this wiki locally