Problems sync'ing the spine bone's localRotation

Options
I want my player model's spine bone follow the mouse rotation when looking up and down, so that all the players can see when other players are looking up and down. This works just fine locally:
using UnityEngine;
using System.Collections;

public class MouseLookController : Photon.MonoBehaviour {
	
	private PlayerController playerController;

	private float mouseSensitivity  =   2.0f;
	private float upDownRotation    =   0.0f;
	private float minUpDownRotation = -70.0f;
	private float maxUpDownRotation =  70.0f;

	private SkinnedMeshRenderer skinnedMeshRenderer;
	public Transform spineTransform;

	void Start () {
		playerController = PlayerController.instance;
		skinnedMeshRenderer = GetComponentInChildren<SkinnedMeshRenderer>();

		foreach ( Transform boneTransform in skinnedMeshRenderer.bones ) {
			if ( boneTransform.name == "Bip01 Spine1" ) { // TODO: Really?!
				spineTransform = boneTransform;
				break;
			}
		}
		
		if ( spineTransform == null ) {
			Debug.LogError( "Failed to find the player's spine!" );
		}
    }

	private float spineUpDownRotation {
		get {
			return -upDownRotation / 2;
		}
	}
	
	void Update () {
		if ( !playerController.mouseLookIsEnabled ) {
			return;
		}

		float leftRightRotation = Input.GetAxis("Mouse X") * mouseSensitivity;
		playerController.characterController.transform.Rotate( 0, leftRightRotation, 0 );
        
		upDownRotation -= Input.GetAxis("Mouse Y") * mouseSensitivity;
		upDownRotation  = Mathf.Clamp( upDownRotation, minUpDownRotation, maxUpDownRotation );
        
		playerController.playerCamera.transform.localRotation = Quaternion.Euler( upDownRotation, 0, 0 );
	}

	void LateUpdate () {
		spineTransform.localRotation = Quaternion.Euler( 0, 0, spineUpDownRotation );
	}

}

The player has a photonView attached to it - of course - but I'm unable to serialize the spine bone rotation for some reason. This is what I've tried:
using UnityEngine;
using System.Collections;

public class NetworkPlayerController : Photon.MonoBehaviour {

	private Animator playerAnimator;
	private MouseLookController mouseLookController;

	private Vector3    realPosition = Vector3.zero;
	private Quaternion realRotation = Quaternion.identity;

	void Awake () {
		playerAnimator = GetComponent<Animator>();
		mouseLookController = GetComponent<MouseLookController>();
	}

	void Start () {
	}

	void Update () {
		if ( !photonView.isMine ) {
			transform.position = Vector3.Lerp( transform.position, realPosition, 0.1f );
			transform.rotation = Quaternion.Lerp( transform.rotation, realRotation, 0.1f );
		}
	}

	void OnPhotonSerializeView ( PhotonStream stream, PhotonMessageInfo info ) {

		// Our player?
		if ( stream.isWriting ) {
			stream.SendNext( transform.position );
			stream.SendNext( transform.rotation );
			stream.SendNext( playerAnimator.GetFloat("Speed") );
			stream.SendNext( mouseLookController.spineTransform.localRotation );
		}
		else {
			realPosition = (Vector3)stream.ReceiveNext();
			realRotation = (Quaternion)stream.ReceiveNext();
			playerAnimator.SetFloat( "Speed", (float)stream.ReceiveNext() );
			mouseLookController.spineTransform.localRotation = (Quaternion)stream.ReceiveNext();
		}

	}

}

Any ideas why this shouldn't work?

Thanks in advance!

Comments

  • vadim
    Options
    Log values before serialization and after deserialization to make sure that you serialize proper thing.
    If mouseLookController.spineTransform.localRotation is what you need and it set properly on deserialization then ensure that you do not override it somewhere else after deserialization.
    Debug first without interpolation and add it later.