123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- // ----------------------------------------------------------------------------
- // <copyright file="PhotonTransformView.cs" company="Exit Games GmbH">
- // PhotonNetwork Framework for Unity - Copyright (C) 2018 Exit Games GmbH
- // </copyright>
- // <summary>
- // Component to synchronize Transforms via PUN PhotonView.
- // </summary>
- // <author>developer@exitgames.com</author>
- // ----------------------------------------------------------------------------
- namespace Photon.Pun
- {
- using UnityEngine;
- [AddComponentMenu("Photon Networking/Photon Transform View")]
- [HelpURL("https://doc.photonengine.com/en-us/pun/v2/gameplay/synchronization-and-state")]
- public class PhotonTransformView : MonoBehaviourPun, IPunObservable
- {
- private float m_Distance;
- private float m_Angle;
- private Vector3 m_Direction;
- private Vector3 m_NetworkPosition;
- private Vector3 m_StoredPosition;
- private Quaternion m_NetworkRotation;
- public bool m_SynchronizePosition = true;
- public bool m_SynchronizeRotation = true;
- public bool m_SynchronizeScale = false;
- [Tooltip("Indicates if localPosition and localRotation should be used. Scale ignores this setting, and always uses localScale to avoid issues with lossyScale.")]
- public bool m_UseLocal;
- bool m_firstTake = false;
- public void Awake()
- {
- m_StoredPosition = transform.localPosition;
- m_NetworkPosition = Vector3.zero;
- m_NetworkRotation = Quaternion.identity;
- }
- private void Reset()
- {
- // Only default to true with new instances. useLocal will remain false for old projects that are updating PUN.
- m_UseLocal = true;
- }
- void OnEnable()
- {
- m_firstTake = true;
- }
- public void Update()
- {
- var tr = transform;
- if (!this.photonView.IsMine)
- {
- if (m_UseLocal)
- {
- tr.localPosition = Vector3.MoveTowards(tr.localPosition, this.m_NetworkPosition, this.m_Distance * Time.deltaTime * PhotonNetwork.SerializationRate);
- tr.localRotation = Quaternion.RotateTowards(tr.localRotation, this.m_NetworkRotation, this.m_Angle * Time.deltaTime * PhotonNetwork.SerializationRate);
- }
- else
- {
- tr.position = Vector3.MoveTowards(tr.position, this.m_NetworkPosition, this.m_Distance * Time.deltaTime * PhotonNetwork.SerializationRate);
- tr.rotation = Quaternion.RotateTowards(tr.rotation, this.m_NetworkRotation, this.m_Angle * Time.deltaTime * PhotonNetwork.SerializationRate);
- }
- }
- }
- public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
- {
- var tr = transform;
- // Write
- if (stream.IsWriting)
- {
- if (this.m_SynchronizePosition)
- {
- if (m_UseLocal)
- {
- this.m_Direction = tr.localPosition - this.m_StoredPosition;
- this.m_StoredPosition = tr.localPosition;
- stream.SendNext(tr.localPosition);
- stream.SendNext(this.m_Direction);
- }
- else
- {
- this.m_Direction = tr.position - this.m_StoredPosition;
- this.m_StoredPosition = tr.position;
- stream.SendNext(tr.position);
- stream.SendNext(this.m_Direction);
- }
- }
- if (this.m_SynchronizeRotation)
- {
- if (m_UseLocal)
- {
- stream.SendNext(tr.localRotation);
- }
- else
- {
- stream.SendNext(tr.rotation);
- }
- }
- if (this.m_SynchronizeScale)
- {
- stream.SendNext(tr.localScale);
- }
- }
- // Read
- else
- {
- if (this.m_SynchronizePosition)
- {
- this.m_NetworkPosition = (Vector3)stream.ReceiveNext();
- this.m_Direction = (Vector3)stream.ReceiveNext();
- if (m_firstTake)
- {
- if (m_UseLocal)
- tr.localPosition = this.m_NetworkPosition;
- else
- tr.position = this.m_NetworkPosition;
- this.m_Distance = 0f;
- }
- else
- {
- float lag = Mathf.Abs((float)(PhotonNetwork.Time - info.SentServerTime));
- this.m_NetworkPosition += this.m_Direction * lag;
- if (m_UseLocal)
- {
- this.m_Distance = Vector3.Distance(tr.localPosition, this.m_NetworkPosition);
- }
- else
- {
- this.m_Distance = Vector3.Distance(tr.position, this.m_NetworkPosition);
- }
- }
- }
- if (this.m_SynchronizeRotation)
- {
- this.m_NetworkRotation = (Quaternion)stream.ReceiveNext();
- if (m_firstTake)
- {
- this.m_Angle = 0f;
- if (m_UseLocal)
- {
- tr.localRotation = this.m_NetworkRotation;
- }
- else
- {
- tr.rotation = this.m_NetworkRotation;
- }
- }
- else
- {
- if (m_UseLocal)
- {
- this.m_Angle = Quaternion.Angle(tr.localRotation, this.m_NetworkRotation);
- }
- else
- {
- this.m_Angle = Quaternion.Angle(tr.rotation, this.m_NetworkRotation);
- }
- }
- }
- if (this.m_SynchronizeScale)
- {
- tr.localScale = (Vector3)stream.ReceiveNext();
- }
- if (m_firstTake)
- {
- m_firstTake = false;
- }
- }
- }
- }
- }
|