온라인 구현
This commit is contained in:
@@ -0,0 +1,194 @@
|
||||
// ----------------------------------------------------------------------------
|
||||
// <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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user