• Unity
  • Unity rotation on scaled bone

  • 編集済み
Related Discussions
...

Hi guys,

Pretty sure I'm missing something obvious here, but can't spot what the issue is.

I have a skeleton and I'm spawning bullets from a child bone using the following code:

var bullet = Instantiate(_bulletPrefab, _turretEmitPoints[turretIndex].position, _turretRotateTransforms[turretIndex].rotation);
bullet.RunOnChildrenRecursive((g) => g.layer = _projectileLayer);

var rigidBody = bullet.GetComponent<Rigidbody2D>();
rigidBody.velocity = rigidBody.transform.right * 5f;

This works fine when the root bone scale is 1, 1, 1 but when I change the root bone scale to 1, 0.7, 1 the rotation is then off. I've tried using WorldRotationX on the bone object itself, but it always seems to ignore the effect scaling in Y has on the world rotation.

Is there another property or some transform I need to apply to get the accurate rotation?

Here the root bone is 1, 1, 1 scale

Here is when the root bone is 1, 0.7, 1 scale

In general, combining non-uniform scaling (not scaling x,y,z coords by the same value) at a parent object and rotation by other angles than 90,180,270 degrees at a child object can yield unintuitive effects in 2D and 3D graphics.

In your case you have actually discovered a limitation of the SkeletonUtilityBone compared to the BoneFollower, at least I guess you are using the SkeletonUtilityBone hierarchy for the _turretRotateTransforms[turretIndex]. SkeletonUtilityBone assigns the undistorted angles to the Transforms, whereas BoneFollower respects non-uniform scale.

So in short, you could have a try with using a BoneFollower component instead to follow the rotation of your turret.
Please let me know if my guess was wrong and your setup is different.

Perfect!! You were spot on about my setup, and switching to BoneFollower is now respecting the non-uniform scale.

Thank you!

Great to hear, glad it worked! Thanks for letting us know.